def heap_sort(array: list): sorted_array = [] heap = MinHeap(array) while len(heap) > 0: cur_min_val = heap.pop_min() sorted_array.append(cur_min_val) return sorted_array
def test_min_heap_heapify(): heap = MinHeap([0, 1, 1, 2, 3]) assert heap.min() == 0 assert heap.pop_min() == 0 assert heap.pop_min() == 1 assert heap.pop_min() == 1 assert heap.pop_min() == 2 heap = MinHeap([1, 0, 2, 3, 1]) assert heap.min() == 0 assert heap.pop_min() == 0 assert heap.pop_min() == 1 assert heap.pop_min() == 1 assert heap.pop_min() == 2
Напишите программу, которая будет обрабатывать последовательность запросов таких видов: CLEAR — сделать очередь с приоритетами пустой (если в очереди уже были какие-то элементы, удалить все). Действие происходит только с данными в памяти, на экран ничего не выводится. ADD n — добавить в очередь с приоритетами число n. Действие происходит только с данными в памяти, на экран ничего не выводится. EXTRACT — вынуть из очереди с приоритетами минимальное значение. Следует и изменить данные в памяти, и вывести на экран или найденное минимальное значение, или, если очередь была пустой, слово "CANNOT" (большими буквами). """ from data_structure.heap import MinHeap if __name__ == '__main__': heap = MinHeap() with open("input.txt") as file: for cur_line in file.readlines(): if "ADD" in cur_line: val = int(cur_line.split()[1]) heap.push(val) elif "CLEAR" in cur_line: heap = MinHeap() elif "EXTRACT" in cur_line: try: print(heap.pop_min()) except IndexError: print("CANNOT")
def __init__(self): self.max_heap = MaxHeap() self.min_heap = MinHeap()
class PrefixWithMedian: def __init__(self): self.max_heap = MaxHeap() self.min_heap = MinHeap() def insert(self, val) -> None: len_prefix = len(self.max_heap) + len(self.min_heap) if len_prefix <= 1: self.min_heap.push(val) else: ref_val = self.min_heap.min() if len_prefix % 2 == 0: self._insert_and_shift_median(val, ref_val) else: self._insert_and_keep_median(val, ref_val) def get_median(self): return self.min_heap.min() def get_prefix(self): raise NotImplemented def _insert_and_shift_median(self, new_val, cur_median) -> None: """ Вставка элемента если индекс медианного элемента изменится Те len(prefix) % 2 = 0 """ if new_val < cur_median: self.max_heap.push(new_val) else: self.min_heap.pop_min() self.max_heap.push(cur_median) self.min_heap.push(new_val) def _insert_and_keep_median(self, new_val, cur_median) -> None: """ Вставка элемента если индекс медианного элемента не изменится Те len(prefix) % 2 = 1 """ if new_val > cur_median: self.min_heap.push(new_val) else: if self.max_heap.max() < new_val: self.min_heap.push(new_val) else: last_max_heap = self.max_heap.pop_max() self.max_heap.push(new_val) self.min_heap.push(last_max_heap)
def test_min_heap_push(): heap_min = MinHeap() heap_min.push(1) heap_min.push(2)
def test_min_heap_pop(): heap_min = MinHeap() try: heap_min.pop_min() except: pass else: raise AssertionError heap_min.push(1) heap_min.push(3) assert heap_min.pop_min() == 1 assert heap_min.min() == 3 assert heap_min.pop_min() == 3 try: heap_min.pop_min() except: pass else: raise AssertionError heap_min.push(5) heap_min.push(8) heap_min.push(9) assert heap_min.pop_min() == 5 assert heap_min.pop_min() == 8 assert heap_min.pop_min() == 9
def test_min_heap_min(): heap_min = MinHeap() try: heap_min.min() except: pass else: raise AssertionError heap_min.push(1) assert heap_min.min() == 1 heap_min.push(0) assert heap_min.min() == 0 heap_min.push(3) assert heap_min.min() == 0