Персистентная приоритетная очередь — различия между версиями
Kris (обсуждение | вклад) |
Kris (обсуждение | вклад) (→Insert) |
||
| Строка 25: | Строка 25: | ||
а) Минимальный ранг дерева <tex>k</tex> и такое дерево одно. Добавим новое дерево ранга 0 - нашу вершину. | а) Минимальный ранг дерева <tex>k</tex> и такое дерево одно. Добавим новое дерево ранга 0 - нашу вершину. | ||
| − | б) Минимальный ранг | + | б) Минимальный ранг дерева <tex>k</tex> и таких деревьев два. Объединим эти деревья и нашу вершину в дерево ранга <tex>k+1</tex>, получим дерево типа 1 или 2 в зависимости от того у какой вершины ключ меньше. |
Тогда <tex>insert</tex> работает за <tex>O(1)</tex>. | Тогда <tex>insert</tex> работает за <tex>O(1)</tex>. | ||
| + | |||
=== extractMinimum === | === extractMinimum === | ||
Работает так же как и в обычной [[Биномиальная куча|биномиальной куче]]. Проходим по списку корней и находим вершину с минимальным ключом. | Работает так же как и в обычной [[Биномиальная куча|биномиальной куче]]. Проходим по списку корней и находим вершину с минимальным ключом. | ||
Версия 03:30, 11 июня 2013
Персистентная приоритетная очередь (англ. persistent priority queue) - это приоритетная очередь, реализующая персистентность, то есть позволяющая получить доступ ко всем своим предыдущим версиям.
Содержание
Основная идея
Возьмем биномиальную кучу и реализуем ее на односвязных списках.
Для этого будем хранить список корней в порядке возрастания ранга, а детей будем хранить по убыванию ранга. Каждый родитель будет знать ребенка с большим рангом, который является головой списка детей, но ребенок не будет знать родителя.
Операции
Merge
Проходим по корневым спискам и создаем новый, объединяя деревья одинакового ранга.
merge_tree(t1, t2)
if (t1.key < t2.key)
t2.next = t1.son;
t1.soon = t2;
else
t1.next = t2.son;
t2.soon = t1;
Проход по корневым спискам выполнится за , объединение деревьев выполняется за . Тогда работает за .
Insert
Разрешим при объединении двух деревьев присоединять еще одну вершину, дерево ранга 0. Тогда получится возможным существование еще двух типов деревьев:
Разберем случаи добавления.
а) Минимальный ранг дерева и такое дерево одно. Добавим новое дерево ранга 0 - нашу вершину.
б) Минимальный ранг дерева и таких деревьев два. Объединим эти деревья и нашу вершину в дерево ранга , получим дерево типа 1 или 2 в зависимости от того у какой вершины ключ меньше.
Тогда работает за .
extractMinimum
Работает так же как и в обычной биномиальной куче. Проходим по списку корней и находим вершину с минимальным ключом.
extractMinimum(t)
t1=t;
while t1.next != null
if min.val>t1.val
min = t1;
t1 = t1.next;
par = t;
t1 = t;
while min != t1
par = t1;
t1 = t1.next;
par.next = par.next.next;
return (min, t)
Возвращает дерево с минимальным элементом и остаток от очереди после извлечения минимума. Работает за .