Реализация Max Heap в Python: методы и примеры

Максимальная куча — это специализированная структура данных в информатике, которая представляет собой полное двоичное дерево, в котором значение каждого узла больше или равно значениям его дочерних элементов. В Python вы можете реализовать максимальную кучу, используя различные методы. Вот некоторые распространенные подходы:

  1. Использование модуля heapq:
    Python предоставляет встроенный модуль под названием heapq, который предлагает функции для управления кучами. Чтобы создать максимальную кучу, вы можете использовать функцию heapifyдля преобразования списка в кучу.

    import heapq
    # Create an empty list
    heap = []
    # Add elements to the heap
    heapq.heappush(heap, 4)
    heapq.heappush(heap, 1)
    heapq.heappush(heap, 7)
    # Convert the list into a max heap
    heapq._heapify_max(heap)
    # Extract the maximum element
    max_element = heapq._heappop_max(heap)
  2. Использование библиотеки heapq_max:
    `heapq_max — это сторонняя библиотека, обеспечивающая специальную реализацию максимальной кучи с использованием модуля heapq. Вы можете установить его с помощью pip: pip install heapq_max.

    import heapq_max
    # Create an empty max heap
    heap = []
    # Add elements to the heap
    heapq_max.heappush(heap, 4)
    heapq_max.heappush(heap, 1)
    heapq_max.heappush(heap, 7)
    # Extract the maximum element
    max_element = heapq_max.heappop(heap)
  3. Реализация MaxHeap с нуля:
    Вы также можете создать максимальную кучу, реализовав необходимые функции самостоятельно. Такой подход обеспечивает большую гибкость и контроль над операциями с кучей.

    class MaxHeap:
       def __init__(self):
           self.heap = []
       def parent(self, i):
           return (i - 1) // 2
       def left_child(self, i):
           return 2 * i + 1
       def right_child(self, i):
           return 2 * i + 2
       def insert(self, value):
           self.heap.append(value)
           self._sift_up(len(self.heap) - 1)
       def extract_max(self):
           max_value = self.heap[0]
           last_value = self.heap.pop()
           if self.heap:
               self.heap[0] = last_value
               self._sift_down(0)
           return max_value
       def _sift_up(self, i):
           while i > 0 and self.heap[i] > self.heap[self.parent(i)]:
               self.heap[i], self.heap[self.parent(i)] = self.heap[self.parent(i)], self.heap[i]
               i = self.parent(i)
       def _sift_down(self, i):
           max_index = i
           left = self.left_child(i)
           right = self.right_child(i)
           if left < len(self.heap) and self.heap[left] > self.heap[max_index]:
               max_index = left
           if right < len(self.heap) and self.heap[right] > self.heap[max_index]:
               max_index = right
           if i != max_index:
               self.heap[i], self.heap[max_index] = self.heap[max_index], self.heap[i]
               self._sift_down(max_index)
    # Create a max heap instance
    heap = MaxHeap()
    # Add elements to the heap
    heap.insert(4)
    heap.insert(1)
    heap.insert(7)
    # Extract the maximum element
    max_element = heap.extract_max()