algo_rs/data_structure/heap/
min_binary_heap.rs1use crate::data_structure::heap::Heap;
2
3pub struct MinBinaryHeap<T: PartialOrd> {
4 inner: Vec<T>,
5}
6
7impl<T: PartialOrd> MinBinaryHeap<T> {
8 pub fn new() -> Self {
9 Self {
10 inner: Vec::<T>::new(),
11 }
12 }
13
14 pub fn with_capacity(size: usize) -> Self {
15 Self {
16 inner: Vec::<T>::with_capacity(size),
17 }
18 }
19
20 fn sift_down(&mut self) {
21 let size = self.inner.len();
22 let mut current = 0usize;
23 let mut running = true;
24
25 while running {
26 let left = current * 2 + 1;
27 let right = current * 2 + 2;
28 running = false;
29 if right < size && self.inner[left].gt(&self.inner[right]) {
30 if self.inner[current].gt(&self.inner[right]) {
31 self.inner.swap(current, right);
32 current = right;
33 running = true;
34 }
35 } else if left < size {
36 if self.inner[current].gt(&self.inner[left]) {
37 self.inner.swap(current, left);
38 current = left;
39 running = true;
40 }
41 }
42 }
43 }
44
45 fn sift_up(&mut self) {
46 let mut current = self.inner.len() - 1;
47
48 while current > 0 {
49 let parent = (current - 1) / 2;
50 if self.inner[parent].gt(&self.inner[current]) {
51 self.inner.swap(parent, current);
52 } else {
53 break;
54 }
55
56 current = parent;
57 }
58 }
59}
60
61impl<T: PartialOrd> Heap<T> for MinBinaryHeap<T> {
62 fn push(&mut self, item: T) {
63 self.inner.push(item);
64 self.sift_up();
65 }
66
67 fn pop(&mut self) -> Option<T> {
68 if self.inner.is_empty() {
69 return None;
70 }
71
72 let last = self.inner.len() - 1;
73 self.inner.swap(0, last);
74 let result = self.inner.pop();
75 self.sift_down();
76 result
77 }
78
79 fn is_empty(&self) -> bool {
80 self.inner.is_empty()
81 }
82
83 fn peek(&self) -> Option<&T> {
84 return self.inner.first();
85 }
86}
87
88#[cfg(test)]
89mod tests {
90 use crate::data_structure::heap::min_binary_heap::MinBinaryHeap;
91 use crate::data_structure::heap::Heap;
92 extern crate test;
93
94 #[test]
95 fn test_push_pop() {
96 let mut heap = MinBinaryHeap::new();
97 heap.push(3);
98 heap.push(2);
99 heap.push(1);
100 assert_eq!(Some(1), heap.pop());
101 assert_eq!(Some(2), heap.pop());
102 assert_eq!(Some(3), heap.pop());
103 assert_eq!(None, heap.pop());
104 }
105
106 #[test]
107 fn test_is_empty() {
108 let mut heap = MinBinaryHeap::new();
109 assert_eq!(true, heap.is_empty());
110 heap.push(3);
111 assert_eq!(false, heap.is_empty());
112 heap.pop();
113 assert_eq!(true, heap.is_empty());
114 }
115
116 #[test]
117 fn test_peek() {
118 let mut heap = MinBinaryHeap::new();
119 assert_eq!(None, heap.peek());
120 heap.push(3);
121 assert_eq!(Some(&3), heap.peek());
122 heap.pop();
123 assert_eq!(None, heap.peek());
124 }
125}