Advertisement
LilChicha174

heap

Oct 28th, 2024
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.66 KB | None | 0 0
  1. class MinHeap:
  2.     def __init__(self):
  3.         self.heap = []
  4.  
  5.     def insert(self, item):
  6.         """Добавить элемент в кучу и восстановить ее свойства."""
  7.         self.heap.append(item)
  8.         self._heapify_up(len(self.heap) - 1)
  9.  
  10.     def get_min(self):
  11.         """Вернуть минимальный элемент (корень) кучи без удаления."""
  12.         if self.size() > 0:
  13.             return self.heap[0]
  14.         return None
  15.  
  16.     def extract_min(self):
  17.         """Удалить и вернуть минимальный элемент (корень) кучи."""
  18.         if self.size() == 0:
  19.             return None
  20.         if self.size() == 1:
  21.             return self.heap.pop()
  22.        
  23.         root = self.heap[0]
  24.         # Переместить последний элемент на место корня и восстановить кучу
  25.         self.heap[0] = self.heap.pop()
  26.         self._heapify_down(0)
  27.         return root
  28.  
  29.     def size(self):
  30.         """Вернуть размер кучи."""
  31.         return len(self.heap)
  32.  
  33.     def is_empty(self):
  34.         """Проверить, пустая ли куча."""
  35.         return len(self.heap) == 0
  36.  
  37.     def _heapify_up(self, index):
  38.         """Восстановить свойства кучи после вставки элемента."""
  39.         parent_index = (index - 1) // 2
  40.         if index > 0 and self.heap[index] < self.heap[parent_index]:
  41.             # Поменять местами с родителем и рекурсивно подняться
  42.             self.heap[index], self.heap[parent_index] = self.heap[parent_index], self.heap[index]
  43.             self._heapify_up(parent_index)
  44.  
  45.     def _heapify_down(self, index):
  46.         """Восстановить свойства кучи после удаления элемента."""
  47.         smallest = index
  48.         left_child = 2 * index + 1
  49.         right_child = 2 * index + 2
  50.  
  51.         if left_child < self.size() and self.heap[left_child] < self.heap[smallest]:
  52.             smallest = left_child
  53.         if right_child < self.size() and self.heap[right_child] < self.heap[smallest]:
  54.             smallest = right_child
  55.  
  56.         if smallest != index:
  57.             # Поменять местами с наименьшим дочерним узлом и рекурсивно спуститься
  58.             self.heap[index], self.heap[smallest] = self.heap[smallest], self.heap[index]
  59.             self._heapify_down(smallest)
  60.  
  61.     def __str__(self):
  62.         """Отобразить элементы кучи."""
  63.         return "Heap: " + str(self.heap)
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement