Advertisement
LilChicha174

heapp

Oct 28th, 2024
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.68 KB | None | 0 0
  1. class MinHeap:
  2.     def __init__(self):
  3.         # Инициализация пустого списка для хранения элементов кучи
  4.         self.heap = []
  5.  
  6.     def insert(self, item):
  7.         """
  8.        Добавляет элемент в кучу и восстанавливает её свойства.
  9.        :param item: элемент для добавления в кучу
  10.        """
  11.         self.heap.append(item)             # Добавляем элемент в конец списка (в конец кучи)
  12.         self._heapify_up(len(self.heap) - 1)  # Восстанавливаем свойства кучи, подняв элемент вверх
  13.  
  14.     def get_min(self):
  15.         """
  16.        Возвращает минимальный элемент (корень) кучи без его удаления.
  17.        :return: минимальный элемент кучи
  18.        :raises IndexError: если куча пуста
  19.        """
  20.         if self.is_empty():
  21.             raise IndexError("Heap is empty")  # Бросаем исключение, если куча пуста
  22.         return self.heap[0]                    # Минимальный элемент всегда находится в корне (первый элемент списка)
  23.  
  24.     def extract_min(self):
  25.         """
  26.        Удаляет и возвращает минимальный элемент (корень) кучи.
  27.        :return: минимальный элемент кучи
  28.        :raises IndexError: если куча пуста
  29.        """
  30.         if self.is_empty():
  31.             raise IndexError("Heap is empty")  # Бросаем исключение, если куча пуста
  32.  
  33.         if self.size() == 1:
  34.             # Если в куче один элемент, просто удаляем и возвращаем его
  35.             return self.heap.pop()
  36.        
  37.         root = self.heap[0]                    # Сохраняем минимальный элемент для возврата
  38.         self.heap[0] = self.heap.pop()         # Перемещаем последний элемент в корень
  39.         self._heapify_down(0)                  # Восстанавливаем свойства кучи, спуская элемент вниз
  40.         return root                            # Возвращаем минимальный элемент
  41.  
  42.     def size(self):
  43.         """
  44.        Возвращает количество элементов в куче.
  45.        :return: размер кучи
  46.        """
  47.         return len(self.heap)
  48.  
  49.     def is_empty(self):
  50.         """
  51.        Проверяет, пуста ли куча.
  52.        :return: True, если куча пуста, иначе False
  53.        """
  54.         return len(self.heap) == 0
  55.  
  56.     def _heapify_up(self, index):
  57.         """
  58.        Восстанавливает свойства кучи после вставки элемента, перемещая его вверх по дереву.
  59.        :param index: индекс вставленного элемента
  60.        """
  61.         while index > 0:
  62.             parent_index = (index - 1) // 2    # Вычисляем индекс родительского узла
  63.             if self.heap[index] < self.heap[parent_index]:
  64.                 # Если текущий элемент меньше родителя, меняем их местами
  65.                 self.heap[index], self.heap[parent_index] = self.heap[parent_index], self.heap[index]
  66.                 index = parent_index           # Обновляем индекс на индекс родителя для дальнейшего подъема
  67.             else:
  68.                 break                          # Если свойство кучи не нарушено, завершаем цикл
  69.  
  70.     def _heapify_down(self, index):
  71.         """
  72.        Восстанавливает свойства кучи после удаления элемента, перемещая элемент вниз по дереву.
  73.        :param index: индекс элемента, который нужно переместить вниз
  74.        """
  75.         size = self.size()
  76.         while index < size:
  77.             smallest = index                   # Предполагаем, что текущий узел наименьший
  78.             left_child = 2 * index + 1         # Индекс левого дочернего узла
  79.             right_child = 2 * index + 2        # Индекс правого дочернего узла
  80.  
  81.             # Проверяем, существует ли левый дочерний узел и меньше ли он текущего наименьшего
  82.             if left_child < size and self.heap[left_child] < self.heap[smallest]:
  83.                 smallest = left_child
  84.  
  85.             # Проверяем, существует ли правый дочерний узел и меньше ли он текущего наименьшего
  86.             if right_child < size and self.heap[right_child] < self.heap[smallest]:
  87.                 smallest = right_child
  88.  
  89.             if smallest != index:
  90.                 # Если наименьший узел не текущий, меняем их местами и продолжаем спускаться
  91.                 self.heap[index], self.heap[smallest] = self.heap[smallest], self.heap[index]
  92.                 index = smallest               # Обновляем индекс на индекс наименьшего дочернего узла
  93.             else:
  94.                 break                          # Если свойство кучи восстановлено, завершаем цикл
  95.  
  96.     def build_heap(self, array):
  97.         """
  98.        Построить кучу из заданного массива за линейное время O(n).
  99.        :param array: список элементов для построения кучи
  100.        """
  101.         self.heap = array[:]                   # Копируем элементы массива в кучу
  102.         # Начинаем с первого узла, имеющего потомков, и двигаемся вверх к корню
  103.         for i in range(len(self.heap) // 2 - 1, -1, -1):
  104.             self._heapify_down(i)              # Восстанавливаем свойства кучи для каждого узла
  105.  
  106.     def __str__(self):
  107.         """
  108.        Возвращает строковое представление элементов кучи.
  109.        :return: строка с элементами кучи
  110.        """
  111.         return "Heap: " + str(self.heap)
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement