Операции с Heap
Рассмотрим некоторые из важных операций, выполняемых с кучей, и их алгоритмы.
Нагромождение
Heapify — это процесс создания структуры данных кучи из двоичного дерева. Он используется для создания Min Heap или Max Heap.
- Пусть входной массив будет таким.
- Создай полное бинарное дерево из массива.
- Начни с первого индекса нелистового узла, индекс которого задается n/2 - 1.
-
Установи текущий элемент i как largest.
-
Индекс левого дочернего элемента определяется как 2i + 1а, правого дочернего элемента — как 2i + 2.
Если rightChild больше, чем элемент в largest, установи rightChildIndex как largest.
Поменяй местами largest с currentElement.
- Если leftChild больше, чем currentElement (т. е. элемент по ith индексу), установи leftChildIndex как самый большой.
- Повторяй шаги 3–7, пока поддеревья также не будут загружены.
Алгоритм heapify (псевдокод)
Чтобы создать Max-Heap (псевдокод):
Для Min Heap оба leftChild и rightChild должны быть больше, чем родитель для всех узлов.
Вставка элемента в кучу
Алгоритм вставки в Max Heap (псевдокода):
- Вставь новый элемент в конец дерева.
- Произведи алгоритм heapify.
Для Min Heap приведенный выше алгоритм изменен таким образом, что parentNode всегда меньше newNode.
Удаление элемента из кучи
Алгоритм удаления в Max Heap
- Выбери элемент, который необходимо удалить.
- Поменяй его местами с последним элементом.
- Удали последний элемент.
- Результат после heapify.
Для Min Heap приведенный выше алгоритм изменен так, что оба значения childNodes меньше, чем currentNode.
Peek (найти макс./мин.)
Операция просмотра возвращает максимальный элемент из максимальной кучи или минимальный элемент из минимальной кучи без удаления узла.
Как для максимальной кучи, так и для минимальной кучи:
Извлечение-макс./мин.
Extract Max возвращает узел с максимальным значением после его удаления из максимальной кучи, тогда как Extract Min возвращает узел с минимальным значением после его удаления из минимальной кучи.