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 == &current_node.key {
403            return node;
404        }
405        if key < &current_node.key {
406            return Self::recursive_floor(&current_node.left, key);
407        }
408        let temp_node = Self::recursive_floor(&current_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}