Рубрики
Без рубрики

Минимальная структура данных кучи – полная реализация в Python

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

Автор оригинала: Pankaj Kumar.

Минимальная структура данных кучи – полная реализация в Python

В этой статье мы узнаем больше о минимальной куче (известной как очередь кучи в Python). Мы уже узнали о Куча и его библиотечные функции (в модуле Heapq) в Python Отказ Теперь мы узнаем о мин-куче и его реализации, а затем посмотрите на код Python для реализации Хипифирование , Heapppush и Heappop функционирует сами. Давайте сделаем быстрое повторение.

Что такое минимальная куча?

Минимальная куча – это полное двоичное дерево (полное двоичное дерево – это дерево, которое полностью заполнено, за исключением правых узлов в самом глубоком/последнем уровне), в котором каждый узел меньше или равен всему его детям. Следовательно, корневой узел кучи – самый маленький элемент. Структура данных Min-Heap обычно используется для представления очереди приоритета.

Min Heap Python Askpyphon Content1

Как кучи представлены в массивах?

Мы уже видели, как куча представлена в памяти в виде массива, просто быстрое напоминание о том, что:

  • Корневой элемент будет на нулевой позиции массива, то есть куча [0].
  • Для любого другого узла, скажем, куча [I], у нас есть следующее:
    • Родительский узел дан: Heap [(I -1)/2]
    • Левый узел дочернего ребенка дан: Heap [(2 * I) + 1]
    • Правый узел дочернего ребенка дан: Куча [(2 * I) + 2]
Min Heap Python Askpyphon Content21

Понимание функций, используемых при реализации Min Heap

1. Функция Min-HealPify

Эта функция делает узел и все его потомки (дочерние узлы и их ребенок) следуют в собственности кучи. Он переставляет узлы, подняв их так, чтобы сделать данную кучу наименьшего узла в своем поддереве, после его собственности.

Эта функция сначала находит узел с наименьшим значением среди данного узла и его детей. Затем он сворачивает данный узел, (скажем, I) с установленным узлом минимального значения (скажем, j), а затем вызывает функцию min-halpify (рекурсивно) по узлу j, чтобы убедиться, что новое значение, назначенное для узла j, делает Не сломайте свойство кучи в своем поддереве.

Так как не более того, он должен пройти через глубину дерева, его временной сложность является O (d), где d – глубина, или с точки зрения количества узлов, o (log n), n – число элементы в куче.

2. Функция сборки-кучи

Эта функция строит кучу из произвольного списка (или любого другого илетного), то есть требуется список и переставляет каждый элемент, чтобы удовлетворить свойство кучи. Это может быть просто реализовано, применяя мин-Хипифирование на каждый узел несколько раз. Сложность времени этой функции выходит O (n), где n – количество элементов в куче.

3. Функция Heappop

Эта функция выскакивает минимальное значение (корневой элемент) кучи.

Это на самом деле сделано путем замены корневого узла с последним узлом и удалением последнего узла (содержащего минимальное значение), а затем вызовов Min-HealPify для корневого узла, чтобы поддерживать свойство кучи после изменения из-за замены.

Поскольку нам нужно только иметь дело с потомками, то временная сложность является O (log n), где n – количество элементов, или o (h), где h – высота дерева, который является журналом N, как это является Полное дерево.

4. Функция Heappush

Эта функция нажимает новый элемент в кучу и устраняет его в правильном положении, поддерживая свойство кучи.

Это действительно сделано путем добавления нового узла к концу кучи. Теперь, чтобы поддерживать свойство кучи, мы проходим от последнего узла (и поменяйте, где это необходимо) исправить свойство кучи, которое могло быть нарушено.

Аналогичным образом как Heappop, момент сложности вот O (log n), поскольку нам нужно только пройти высоту поддерева.

5. Функция Extractmin

Эта функция возвращает наиболее приоритет (корневой элемент) из кучи. Поскольку нам просто нужно вернуть значение корня и без изменений в кучу, а корню доступен в o (1) время, поэтому момент времени сложности функции является O (1).

Полный Python внедрение структуры данных Min Heap

Ниже приведена полная программа для реализации Min Heap в Python.

import sys

#defining a class min_heap for the heap data structure

class min_heap: 
    def __init__(self, sizelimit):
        self.sizelimit = sizelimit
        self.cur_size = 0
        self.Heap = [0]*(self.sizelimit + 1)
        self.Heap[0] = sys.maxsize * -1
        self.root = 1


    # helper function to swap the two given nodes of the heap
    # this function will be needed for heapify and insertion to swap nodes not in order
    def swapnodes(self, node1, node2):
        self.Heap[node1], self.Heap[node2] = self.Heap[node2], self.Heap[node1]
 
    # THE MIN_HEAPIFY FUNCTION
    def min_heapify(self, i):
 
        # If the node is a not a leaf node and is greater than any of its child
        if not (i >= (self.cur_size//2) and i <= self.cur_size):
            if (self.Heap[i] > self.Heap[2 * i]  or  self.Heap[i] > self.Heap[(2 * i) + 1]): 
                if self.Heap[2 * i] < self.Heap[(2 * i) + 1]:
     # Swap the node with the left child and then call the min_heapify function on it
                    self.swapnodes(i, 2 * i)
                    self.min_heapify(2 * i)
 
                else:
                # Swap the node with right child and then call the min_heapify function on it
                    self.swapnodes(i, (2 * i) + 1)
                    self.min_heapify((2 * i) + 1)
 


    # THE HEAPPUSH FUNCTION
    def heappush(self, element):
        if self.cur_size >= self.sizelimit :
            return
        self.cur_size+= 1
        self.Heap[self.cur_size] = element 
        current = self.cur_size
        while self.Heap[current] < self.Heap[current//2]:
            self.swapnodes(current, current//2)
            current = current//2
 
 
    # THE HEAPPOP FUNCTION
    def heappop(self):
        last = self.Heap[self.root]
        self.Heap[self.root] = self.Heap[self.cur_size]
        self.cur_size -= 1
        self.min_heapify(self.root)
        return last
 
 
    # THE BUILD_HEAP FUNCTION
    def build_heap(self): 
        for i in range(self.cur_size//2, 0, -1):
            self.min_heapify(i)
 
 
    # helper function to print the heap
    def print_heap(self):
        for i in range(1, (self.cur_size//2)+1):
            print("Parent Node is "+ str(self.Heap[i])+" Left Child is "+ str(self.Heap[2 * i]) +                  " Right Child is "+ str(self.Heap[2 * i + 1]))
 
 
# Driver Code
minHeap = min_heap(10)
minHeap.heappush(15)
minHeap.heappush(7)
minHeap.heappush(9)
minHeap.heappush(4)
minHeap.heappush(13)
minHeap.print_heap()

Выход:

Parent Node is 4 Left Child is 7 Right Child is 9
Parent Node is 7 Left Child is 15 Right Child is 13

Заключение

В этой статье мы узнали о минимальной куче. Мы изучали, как функции для Хипифирование , Heapppush и Heappop Работа. Мы также реализовали структуру данных Min Heap с нуля в Python с нуля. Оставайтесь настроиться на более информативные статьи.

Счастливое обучение!