Skip to content

Instantly share code, notes, and snippets.

@vsmelov
Last active June 26, 2018 07:57
Show Gist options
  • Save vsmelov/5dd8e9f3fc0e8ca507349d69cb5a5fcf to your computer and use it in GitHub Desktop.
Save vsmelov/5dd8e9f3fc0e8ca507349d69cb5a5fcf to your computer and use it in GitHub Desktop.
Heap implementation
class MinHeap:
def __init__(self, items, key):
""" key must be callable function """
self.arr = list(items)
self.key = key
for i in range(len(self.arr) // 2 - 1, -1, - 1):
self._heapify(i)
def empty(self):
return len(self.arr) == 0
def _heapify(self, i):
smallest = i
for child in [2 * i + 1, 2 * i + 2]:
if child < len(self.arr) and self.key(self.arr[child]) < self.key(self.arr[smallest]):
smallest = child
if smallest != i:
self.arr[i], self.arr[smallest] = self.arr[smallest], self.arr[i]
self._heapify(smallest)
def pop_min(self):
if len(self.arr) == 1:
return self.arr.pop()
min_val, self.arr[0] = self.arr[0], self.arr.pop(-1)
self._heapify(0)
return min_val
def insert(self, val):
self.arr.append(val)
ind = len(self.arr) - 1
while True:
if ind == 0:
break
parent_ind = (ind - 1) // 2
if self.key(self.arr[ind]) < self.key(self.arr[parent_ind]):
self.arr[ind], self.arr[parent_ind] = self.arr[parent_ind], self.arr[ind]
ind = parent_ind
else:
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment