Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / Разные источники / Биномиальная куча (Вики).doc
Скачиваний:
40
Добавлен:
23.03.2015
Размер:
231.42 Кб
Скачать

[Править] Изменение значения элемента

Процедура 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_sizeA.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 "Куча пуста"

maxA[1]

A[1] ← A[A.heap_size]

A.heap_sizeA.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)) выполнять дополнительную операцию слияния двух куч.

Содержание

 [убрать]

  • 1 Примеры

  • 2 Расширения очереди с приоритетом

  • 3 См. также

  • 4 Ссылки