algods/data_structure/tree_table.rs
1#[cfg(test)]
2mod unit_test;
3use std::cmp::Ordering;
4use std::collections::BTreeMap;
5
6/// Implementation a tree map with the standard library
7/// # Examples
8/// ```
9/// use algods::data_structure::BTreeTable;
10/// let mut bt = BTreeTable::new();
11/// assert_eq!(bt.len(), 0);
12/// bt.insert(0, "0");
13/// bt.insert(1, "1");
14/// bt.insert(2, "2");
15/// assert_eq!(bt.len(), 3);
16/// assert_eq!(bt.delete(&1), Some("1"));
17/// assert_eq!(bt.len(), 2);
18/// ```
19#[derive(Debug, Clone, Default)]
20pub struct BTreeTable<T, U> {
21 tree: BTreeMap<T, U>,
22}
23impl<T, U> BTreeTable<T, U> {
24 /// Tests whether or not the tree is empty.
25 /// # Example
26 /// ```
27 /// use algods::data_structure::BTreeTable;
28 /// let mut bt = BTreeTable::new();
29 /// bt.insert(1,1);
30 /// assert!(!bt.is_empty());
31 /// ```
32 pub fn is_empty(&self) -> bool {
33 self.len() == 0
34 }
35 /// Gives the number of (key, value) pairs in the tree.
36 /// # Example
37 /// ```
38 /// use algods::data_structure::BTreeTable;
39 /// let bt = BTreeTable::<usize, usize>::new();
40 /// assert_eq!(bt.len(),0);
41 /// ```
42 pub fn len(&self) -> usize {
43 self.tree.len()
44 }
45}
46impl<T: Ord, U> BTreeTable<T, U> {
47 /// Creates an empty tree instance.
48 /// # Example
49 /// ```
50 /// use algods::data_structure::BTreeTable;
51 /// let bt = BTreeTable::<usize, isize>::new();
52 /// assert_eq!(bt.len(), 0);
53 /// ```
54 pub fn new() -> Self {
55 Self {
56 tree: BTreeMap::<T, U>::new(),
57 }
58 }
59 /// Creates a new tree with an initial (key, value) pair.
60 /// # Example
61 /// ```
62 /// use algods::data_structure::BTreeTable;
63 /// let bt = BTreeTable::init("btree", 0);
64 /// assert_eq!(bt.len(), 1);
65 /// ```
66 pub fn init(key: T, value: U) -> Self {
67 let mut tree = Self::new();
68 tree.insert(key, value);
69 tree
70 }
71 /// Tests whether or not the tree contains a given key.
72 /// # Example
73 /// ```
74 /// use algods::data_structure::BTreeTable;
75 /// let bt = BTreeTable::init("btree", "one");
76 /// assert!(bt.contains(&"btree"));
77 /// ```
78 pub fn contains(&self, key: &T) -> bool {
79 self.tree.get(key).is_some()
80 }
81 /// Returns a reference of the value associated to a key if any exists in the tree.
82 /// Returns `None` otherwise.
83 /// # Example
84 /// ```
85 /// use algods::data_structure::BTreeTable;
86 /// let bt = BTreeTable::init("btree", "one");
87 /// assert_eq!(bt.get(&"no btree"), None);
88 /// assert_eq!(bt.get(&"btree"), Some(&"one"));
89 /// ```
90 pub fn get(&self, key: &T) -> Option<&U> {
91 self.tree.get(key)
92 }
93 /// Inserts a (key, value) pair in the tree.
94 /// # Example
95 /// ```
96 /// use algods::data_structure::BTreeTable;
97 /// let mut bt = BTreeTable::<isize, usize>::new();
98 /// bt.insert(-1, 2);
99 /// bt.insert(-2, 3);
100 /// assert_eq!(bt.get(&-2), Some(&3));
101 /// assert_eq!(bt.len(), 2);
102 /// ```
103 pub fn insert(&mut self, key: T, value: U) {
104 self.tree.insert(key, value);
105 }
106 ///
107 /// Removes a key from the tree, returning the value assiociated if any.
108 /// Otherwise it returns `None`.
109 /// # Example
110 /// ```
111 /// use algods::data_structure::BTreeTable;
112 /// let mut bt = BTreeTable::init(1, 2);
113 /// assert_eq!(bt.delete(&1), Some(2));
114 /// assert_eq!(bt.delete(&10), None);
115 /// ```
116 pub fn delete(&mut self, key: &T) -> Option<U> {
117 self.tree.remove(key)
118 }
119}
120impl<T: Ord, U: Ord> BTreeTable<T, U> {
121 /// Returns for the largest key in the tree strictly inferior.
122 /// # Example
123 /// ```
124 /// use algods::data_structure::BTreeTable;
125 /// let mut bt = BTreeTable::<isize, usize>::init(1, 0);
126 /// bt.insert(-1, 2);
127 /// bt.insert(-2, 3);
128 /// assert_eq!(bt.strict_floor(&1), Some(&-1));
129 /// assert_eq!(bt.strict_floor(&-2), None);
130 pub fn strict_floor(&self, key: &T) -> Option<&T> {
131 // the largest key in the tree map, strictly inferior to key
132 let res = self.tree.range(..key).max();
133 if let Some(item) = res {
134 Some(item.0)
135 } else {
136 None
137 }
138 }
139 /// Returns the smallest key larger or equal to the given key.
140 /// # Example
141 /// ```
142 /// use algods::data_structure::BTreeTable;
143 /// let mut bt = BTreeTable::<isize, usize>::init(1, 0);
144 /// bt.insert(-1, 2);
145 /// bt.insert(-2, 3);
146 /// assert_eq!(bt.ceil(&1), Some(&1));
147 /// assert_eq!(bt.ceil(&-1), Some(&-1));
148 /// assert_eq!(bt.ceil(&2), None);
149 /// ```
150 pub fn ceil(&self, key: &T) -> Option<&T> {
151 // the smallest key in the tree map larger ot equal to key
152 let res = self.tree.range(key..).min();
153 if let Some(item) = res {
154 Some(item.0)
155 } else {
156 None
157 }
158 }
159 /// Returns the list of keys in the tree that are between two keys (low included, high excluded).
160 /// # Example
161 /// ```
162 /// use algods::data_structure::BTreeTable;
163 /// let mut bt = BTreeTable::<isize, usize>::init(1, 0);
164 /// bt.insert(-1, 2);
165 /// bt.insert(-2, 2);
166 /// bt.insert(-3, 3);
167 /// assert_eq!(bt.range_search(&-2, &1), vec![&-2, &-1]);
168 /// ```
169 pub fn range_search(&self, low: &T, high: &T) -> Vec<&T> {
170 // returns the keys between low (included) and high (excluded)
171 self.tree
172 .range(low..high)
173 .into_iter()
174 .map(|item| item.0)
175 .collect::<Vec<&T>>()
176 }
177 /// Returns the number of keys in the tree that are between two keys (low included, high excluded).
178 /// # Example
179 /// ```
180 /// use algods::data_structure::BTreeTable;
181 /// let mut bt = BTreeTable::<isize, usize>::init(1, 0);
182 /// bt.insert(-1, 2);
183 /// bt.insert(-2, 2);
184 /// bt.insert(-3, 3);
185 /// assert_eq!(bt.range_count(&-3, &-1), 2);
186 /// ```
187 pub fn range_count(&self, low: &T, high: &T) -> usize {
188 // counts the keys between low (included) and high (excluded)
189 self.range_search(low, high).len()
190 }
191}
192
193#[derive(Clone, Debug, PartialEq)]
194struct Node<T, U> {
195 key: T,
196 value: U,
197 left: Option<Box<Node<T, U>>>,
198 right: Option<Box<Node<T, U>>>,
199}
200impl<T, U> Node<T, U> {
201 pub fn init(_key: T, _value: U) -> Self {
202 Self {
203 key: _key,
204 value: _value,
205 left: None,
206 right: None,
207 }
208 }
209}
210
211/// Implementation of a binary search tree
212/// # Example
213/// ```
214/// use algods::data_structure::BSearchTree;
215/// let mut bt = BSearchTree::new();
216/// bt.insert(0,"1");
217/// bt.insert(1,"2");
218/// bt.insert(2,"3");
219/// assert_eq!(bt.len(), 3);
220/// assert!(bt.contains(&0));
221/// assert_eq!(bt.get(&2), Some(&"3"));
222/// ```
223#[derive(Debug, Clone)]
224pub struct BSearchTree<T, U> {
225 root: Option<Box<Node<T, U>>>,
226 len: usize,
227}
228impl<T, U> Default for BSearchTree<T, U> {
229 fn default() -> Self {
230 Self::new()
231 }
232}
233impl<T, U> BSearchTree<T, U> {
234 /// Creates an empty tree instance.
235 /// # Example
236 /// ```
237 /// use algods::data_structure::BSearchTree;
238 /// let bt = BSearchTree::<usize, isize>::new();
239 /// assert_eq!(bt.len(), 0);
240 /// ```
241 pub fn new() -> Self {
242 Self { root: None, len: 0 }
243 }
244 /// Creates a new tree with an initial (key, value) pair.
245 /// # Example
246 /// ```
247 /// use algods::data_structure::BSearchTree;
248 /// let bt = BSearchTree::init("btree", 0);
249 /// assert_eq!(bt.len(), 1);
250 /// ```
251 pub fn init(key: T, value: U) -> Self {
252 Self {
253 root: Some(Box::new(Node::init(key, value))),
254 len: 1,
255 }
256 }
257 /// Gives the number of (key, value) pairs in the tree.
258 /// # Example
259 /// ```
260 /// use algods::data_structure::BSearchTree;
261 /// let bt = BSearchTree::<usize, usize>::new();
262 /// assert_eq!(bt.len(),0);
263 /// ```
264 pub fn len(&self) -> usize {
265 self.len
266 }
267 /// Tests whether or not the tree is empty.
268 /// # Example
269 /// ```
270 /// use algods::data_structure::BSearchTree;
271 /// let mut bt = BSearchTree::new();
272 /// bt.insert(1,1);
273 /// assert!(!bt.is_empty());
274 /// ```
275 pub fn is_empty(&self) -> bool {
276 self.len() == 0
277 }
278}
279impl<T: Eq + Ord, U: Eq> BSearchTree<T, U> {
280 /// Tests whether or not the tree contains a given key.
281 /// # Example
282 /// ```
283 /// use algods::data_structure::BSearchTree;
284 /// let bt = BSearchTree::init("btree", "one");
285 /// assert!(bt.contains(&"btree"));
286 /// ```
287 pub fn contains(&self, key: &T) -> bool {
288 self.get(key).is_some()
289 }
290 /// Returns a reference of the value associated to a key if any exists in the tree.
291 /// Returns `None` otherwise.
292 /// # Example
293 /// ```
294 /// use algods::data_structure::BSearchTree;
295 /// let bt = BSearchTree::init("btree", "one");
296 /// assert_eq!(bt.get(&"no btree"), None);
297 /// assert_eq!(bt.get(&"btree"), Some(&"one"));
298 /// ```
299 pub fn get(&self, key: &T) -> Option<&U> {
300 // gets the value associated to key if key is in
301 // the tree, otherwise returns None,
302 // run time complexity on average O(log(N)), O(N) guaranteed (unbalanced tree)
303 let mut node = &self.root;
304 while node.is_some() {
305 let temp_node = node.as_ref().unwrap();
306 match key.cmp(&temp_node.key) {
307 Ordering::Less => node = &temp_node.left,
308 Ordering::Greater => node = &temp_node.right,
309 Ordering::Equal => return Some(&temp_node.value),
310 }
311 }
312 None
313 }
314}
315impl<T: Ord, U> BSearchTree<T, U> {
316 fn put(node: &mut Option<Box<Node<T, U>>>, key: T, value: U) -> Option<&U> {
317 match node {
318 None => *node = Some(Box::new(Node::init(key, value))),
319 Some(ref mut nod) => match key.cmp(&nod.key) {
320 Ordering::Less => {
321 return Self::put(&mut nod.left, key, value);
322 }
323 Ordering::Greater => {
324 return Self::put(&mut nod.right, key, value);
325 }
326 Ordering::Equal => {
327 nod.value = value;
328 return Some(&nod.value);
329 }
330 },
331 }
332 None
333 }
334 /// Inserts a (key, value) pair in the tree.
335 /// # Example
336 /// ```
337 /// use algods::data_structure::BSearchTree;
338 /// let mut bt = BSearchTree::<isize, usize>::new();
339 /// bt.insert(-1, 2);
340 /// bt.insert(-2, 3);
341 /// bt.insert(-1, 4);
342 /// assert_eq!(bt.len(), 2);
343 /// assert_eq!(bt.get(&-2), Some(&3));
344 /// ```
345 pub fn insert(&mut self, key: T, value: U) {
346 if Self::put(&mut self.root, key, value).is_none() {
347 self.len += 1;
348 }
349 }
350}
351impl<T: Eq + Ord, U: Ord> BSearchTree<T, U> {
352 /// Returns the smallest key in the tree.
353 /// # Example
354 /// ```
355 /// use algods::data_structure::BSearchTree;
356 /// let mut bt = BSearchTree::<isize, usize>::init(1, 0);
357 /// bt.insert(-1, 2);
358 /// assert_eq!(bt.min(), Some(&-1));
359 /// ```
360 pub fn min(&self) -> Option<&T> {
361 // finds the minimum key
362 let mut node = &self.root;
363 let mut result = None;
364 while node.is_some() {
365 // go to the left as long as you do not encounter
366 // a None Node
367 let temp_node = node.as_ref().unwrap();
368 result = Some(&temp_node.key);
369 node = &temp_node.left;
370 }
371 result
372 }
373 /// Returns the largest key in the tree.
374 /// # Example
375 /// ```
376 /// use algods::data_structure::BSearchTree;
377 /// let mut bt = BSearchTree::<isize, usize>::init(0, 0);
378 /// bt.insert(-1, 2);
379 /// assert_eq!(bt.max(), Some(&0));
380 /// ```
381 pub fn max(&self) -> Option<&T> {
382 // finds the maximum key
383 let mut node = &self.root;
384 let mut result = None;
385 while node.is_some() {
386 // go to the right as long as you do not encounter
387 // a None Node
388 let temp_node = node.as_ref().unwrap();
389 result = Some(&temp_node.key);
390 node = &temp_node.right;
391 }
392 result
393 }
394 fn recursive_floor<'a>(
395 node: &'a Option<Box<Node<T, U>>>,
396 key: &T,
397 ) -> &'a Option<Box<Node<T, U>>> {
398 if node.is_none() {
399 return &None;
400 }
401 let current_node = node.as_ref().unwrap();
402 if key == ¤t_node.key {
403 return node;
404 }
405 if key < ¤t_node.key {
406 return Self::recursive_floor(¤t_node.left, key);
407 }
408 let temp_node = Self::recursive_floor(¤t_node.right, key);
409 if temp_node.is_some() {
410 temp_node
411 } else {
412 node
413 }
414 }
415 /// Returns for the largest key in the tree smaller or equal to the input key.
416 /// # Example
417 /// ```
418 /// use algods::data_structure::BSearchTree;
419 /// let mut bt = BSearchTree::<isize, usize>::init(1, 0);
420 /// bt.insert(-1, 2);
421 /// bt.insert(-2, 3);
422 /// assert_eq!(bt.floor(&1), Some(&1));
423 /// assert_eq!(bt.floor(&0), Some(&-1));
424 /// ```
425 pub fn floor(&self, key: &T) -> Option<&T> {
426 // the largest key in the tree smaller or equal to key
427 // run time complexity O(log(N)) on average, O(N) (guaranteed)
428 let node = Self::recursive_floor(&self.root, key);
429 if node.is_none() {
430 return None;
431 }
432 return Some(&node.as_ref().unwrap().key);
433 }
434}
435
436/// Implementation of a tree map based on an ordered `Vec`.
437/// # Example
438/// ```
439/// use algods::data_structure::OrdVecTable;
440/// let mut table = OrdVecTable::new();
441/// table.insert(0,"1");
442/// table.insert(1,"2");
443/// table.insert(2,"3");
444/// assert_eq!(table.len(), 3);
445/// assert!(table.contains(&0));
446/// assert_eq!(table.get(&2), Some(&"3"));
447// ###########################################
448#[derive(Default, Clone, Debug)]
449pub struct OrdVecTable<T, U> {
450 // collection of key-value pair (no duplicate keys)
451 vec: Vec<Pair<T, Option<U>>>,
452}
453impl<T, U> OrdVecTable<T, U> {
454 /// Creates an empty tree instance.
455 /// # Example
456 /// ```
457 /// use algods::data_structure::OrdVecTable;
458 /// let tree = OrdVecTable::<usize, isize>::new();
459 /// assert_eq!(tree.len(), 0);
460 /// ```
461 pub fn new() -> Self {
462 Self { vec: Vec::new() }
463 }
464 /// Creates a new tree with an initial (key, value) pair.
465 /// # Example
466 /// ```
467 /// use algods::data_structure::OrdVecTable;
468 /// let table = OrdVecTable::init("table", 0);
469 /// assert_eq!(table.len(), 1);
470 /// ```
471 pub fn init(key: T, value: U) -> Self {
472 let mut symbol_table = Self::new();
473 symbol_table.vec.push(Pair::init(key, Some(value)));
474 symbol_table
475 }
476 /// Gives the number of (key, value) pairs in the tree.
477 /// # Example
478 /// ```
479 /// use algods::data_structure::OrdVecTable;
480 /// let table = OrdVecTable::<usize, usize>::new();
481 /// assert_eq!(table.len(), 0);
482 /// ```
483 pub fn len(&self) -> usize {
484 self.vec.len()
485 }
486 /// Tests whether or not the tree is empty.
487 /// # Example
488 /// ```
489 /// use algods::data_structure::OrdVecTable;
490 /// let mut table = OrdVecTable::new();
491 /// table.insert(1,1);
492 /// assert!(!table.is_empty());
493 /// ```
494 pub fn is_empty(&self) -> bool {
495 self.len() == 0
496 }
497 /// Returns the smallest key in the tree.
498 /// # Example
499 /// ```
500 /// use algods::data_structure::OrdVecTable;
501 /// let mut table = OrdVecTable::<isize, usize>::init(1, 0);
502 /// table.insert(-1, 2);
503 /// assert_eq!(table.min(), Some(&-1));
504 /// ```
505 pub fn min(&self) -> Option<&T> {
506 // smallest key O(1)
507 if self.is_empty() {
508 None
509 } else {
510 Some(self.vec[0].first())
511 }
512 }
513 /// Returns the largest key in the tree.
514 /// # Example
515 /// ```
516 /// use algods::data_structure::OrdVecTable;
517 /// let mut table = OrdVecTable::<isize, usize>::init(1, 0);
518 /// table.insert(-1, 2);
519 /// assert_eq!(table.max(), Some(&1));
520 /// ```
521 pub fn max(&self) -> Option<&T> {
522 // largest key O(1)
523 if self.vec.is_empty() {
524 None
525 } else {
526 Some(self.vec[self.vec.len() - 1].first())
527 }
528 }
529}
530impl<T: Ord + Clone, U: Eq> OrdVecTable<T, U> {
531 /// Tests whether or not the tree contains a given key.
532 /// # Example
533 /// ```
534 /// use algods::data_structure::OrdVecTable;
535 /// let table = OrdVecTable::init("table", "one");
536 /// assert!(table.contains(&"table"));
537 /// ```
538 pub fn contains(&self, key: &T) -> bool {
539 // run time complexity O(log(N))
540 self.get(key).is_some()
541 }
542 /// Returns a reference of the value associated to a key if any exists in the tree.
543 /// Returns `None` otherwise.
544 /// # Example
545 /// ```
546 /// use algods::data_structure::OrdVecTable;
547 /// let table = OrdVecTable::init("tree", "one");
548 /// assert_eq!(table.get(&"no tree"), None);
549 /// assert_eq!(table.get(&"tree"), Some(&"one"));
550 /// ```
551 pub fn get(&self, key: &T) -> Option<&U> {
552 // run time complexity O(log(N))
553 if let Ok(index) = self.vec.binary_search(&Pair::init(key.clone(), None)) {
554 return self.vec[index].second().as_ref();
555 } else {
556 None
557 }
558 }
559 /// Returns for the largest key in the tree smaller or equal to the input key.
560 /// # Example
561 /// ```
562 /// use algods::data_structure::OrdVecTable;
563 /// let mut table = OrdVecTable::<isize, usize>::init(1, 0);
564 /// table.insert(-1, 2);
565 /// table.insert(-2, 3);
566 /// assert_eq!(table.floor(&1), Some(&1));
567 /// assert_eq!(table.floor(&0), Some(&-1));
568 /// ```
569 pub fn floor(&self, key: &T) -> Option<&T> {
570 // largest key smaller or equal to key O(log(N))
571 if self.is_empty() {
572 None
573 } else {
574 let index = self.vec.binary_search(&Pair::init(key.clone(), None));
575 match index {
576 Ok(ind) => Some(self.vec[ind].first()),
577 Err(ind) => {
578 if ind > 0 {
579 Some(self.vec[ind - 1].first())
580 } else {
581 // all keys in the table are > keys
582 None
583 }
584 }
585 }
586 }
587 }
588 /// Returns for the smallest key in the tree larger or equal to the input key.
589 /// # Example
590 /// ```
591 /// use algods::data_structure::OrdVecTable;
592 /// let mut table = OrdVecTable::<isize, usize>::init(1, 0);
593 /// table.insert(-1, 2);
594 /// table.insert(-2, 3);
595 /// assert_eq!(table.ceil(&1), Some(&1));
596 /// assert_eq!(table.ceil(&2), None);
597 /// assert_eq!(table.ceil(&-3), Some(&-2));
598 /// ```
599 pub fn ceil(&self, key: &T) -> Option<&T> {
600 // smallest key larger or equal to key, O(log(N))
601 if self.is_empty() {
602 None
603 } else {
604 let index = self.vec.binary_search(&Pair::init(key.clone(), None));
605 match index {
606 Ok(ind) => Some(self.vec[ind].first()),
607 Err(ind) => {
608 if ind < self.vec.len() - 1 && ind > 0 {
609 Some(self.vec[ind + 1].first())
610 } else if ind == 0 {
611 // key is < to all keys
612 Some(self.vec[0].first())
613 } else {
614 // all keys in the table are < key
615 None
616 }
617 }
618 }
619 }
620 }
621}
622impl<T: Ord + Clone, U: Eq + Clone> OrdVecTable<T, U> {
623 fn put(&mut self, key: T, value: Option<U>) -> Option<U> {
624 // run time complexity O(N) due to insertion
625 let candidate = Pair::init(key.clone(), None);
626 let index = self.vec.binary_search(&candidate);
627 match index {
628 Ok(ind) => {
629 // key is found
630 let temp_val = self.vec[ind].second().as_ref().cloned();
631 let mut_val = self.vec[ind].second_mut();
632 *mut_val = value;
633 temp_val
634 }
635 Err(ind) => {
636 // index where to insert key to keep self.vec sorted
637 if ind < self.vec.len() {
638 self.vec.insert(ind, Pair::init(key, value));
639 } else {
640 self.vec.push(Pair::init(key, value))
641 }
642 None
643 }
644 }
645 }
646 /// Inserts a (key, value) pair in the tree.
647 /// # Example
648 /// ```
649 /// use algods::data_structure::OrdVecTable;
650 /// let mut table = OrdVecTable::<isize, usize>::new();
651 /// table.insert(-1, 2);
652 /// table.insert(-2, 3);
653 /// table.insert(-1, 4);
654 /// assert_eq!(table.len(), 2);
655 /// assert_eq!(table.get(&-2), Some(&3));
656 /// ```
657 pub fn insert(&mut self, key: T, value: U) {
658 // run time complexity O(N)
659 self.put(key, Some(value));
660 }
661 /// Deletes a key in the tree using a lazy implementation:
662 /// meaning that it replaces the value of the key by `None` if any.
663 /// # Example
664 /// ```
665 /// use algods::data_structure::OrdVecTable;
666 /// let mut table = OrdVecTable::<isize, usize>::new();
667 /// table.insert(-1, 2);
668 /// table.insert(-2, 3);
669 /// table.insert(-1, 4);
670 /// assert_eq!(table.delete(&-1), Some(4));
671 /// assert_eq!(table.delete(&0), None);
672 /// ```
673 pub fn delete(&mut self, key: &T) -> Option<U> {
674 // run time complexity O(N)
675 self.put(key.clone(), None) // lazy implementation
676 }
677}
678#[derive(Default, Clone, Debug)]
679struct Pair<T, U> {
680 tuple: (T, U),
681}
682impl<T, U> Pair<T, U> {
683 pub fn init(key: T, value: U) -> Self {
684 Self {
685 tuple: (key, value),
686 }
687 }
688 pub fn first(&self) -> &T {
689 &self.tuple.0
690 }
691
692 pub fn second(&self) -> &U {
693 &self.tuple.1
694 }
695 pub fn first_mut(&mut self) -> &mut T {
696 &mut self.tuple.0
697 }
698 pub fn second_mut(&mut self) -> &mut U {
699 &mut self.tuple.1
700 }
701}
702impl<T: Ord, U> Ord for Pair<T, U> {
703 fn cmp(&self, other: &Self) -> Ordering {
704 self.tuple.0.cmp(&other.tuple.0)
705 }
706}
707impl<T: Ord, U> PartialOrd for Pair<T, U> {
708 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
709 Some(self.tuple.0.cmp(&other.tuple.0))
710 }
711}
712impl<T: Ord, U> Eq for Pair<T, U> {}
713impl<T: Ord, U> PartialEq for Pair<T, U> {
714 fn eq(&self, other: &Self) -> bool {
715 self.tuple.0 == other.tuple.0
716 }
717}
718
719// ###############################################
720/// Implementation of a tree map based on an unordered `Vec`.
721/// # Example
722/// ```
723/// use algods::data_structure::UnordVecTable;
724/// let mut table = UnordVecTable::new();
725/// table.insert(0,"1");
726/// table.insert(1,"2");
727/// table.insert(2,"3");
728/// assert_eq!(table.len(), 3);
729/// assert!(table.contains(&0));
730/// assert_eq!(table.get(&2), Some(&"3"));
731#[derive(Default, Clone, Debug)]
732pub struct UnordVecTable<T, U> {
733 // collection of key-value pair (no duplicate keys)
734 vec: Vec<(T, Option<U>)>,
735}
736impl<T, U> UnordVecTable<T, U> {
737 /// Creates an empty tree instance.
738 /// # Example
739 /// ```
740 /// use algods::data_structure::UnordVecTable;
741 /// let tree = UnordVecTable::<usize, isize>::new();
742 /// assert_eq!(tree.len(), 0);
743 /// ```
744 pub fn new() -> Self {
745 Self { vec: Vec::new() }
746 }
747 /// Creates a new tree with an initial (key, value) pair.
748 /// # Example
749 /// ```
750 /// use algods::data_structure::UnordVecTable;
751 /// let table = UnordVecTable::init("table", 0);
752 /// assert_eq!(table.len(), 1);
753 /// ```
754 pub fn init(key: T, value: U) -> Self {
755 let mut symbol_table = Self::new();
756 symbol_table.vec.push((key, Some(value)));
757 symbol_table
758 }
759 /// Gives the number of (key, value) pairs in the tree.
760 /// # Example
761 /// ```
762 /// use algods::data_structure::UnordVecTable;
763 /// let table = UnordVecTable::<usize, usize>::new();
764 /// assert_eq!(table.len(), 0);
765 /// ```
766 pub fn len(&self) -> usize {
767 self.vec.len()
768 }
769 /// Tests whether or not the tree is empty.
770 /// # Example
771 /// ```
772 /// use algods::data_structure::UnordVecTable;
773 /// let mut table = UnordVecTable::new();
774 /// table.insert(1,1);
775 /// assert!(!table.is_empty());
776 /// ```
777 pub fn is_empty(&self) -> bool {
778 self.len() == 0
779 }
780}
781impl<T: Eq, U: Eq> UnordVecTable<T, U> {
782 /// Tests whether or not the tree contains a given key.
783 /// # Example
784 /// ```
785 /// use algods::data_structure::UnordVecTable;
786 /// let table = UnordVecTable::init("table", "one");
787 /// assert!(table.contains(&"table"));
788 /// ```
789 pub fn contains(&self, key: &T) -> bool {
790 // run time complexity O(N)
791 self.get(key).is_some()
792 // self.list.iter().any(|e| e.0 == key)
793 }
794}
795impl<T: Eq, U> UnordVecTable<T, U> {
796 /// Returns a reference of the value associated to a key if any exists in the tree.
797 /// Returns `None` otherwise.
798 /// # Example
799 /// ```
800 /// use algods::data_structure::UnordVecTable;
801 /// let table = UnordVecTable::init("tree", "one");
802 /// assert_eq!(table.get(&"no tree"), None);
803 /// assert_eq!(table.get(&"tree"), Some(&"one"));
804 /// ```
805 pub fn get(&self, key: &T) -> Option<&U> {
806 // run time complexity O(N)
807 for k in 0..self.vec.len() {
808 if &self.vec[k].0 == key {
809 return self.vec[k].1.as_ref();
810 }
811 }
812 None
813 }
814}
815impl<T: Eq, U: Clone> UnordVecTable<T, U> {
816 fn put(&mut self, key: T, value: Option<U>) -> Option<U> {
817 // run time complexity O(N)
818 let mut k = 0;
819 let mut val = None;
820 let length = self.vec.len();
821 while k < length {
822 if self.vec[k].0 == key {
823 val = self.vec[k].1.clone();
824 self.vec[k].1 = value.clone();
825 break;
826 }
827 k += 1;
828 }
829 if self.is_empty() || (k == length && value.is_some()) {
830 self.vec.push((key, value));
831 }
832 val
833 }
834 /// Inserts a (key, value) pair in the tree.
835 /// # Example
836 /// ```
837 /// use algods::data_structure::UnordVecTable;
838 /// let mut table = UnordVecTable::<isize, usize>::new();
839 /// table.insert(-1, 2);
840 /// table.insert(-2, 3);
841 /// table.insert(-1, 4);
842 /// assert_eq!(table.len(), 2);
843 /// assert_eq!(table.get(&-1), Some(&4));
844 /// ```
845 pub fn insert(&mut self, key: T, value: U) {
846 // run time complexity O(N)
847 self.put(key, Some(value));
848 }
849}
850impl<T: Eq + Clone, U: Clone> UnordVecTable<T, U> {
851 /// Deletes a key in the tree using a lazy implementation:
852 /// meaning that it replaces the value of the key by `None` if any.
853 /// # Example
854 /// ```
855 /// use algods::data_structure::UnordVecTable;
856 /// let mut table = UnordVecTable::<isize, usize>::new();
857 /// table.insert(-1, 2);
858 /// table.insert(-2, 3);
859 /// table.insert(-1, 4);
860 /// assert_eq!(table.delete(&-1), Some(4));
861 /// assert_eq!(table.delete(&0), None);
862 /// assert_eq!(table.len(), 2);
863 /// ```
864 pub fn delete(&mut self, key: &T) -> Option<U> {
865 // run time complexity O(N)
866 self.put(key.clone(), None) // lazy implementation
867 }
868}