- •Биномиальная куча
- •Двоичная куча
- •[Править] Функциональность
- •[Править] Базовые процедуры
- •[Править] Восстановление свойств кучи
- •[Править] Построение кучи
- •[Править] Пирамидальная сортировка
- •[Править] Изменение значения элемента
- •[Править] Добавление элемента
- •[Править] Извлечение максимального элемента
- •Очередь с приоритетом
- •[Править] Примеры
- •[Править] Расширения очереди с приоритетом
- •Фибоначчиева куча
- •[Править] Структура
- •[Править] Операции
- •[Править] Уменьшение ключа
- •[Править] Удаление узла
[Править] Изменение значения элемента
Процедура Heap_Increase_Key заменяет элемент кучи на новый ключ со значением, не меньшим значения исходного элемента. Обычно эта процедура используется для добавления произвольного элемента в кучу. Временная сложность.
Если элемент меньше своего отца, условие 1 соблюдено для всего дерева, и больше ничего делать не нужно. Если он больше, мы меняем местами его с отцом. Если после этого отец больше деда, мы меняем местами отца с дедом и так далее. Иными словами, слишком большой элемент всплывает наверх.
Heap_Increase_Key(A, i, key)
if key < A[i]
then error "Новый ключ меньше предыдущего"
A[i] ← key
while i > 1 и A[⌊i/2⌋] < A[i]
do Обменять A[i] ↔ A[⌊i/2⌋]
i←⌊i/2⌋
В случае, когда необходимо уменьшить значение элемента, можно вызвать Heapify.
[Править] Добавление элемента
Выполняет добавление элемента в кучу за время .
Добавление произвольного элемента в конец кучи, и восстановление свойства упорядоченности с помощью Heap_Increase_Key.
Heap_Insert(A, key)
A.heap_size ← A.heap_size+1
A[A.heap_size] ← -∞
Heap_Increase_Key(A, A.heap_size, key)
[Править] Извлечение максимального элемента
Выполняет извлечение максимального элемента из кучи за время .
Извлечение выполняется в четыре этапа:
значение корневого элемента (он и является максимальным) сохраняется для последующего возврата
последний элемент копируется в корень, после чего удаляется из кучи
вызывается Heapify для корня
сохранённый элемент возвращается
Heap_Extract_Max(A)
if A.heap_size[A] < 1
then error "Куча пуста"
max ← A[1]
A[1] ← A[A.heap_size]
A.heap_size ← A.heap_size-1
Heapify(A, 1)
returnmax
Очередь с приоритетом
[править]
Материал из Википедии — свободной энциклопедии
Очередь с приоритетом(priority queue) —абстрактный тип данныхвпрограммированииподдерживающий три операции:
InsertWithPriority: добавить в очередь элемент с нaзначенным приоритетом
GetNext: извлечь из очереди и вернуть элемент с минимальным приоритетом (другие названия "PopElement(Off)" или "GetMinimum")
PeekAtNext(необязательная операция): просмотреть элемент с наивысшим приоритетом без извлечения
Говоря другим языком, очередь с приоритетомпозволяет хранить пары (ключ, значение) и поддерживает операции добавления пары, поиска пары с минимальным ключом и извлечения пары с минимальным ключом:
INSERT(ключ, значение)— добавляет пару (k,v) в хранилище;
MIN— возвращает пару (k,v) с минимальным значением ключаk.
EXTRACT_MIN— возвращает пару (k,v) с минимальным значением ключа, удаляя её из хранилища.
Очередь с приоритетом может хранить несколько пар с одинаковыми ключами.
Если очередь пуста, то можно считать, что операции MINиEXTRACT_MINвозвращают некоторую специальную константуUNDEF.
В разных реализациях очереди с приоритетом семантика и названия операций могут отличаться.
Есть ряд реализаций в которых все три операции выполняются в худшем случае за время, ограниченное O(logn) (см.«O» большое и «o» малое), гдеn— количество хранимых пар. Реализация «Фибоначчиева куча» интересна тем, что в среднем (амортизационно) эти три операции выполняет за времяO(1) и, кроме того, позволяет быстро (тоже за времяO(1)) выполнять дополнительную операцию слияния двух куч.
Содержание [убрать]
|