Skip to content

Commit ad4da1f

Browse files
authored
Create basic heaps
1 parent 36df546 commit ad4da1f

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

basic heaps

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
class MinHeap:
2+
def __init__(self):
3+
self.heap_list = [None]
4+
self.count = 0
5+
6+
def parent_idx(self, idx):
7+
return idx // 2
8+
9+
def left_child_idx(self, idx):
10+
return idx * 2
11+
12+
def right_child_idx(self, idx):
13+
return idx * 2 + 1
14+
15+
def child_present(self, idx):
16+
return self.left_child_idx(idx) <= self.count
17+
18+
def retrieve_min(self):
19+
if self.count == 0:
20+
print("No items in heap")
21+
return None
22+
23+
min = self.heap_list[1]
24+
self.heap_list[1] = self.heap_list[self.count]
25+
self.count -= 1
26+
self.heap_list.pop()
27+
self.heapify_down()
28+
return min
29+
30+
def add(self, element):
31+
self.count += 1
32+
self.heap_list.append(element)
33+
self.heapify_up()
34+
35+
36+
def get_smaller_child_idx(self, idx):
37+
if self.right_child_idx(idx) > self.count:
38+
return self.left_child_idx(idx)
39+
else:
40+
left_child = self.heap_list[self.left_child_idx(idx)]
41+
right_child = self.heap_list[self.right_child_idx(idx)]
42+
if left_child < right_child:
43+
return self.left_child_idx(idx)
44+
else:
45+
return self.right_child_idx(idx)
46+
47+
def heapify_up(self):
48+
idx = self.count
49+
swap_count = 0
50+
while self.parent_idx(idx) > 0:
51+
if self.heap_list[self.parent_idx(idx)] > self.heap_list[idx]:
52+
swap_count += 1
53+
tmp = self.heap_list[self.parent_idx(idx)]
54+
self.heap_list[self.parent_idx(idx)] = self.heap_list[idx]
55+
self.heap_list[idx] = tmp
56+
idx = self.parent_idx(idx)
57+
58+
element_count = len(self.heap_list)
59+
if element_count > 10000:
60+
print("Heap of {0} elements restored with {1} swaps"
61+
.format(element_count, swap_count))
62+
print("")
63+
64+
def heapify_down(self):
65+
idx = 1
66+
# starts at 1 because we swapped first and last elements
67+
swap_count = 1
68+
while self.child_present(idx):
69+
smaller_child_idx = self.get_smaller_child_idx(idx)
70+
if self.heap_list[idx] > self.heap_list[smaller_child_idx]:
71+
swap_count += 1
72+
tmp = self.heap_list[smaller_child_idx]
73+
self.heap_list[smaller_child_idx] = self.heap_list[idx]
74+
self.heap_list[idx] = tmp
75+
idx = smaller_child_idx
76+
77+
element_count = len(self.heap_list)
78+
if element_count >= 10000:
79+
print("Heap of {0} elements restored with {1} swaps"
80+
.format(element_count, swap_count))
81+
print("")

0 commit comments

Comments
 (0)