Изменения

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

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

247 байт добавлено, 06:45, 15 октября 2016
Определение: лишняя запятая
'''Двоичная куча''' или '''пирамида''' (англ. ''Binary heap'') — такое двоичное [[Дерево, эквивалентные определения|подвешенное дерево]], для которого выполнены следующие три условия:
* Значение в любой вершине не меньше, (если куча для максимума), чем значения её потомков.
* На <tex>i</tex>-ом слое <tex>2^i</tex> вершин, кроме последнего. Слои нумеруются с нуля.
* Последний слой заполнен слева направо (как показано на рисунке)
right = 2 * i + 2 <font color = "green">// right {{---}} правый сын</font>
j = left
'''if''' right <tex><</tex> a.heapSize '''and''' a[right] <tex><</tex> Aa[left]
j = right
'''if''' a[i] <tex>\leqslant</tex> a[j]
Дан массив <tex>a[0.. n - 1].</tex> Требуется построить <tex>d</tex>-кучу с минимумом в корне. Наиболее очевидный способ построить такую кучу из неупорядоченного массива {{---}} сделать нулевой элемент массива корнем, а дальше по очереди добавить все его элементы в конец кучи и запускать от каждого добавленного элемента <math>\mathrm {siftUp}</math>. Временная оценка такого алгоритма <tex> O(n\log{n})</tex>. Однако можно построить кучу еще быстрее — за <tex> O(n) </tex>.
Представим, что в массиве хранится дерево (<tex>a[0] - </tex> корень, а потомками элемента <tex>a[i]</tex> являются <tex>a[2idi+1]...a[2idi+d]</tex>). Сделаем <tex> \mathrm {siftDown} </tex> для вершин, имеющих хотя бы одного потомка: от <tex dpi=140>\genfrac {}{}{}{}dfrac{n}{d}</tex> до <tex>0</tex>,{{---}} так как поддеревья, состоящие из одной вершины без потомков, уже упорядочены.
{{Лемма
|statement= На выходе получим искомую кучу.
}}
Псевдокод алгоритма:
<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>, требуется объединить эти две кучи.
a.heapSize = a.heapSize + 1
a[a.heapSize - 1] = b[i]
a.heapify(a)
</code>
# В корне новой кучи будет находиться ответ.
Время работы алгоритма {{---}} <tex>O(k \log k)</tex>.
 
При <tex>n \lessapprox k \log k </tex> выгоднее запускать [[поиск k-ой порядковой статистики]].
[[Файл:Min_heap_kth.png‎|thumb|center|650px|Пример при <tex>k = 5</tex>, красные {{---}} уже удаленные из кучи элементы, зеленые находятся в куче, а голубые {{---}} еще не рассмотрены.]]
Анонимный участник

Навигация