From 0de4171ec4f68a8f455ac2bcb5972bd3f6ee5476 Mon Sep 17 00:00:00 2001 From: Mariah Rosman Date: Thu, 5 May 2022 16:44:28 -0700 Subject: [PATCH 1/3] adds heap_up and add methods --- heaps/min_heap.py | 50 +++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/heaps/min_heap.py b/heaps/min_heap.py index f6fe4e0..b083cbe 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -1,5 +1,5 @@ class HeapNode: - + def __init__(self, key, value): self.key = key self.value = value @@ -10,19 +10,22 @@ def __str__(self): def __repr__(self): return str(self.value) + class MinHeap: def __init__(self): self.store = [] - - def add(self, key, value = None): + 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) """ - pass + 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 @@ -32,8 +35,6 @@ def remove(self): """ pass - - def __str__(self): """ This method lets you print the heap, when you're testing your app. """ @@ -41,26 +42,32 @@ def __str__(self): return "[]" return f"[{', '.join([str(element) for element in self.store])}]" - def empty(self): """ 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): """ This helper method takes an index and moves the corresponding element up the heap, if it is less than it's parent node until the Heap 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) + + (index - 1) // 2 -> to find the parent + """ - pass + parent = (index-1)//2 + temp = index + while parent >= 0 and self.store[parent].key > self.store[temp].key: + self.swap(temp, parent) + temp = parent + parent = (temp - 1) // 2 def heap_down(self, index): """ This helper method takes an index and @@ -68,9 +75,14 @@ def heap_down(self, index): larger than either of its children and continues until the heap property is reestablished. """ - pass + right_child = (index * 2) + 2 + left_child = (index * 2) + 1 + temp = index + while parent >= 0 and self.store[parent].key > self.store[temp].key: + self.swap(temp, parent) + temp = parent + parent = (temp - 1) // 2 - def swap(self, index_1, index_2): """ Swaps two elements in self.store at index_1 and index_2 From 4a6661a14457198a5110ae6523ca01a9be906483 Mon Sep 17 00:00:00 2001 From: Mariah Rosman Date: Thu, 12 May 2022 18:04:02 -0700 Subject: [PATCH 2/3] passing all tests --- heaps/heap_sort.py | 14 +++++++++++++- heaps/min_heap.py | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index 3b834a5..8a5e08b 100644 --- a/heaps/heap_sort.py +++ b/heaps/heap_sort.py @@ -1,3 +1,4 @@ +from heapq import heappush, heappop def heap_sort(list): @@ -5,4 +6,15 @@ def heap_sort(list): Time Complexity: ? Space Complexity: ? """ - pass \ No newline at end of file + heap = [] + + for item in list: + heappush(heap, item) + + ordered = [] + + while len(heap) > 0: + value = heappop(heap) + ordered.append(value) + + return ordered diff --git a/heaps/min_heap.py b/heaps/min_heap.py index b083cbe..892e56c 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -1,3 +1,6 @@ +from turtle import right + + class HeapNode: def __init__(self, key, value): @@ -22,6 +25,9 @@ def add(self, key, value=None): Time Complexity: O(log n) Space Complexity: O(1) """ + if value is None: + value = key + new_node = HeapNode(key, value) self.store.append(new_node) @@ -33,7 +39,19 @@ def remove(self): Time Complexity: ? Space Complexity: ? """ - pass + + if self.empty(): + return None + + first_node = 0 + last_node = len(self.store)-1 + + self.swap(first_node, last_node) + result = self.store.pop() + + self.heap_down(first_node) + + return result.value def __str__(self): """ This method lets you print the heap, when you're testing your app. @@ -77,11 +95,19 @@ def heap_down(self, index): """ right_child = (index * 2) + 2 left_child = (index * 2) + 1 - temp = index - while parent >= 0 and self.store[parent].key > self.store[temp].key: - self.swap(temp, parent) - temp = parent - parent = (temp - 1) // 2 + + if left_child < len(self.store): + if right_child < len(self.store): + if self.store[left_child].key < self.store[right_child].key: + child = left_child + else: + child = right_child + else: + child = left_child + + if self.store[child].key < self.store[index].key: + self.swap(index, child) + self.heap_down(child) def swap(self, index_1, index_2): """ Swaps two elements in self.store From a2267a96d196a2acd8545f3283f678450fd80788 Mon Sep 17 00:00:00 2001 From: Mariah Rosman Date: Thu, 12 May 2022 18:08:02 -0700 Subject: [PATCH 3/3] adds time and space complexity --- heaps/heap_sort.py | 4 ++-- heaps/min_heap.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index 8a5e08b..7dc9ddf 100644 --- a/heaps/heap_sort.py +++ b/heaps/heap_sort.py @@ -3,8 +3,8 @@ def heap_sort(list): """ This method uses a heap to sort an array. - Time Complexity: ? - Space Complexity: ? + Time Complexity: O(log n) + Space Complexity: O(n) """ heap = [] diff --git a/heaps/min_heap.py b/heaps/min_heap.py index 892e56c..ae43b40 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -36,8 +36,8 @@ def add(self, key, value=None): 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) """ if self.empty():