Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions heaps/heap_sort.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@

from heaps.min_heap import MinHeap

def heap_sort(list):
""" This method uses a heap to sort an array.
Time Complexity: ?
Space Complexity: ?
Time Complexity: O(n log n)
Space Complexity: O(n)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👀 Time and space complexity and overall logic flow are correct, however, your heap_sort tests are failing. See my comment below!

"""
pass
heap = MinHeap()

for item in list:
heap = heap.add(item)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your failing tests for heap_sort return AttributeError: 'NoneType' object has no attribute 'add'. Look at the return value for add and see if you can figure out why that might be 🤔

What are you setting the heap equal to here? Do you need to be?


for i in range(len(list)):
list[i] = heap.remove()

return list
61 changes: 43 additions & 18 deletions heaps/min_heap.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
class HeapNode:

def __init__(self, key, value):
self.key = key
self.value = value
Expand All @@ -11,43 +10,48 @@ def __repr__(self):
return str(self.value)

class MinHeap:

def __init__(self):
self.store = []


def add(self, key, value = None):
""" This method adds a HeapNode instance to the heap
If value == None the new node's value should be set to key
Time Complexity: ?
Space Complexity: ?
Time Complexity: O(log n)
Space Complexity: O(1)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✨ Nice, however, space complexity is O(log n) because of the recursive call stack of the heap_up operation

"""
pass
value = key if value == None else value
new_node = HeapNode(key, value)
self.store.append(new_node)
self.heap_up(len(self.store)-1)

def remove(self):
""" This method removes and returns an element from the heap
maintaining the heap structure
Time Complexity: ?
Space Complexity: ?
Time Complexity: O(log n)
Space Complexity: O(1)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✨ Very nice, however like above, the space complexity is O(log n) because of the recursive call stack of heap_down

"""
pass
if self.empty():
return None

self.swap(0, len(self.store) - 1)
removed = self.store.pop()

self.heap_down(0)
return removed.value


def __str__(self):
""" This method lets you print the heap, when you're testing your app.
"""
if len(self.store) == 0:
return "[]"
return f"[{', '.join([str(element) for element in self.store])}]"


def empty(self):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

""" This method returns true if the heap is empty
Time complexity: ?
Space complexity: ?
Time complexity: O(1)
Space complexity: O(1)
"""
pass
return len(self.store) == 0


def heap_up(self, index):
Expand All @@ -57,18 +61,39 @@ def heap_up(self, index):
property is reestablished.

This could be **very** helpful for the add method.
Time complexity: ?
Space complexity: ?
Time complexity: O(log n)
Space complexity: O(1)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✨ However space complexity is O(log n) because of the recursive call stack

"""
pass
if index == 0:
return

parent = (index-1)//2
store = self.store
if store[parent].key > store[index].key:
self.swap(parent, index)
self.heap_up(parent)

def heap_down(self, index):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✨ Very nice!

""" This helper method takes an index and
moves the corresponding element down the heap if it's
larger than either of its children and continues until
the heap property is reestablished.
"""
pass
left_child = 2*index + 1
right_child = 2*index + 2

if left_child >= len(self.store):
return
elif right_child >= len(self.store):
smaller_child_index = left_child
else:
smaller_child_index = left_child if self.store[left_child].key < self.store[right_child].key else right_child

if self.store[index].key < self.store[smaller_child_index].key:
return
self.swap(index, smaller_child_index)

return self.heap_down(smaller_child_index)


def swap(self, index_1, index_2):
Expand Down