1+ from collections import deque
2+
13class MinHeap :
24 def __init__ (self , arr = []):
3- if len (arr ) > 0 :
4- self .heap = self .heapify (arr )
5- else :
6- self .heap = []
7-
5+ self .heap = deque ()
86 self .size = 0
7+ if len (arr ) > 0 :
8+ self .heapify (arr )
99
1010 def getMin (self ):
11- if self .size > 0
12- ret = self .heap [0 ] #[1]
13- self .heap [0 ] = self .heap [- 1 ] #[1]
14- self .heap .pop () #[]
11+ if self .size > 0 :
12+ ret = self .heap .popleft ()
1513 self .size -= 1
16- self .bubbleDown () #[]
14+ if self .size > 0 :
15+ self .heap .appendleft (self .heap .pop ())
16+ self .bubbleDown ()
1717 return ret
1818
1919 def peek (self ):
20- if self .size > 0
20+ if self .size > 0 :
2121 return self .heap [0 ]
2222
2323 def push (self , val ):
24+ self .size += 1
2425 self .heap .append (val )
2526 self .bubbleUp ()
26- self .size += 1
2727
2828 def heapify (self , arr ):
29- # TODO
30- return
31-
32- def size (self ):
33- return self .size
29+ for item in arr :
30+ self .push (item )
3431
3532 def isEmpty (self ):
3633 return self .size == 0
3734
3835 def bubbleDown (self ):
39- # TODO
40- return
36+ if self .size > 0 :
37+ i = 0
38+ h = self .heap
39+ withinBounds = 2 * i + 2 < self .size
40+ while withinBounds and (h [i ] > h [2 * i + 1 ] or h [i ] > h [2 * i + 2 ]):
41+ if h [i ] > h [2 * i + 1 ] and h [i ] > h [2 * i + 2 ]:
42+ if h [2 * i + 1 ] < h [2 * i + 2 ]:
43+ h [i ], h [2 * i + 1 ] = h [2 * i + 1 ], h [i ]
44+ i = 2 * i + 1
45+ else :
46+ h [i ], h [2 * i + 2 ] = h [2 * i + 2 ], h [i ]
47+ i = 2 * i + 2
48+ elif h [i ] > h [2 * i + 1 ]:
49+ h [i ], h [2 * i + 1 ] = h [2 * i + 1 ], h [i ]
50+ i = 2 * i + 1
51+ elif h [i ] > h [2 * i + 2 ]:
52+ h [i ], h [2 * i + 2 ] = h [2 * i + 2 ], h [i ]
53+ i = 2 * i + 2
54+ withinBounds = 2 * i + 2 < self .size
55+
56+ if 2 * i + 1 < self .size and h [i ] > h [2 * i + 1 ]:
57+ h [i ], h [2 * i + 1 ] = h [2 * i + 1 ], h [i ]
58+ elif 2 * i + 2 < self .size and h [i ] > h [2 * i + 2 ]:
59+ h [i ], h [2 * i + 2 ] = h [2 * i + 2 ], h [i ]
4160
4261 def bubbleUp (self ):
43- # TODO
44- return
62+ if self .size > 0 :
63+ i = self .size - 1
64+ h = self .heap
65+ withinBounds = i / 2 >= 0
66+ while withinBounds and (h [i ] < h [i / 2 ]):
67+ h [i / 2 ], h [i ] = h [i ], h [i / 2 ]
68+ i /= 2
69+ withinBounds = i / 2 >= 0
4570
4671def testPush ():
4772 h = MinHeap ()
@@ -61,34 +86,35 @@ def testPush():
6186 assert h .heap [0 ] == - 1
6287
6388def testHeapify ():
64- # heap1 = MinHeap([1, 2, 3, 4, 5])
65- # heap2 = MinHeap([])
66- # heap3 = MinHeap([5, 4, 3, 2, 1])
67- # heap4 = MinHeap([3, 1])
68- # heap5 = MinHeap([0, -1, 1, -2, 2])
69- # assert isMinHeap(heap1)
70- # assert isMinHeap(heap2)
71- # assert isMinHeap(heap3)
72- # assert isMinHeap(heap4)
73- # assert isMinHeap(heap5)
89+ # TODO
7490 assert True
7591
7692def testGetMin ():
7793 heap = MinHeap ([2 , 5 , 20 ])
7894 assert heap .getMin () == 2
7995 assert heap .getMin () == 5
96+ assert heap .getMin () == 20
8097
8198 heap1 = MinHeap ([1 , 2 , 3 , 4 , 5 ])
8299 assert heap1 .getMin () == 1
83100 assert heap1 .getMin () == 2
101+ assert heap1 .getMin () == 3
102+ assert heap1 .getMin () == 4
103+ assert heap1 .getMin () == 5
84104
85105 heap2 = MinHeap ([5 , 4 , 3 , 2 , 1 ])
86106 assert heap2 .getMin () == 1
87107 assert heap2 .getMin () == 2
108+ assert heap2 .getMin () == 3
109+ assert heap2 .getMin () == 4
110+ assert heap2 .getMin () == 5
88111
89112 heap3 = MinHeap ([2 , 5 , 3 , 7 , - 1 ])
90113 assert heap3 .getMin () == - 1
91114 assert heap3 .getMin () == 2
115+ assert heap3 .getMin () == 3
116+ assert heap3 .getMin () == 5
117+ assert heap3 .getMin () == 7
92118
93119def testPeek ():
94120 heap = MinHeap ([2 , 5 , 20 ])
@@ -109,26 +135,39 @@ def testPeek():
109135
110136def testSize ():
111137 heap = MinHeap ()
112- assert heap .size () == 0
138+ assert heap .size == 0
113139
114140 heap2 = MinHeap ([1 ])
115- assert heap .size () == 1
141+ assert heap2 .size == 1
116142
117143 heap3 = MinHeap ([1 , 2 , 3 , 4 ])
118- assert heap .size () == 4
144+ assert heap3 .size == 4
119145
120146def testIsEmpty ():
121147 heap = MinHeap ()
122148 assert heap .isEmpty ()
123149
124150 heap2 = MinHeap ([1 ])
125- assert not heap .isEmpty ()
151+ assert not heap2 .isEmpty ()
126152
127153 heap3 = MinHeap ([1 , 2 , 3 ])
128- assert not heap .isEmpty ()
154+ assert not heap3 .isEmpty ()
129155
130156def testEverything ():
131- assert True
157+ heap = MinHeap ([1 , 2 , 3 , 4 , - 1 , - 2 , - 7 , 6 , - 3 , - 1 , - 1 ])
158+ assert not heap .isEmpty ()
159+ assert heap .size == 11
160+ assert heap .peek () == - 7
161+ assert heap .getMin () == - 7
162+ assert heap .getMin () == - 3
163+
164+ heap .push (- 10 )
165+ assert heap .peek () == - 10
166+ assert heap .size == 10
167+ assert heap .getMin () == - 10
168+ assert heap .getMin () == - 2
169+ assert heap .getMin () == - 1
170+ assert heap .getMin () == - 1
132171
133172def tests ():
134173 testPush ()
0 commit comments