Изменения

Перейти к: навигация, поиск

Двоичная куча

714 байт добавлено, 23:09, 5 июня 2015
Нет описания правки
</code>
===Построение кучи за O(n) ===
{{Определение | definition =
'''<tex>D</tex>-куча''' {{---}} это куча, в которой у каждого элемента, кроме, возможно, элементов на последнем уровне, ровно <tex>d</tex> потомков.
}}
<code style="display:inline-block"> '''function''' heapify(): '''for''' i = a.heapSize / 2 '''downto''' 0 siftDown(i)</code> ===Слияние двух куч===Даны две кучи <tex>a</tex> и <tex>b</tex>, размерами <tex>n</tex> и <tex>m</tex>, требуется объединить эти две кучи. ====Наивная реализация====Поочередно добавим все элементы из <tex>b</tex> в <tex>a</tex>. Время работы {{---}} <tex>O(m \log(n+m))</tex>.<code style="display:inline-block"> '''function''' merge(a, b : '''Heap'''): '''while''' b.heapSize <tex>\neq</tex> 0 a.insert(b.extractMin())</code> ====Реализация с помощью построения кучи====Добавим все элементы кучи <tex>b</tex> в конец массива <tex>a</tex>, после чего вызовем функцию построения кучи. Процедура выполняется за время <tex>O(a.heapSize n + b.heapSizem)</tex>.
<code style="display:inline-block">
'''function''' merge(a, b : '''heapHeap'''):
'''for''' i = 0 '''to''' b.heapSize - 1
a.heapSize = a.heapSize + 1
</code>
===Поиск k-ого элемента===
Требуется найти <tex>k</tex>-ый по величине элемент в куче.
# Создаем новую кучу, в которой будем хранить пару <tex>\langle \mathtt{value}, \mathtt{index } \rangle</tex>, где <tex>\mathtt{value}</tex> {{---}} значение элемента, а <tex>\mathtt{index}</tex> {{---}} индекс элемента в основном массиве, и добавляем в нее корень кучи.
# Возьмем корень новой кучи и добавим её детей из основной кучи, после чего удалим корень. Проделаем этот шаг <tex>k - 1</tex> раз.
# В корне новой кучи будет находиться ответ.
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Приоритетные очереди]]
[[Категория: Структуры данных]]
63
правки

Навигация