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 .size = len (arr )
9+ self .heapify (arr )
910
11+ # runtime: O(logn) aka the height of the heap
1012 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 () #[]
13+ if self .size > 0 :
14+ ret = self .heap .popleft ()
1515 self .size -= 1
16- self .bubbleDown () #[]
16+ if self .size > 0 :
17+ self .heap .appendleft (self .heap .pop ())
18+ self .bubbleDown (0 )
1719 return ret
1820
21+ # runtime: O(1)
1922 def peek (self ):
20- if self .size > 0
23+ if self .size > 0 :
2124 return self .heap [0 ]
2225
26+ # runtime: O(logn) aka the height of the heap
2327 def push (self , val ):
28+ self .size += 1
2429 self .heap .append (val )
2530 self .bubbleUp ()
26- self .size += 1
2731
32+ # runtime: O(nlogn)
2833 def heapify (self , arr ):
29- # TODO
30- return
31-
32- def size (self ):
33- return self .size
34+ self .heap = deque (arr )
35+ for i in xrange (self .size - 1 , - 1 , - 1 ):
36+ self .bubbleDown (i )
3437
38+ # runtime: O(1)
3539 def isEmpty (self ):
3640 return self .size == 0
3741
38- def bubbleDown (self ):
39- # TODO
40- return
42+ def bubbleDown (self , index ):
43+ if self .size > 0 :
44+ i = index
45+ h = self .heap
46+ withinBounds = 2 * i + 2 < self .size
47+ while withinBounds and (h [i ] > h [2 * i + 1 ] or h [i ] > h [2 * i + 2 ]):
48+ if h [i ] > h [2 * i + 1 ] and h [i ] > h [2 * i + 2 ]:
49+ if h [2 * i + 1 ] < h [2 * i + 2 ]:
50+ h [i ], h [2 * i + 1 ] = h [2 * i + 1 ], h [i ]
51+ i = 2 * i + 1
52+ else :
53+ h [i ], h [2 * i + 2 ] = h [2 * i + 2 ], h [i ]
54+ i = 2 * i + 2
55+ elif h [i ] > h [2 * i + 1 ]:
56+ h [i ], h [2 * i + 1 ] = h [2 * i + 1 ], h [i ]
57+ i = 2 * i + 1
58+ elif h [i ] > h [2 * i + 2 ]:
59+ h [i ], h [2 * i + 2 ] = h [2 * i + 2 ], h [i ]
60+ i = 2 * i + 2
61+ withinBounds = 2 * i + 2 < self .size
62+
63+ if 2 * i + 1 < self .size and h [i ] > h [2 * i + 1 ]:
64+ h [i ], h [2 * i + 1 ] = h [2 * i + 1 ], h [i ]
65+ elif 2 * i + 2 < self .size and h [i ] > h [2 * i + 2 ]:
66+ h [i ], h [2 * i + 2 ] = h [2 * i + 2 ], h [i ]
4167
4268 def bubbleUp (self ):
43- # TODO
44- return
69+ if self .size > 0 :
70+ i = self .size - 1
71+ h = self .heap
72+ withinBounds = i / 2 >= 0
73+ while withinBounds and (h [i ] < h [i / 2 ]):
74+ h [i / 2 ], h [i ] = h [i ], h [i / 2 ]
75+ i /= 2
76+ withinBounds = i / 2 >= 0
4577
4678def testPush ():
4779 h = MinHeap ()
@@ -61,34 +93,35 @@ def testPush():
6193 assert h .heap [0 ] == - 1
6294
6395def 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)
96+ # TODO
7497 assert True
7598
7699def testGetMin ():
77100 heap = MinHeap ([2 , 5 , 20 ])
78101 assert heap .getMin () == 2
79102 assert heap .getMin () == 5
103+ assert heap .getMin () == 20
80104
81105 heap1 = MinHeap ([1 , 2 , 3 , 4 , 5 ])
82106 assert heap1 .getMin () == 1
83107 assert heap1 .getMin () == 2
108+ assert heap1 .getMin () == 3
109+ assert heap1 .getMin () == 4
110+ assert heap1 .getMin () == 5
84111
85112 heap2 = MinHeap ([5 , 4 , 3 , 2 , 1 ])
86113 assert heap2 .getMin () == 1
87114 assert heap2 .getMin () == 2
115+ assert heap2 .getMin () == 3
116+ assert heap2 .getMin () == 4
117+ assert heap2 .getMin () == 5
88118
89119 heap3 = MinHeap ([2 , 5 , 3 , 7 , - 1 ])
90120 assert heap3 .getMin () == - 1
91121 assert heap3 .getMin () == 2
122+ assert heap3 .getMin () == 3
123+ assert heap3 .getMin () == 5
124+ assert heap3 .getMin () == 7
92125
93126def testPeek ():
94127 heap = MinHeap ([2 , 5 , 20 ])
@@ -109,26 +142,39 @@ def testPeek():
109142
110143def testSize ():
111144 heap = MinHeap ()
112- assert heap .size () == 0
145+ assert heap .size == 0
113146
114147 heap2 = MinHeap ([1 ])
115- assert heap .size () == 1
148+ assert heap2 .size == 1
116149
117150 heap3 = MinHeap ([1 , 2 , 3 , 4 ])
118- assert heap .size () == 4
151+ assert heap3 .size == 4
119152
120153def testIsEmpty ():
121154 heap = MinHeap ()
122155 assert heap .isEmpty ()
123156
124157 heap2 = MinHeap ([1 ])
125- assert not heap .isEmpty ()
158+ assert not heap2 .isEmpty ()
126159
127160 heap3 = MinHeap ([1 , 2 , 3 ])
128- assert not heap .isEmpty ()
161+ assert not heap3 .isEmpty ()
129162
130163def testEverything ():
131- assert True
164+ heap = MinHeap ([1 , 2 , 3 , 4 , - 1 , - 2 , - 7 , 6 , - 3 , - 1 , - 1 ])
165+ assert not heap .isEmpty ()
166+ assert heap .size == 11
167+ assert heap .peek () == - 7
168+ assert heap .getMin () == - 7
169+ assert heap .getMin () == - 3
170+
171+ heap .push (- 10 )
172+ assert heap .peek () == - 10
173+ assert heap .size == 10
174+ assert heap .getMin () == - 10
175+ assert heap .getMin () == - 2
176+ assert heap .getMin () == - 1
177+ assert heap .getMin () == - 1
132178
133179def tests ():
134180 testPush ()
0 commit comments