Skip to content

Commit ef47d7d

Browse files
committed
Day 39: MinHeap - finish bubbleUp and bubbleDown
1 parent 6b004a5 commit ef47d7d

File tree

1 file changed

+76
-37
lines changed

1 file changed

+76
-37
lines changed

day38/heap.py

Lines changed: 76 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,72 @@
1+
from collections import deque
2+
13
class 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

4671
def testPush():
4772
h = MinHeap()
@@ -61,34 +86,35 @@ def testPush():
6186
assert h.heap[0] == -1
6287

6388
def 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

7692
def 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

93119
def testPeek():
94120
heap = MinHeap([2, 5, 20])
@@ -109,26 +135,39 @@ def testPeek():
109135

110136
def 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

120146
def 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

130156
def 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

133172
def tests():
134173
testPush()

0 commit comments

Comments
 (0)