
- •Биномиальная куча
- •Двоичная куча
- •[Править] Функциональность
- •[Править] Базовые процедуры
- •[Править] Восстановление свойств кучи
- •[Править] Построение кучи
- •[Править] Пирамидальная сортировка
- •[Править] Изменение значения элемента
- •[Править] Добавление элемента
- •[Править] Извлечение максимального элемента
- •Очередь с приоритетом
- •[Править] Примеры
- •[Править] Расширения очереди с приоритетом
- •Фибоначчиева куча
- •[Править] Структура
- •[Править] Операции
- •[Править] Уменьшение ключа
- •[Править] Удаление узла
[Править] Операции
[править] Создание новой фибоначчиевой кучи
Процедура Make_Fib_Heap возвращает объект фибоначчиевой кучи H,n[H] = 0 иmin[H] = NULL. Деревьев вHнет.
Амортизированная стоимость процедуры равна её фактической стоимости O(1).
[править] Вставка узла
Fib_Heap_Insert(H,x)
1 degree[x] ← 0
2 p[x] ← NULL
3 child[x] ← NULL
4 left[x] ← x
5 right[x] ← x
6 mark[x] ← FALSE
7 Присоединение списка корней, содержащего x, к списку корнейH
8 if min[H] = NULL или key[x] < key[min[H]]
9 then min[H] ← x
10 n[H] ← n[H] + 1
Амортизированная стоимость процедуры равна её фактической стоимости O(1).
[править] Поиск минимального узла
Процедура Fib_Heap_Minimum возвращает указатель min[H].
Амортизированная стоимость процедуры равна её фактической стоимости O(1).
[править] Объединение двух фибоначчиевых куч
Fib_Heap_Union(H1,H2)
1 H ← Make_Fib_Heap()
2 min[H] ← min[H1]
3 Добавление списка корней H2к списку корнейH
4 if (min[H1] = NULL) или (min[H2] ≠ NULL и key[min[H2]] < key[min[H1]])
5 then min[H] ← min[H2]
6 n[H] ←n[H1] +n[H2]
7 Освобождение объектов H1иH2
8 returnH
Амортизированная стоимость процедуры равна её фактической стоимости O(1).
[править] Извлечение минимального узла
Fib_Heap_Extract_Min(H)
1 z ← min[H]
2 if z ≠ NULL
3 then forдля каждого дочернего по отношению кzузлаx
4 doДобавитьxв список корнейH
5 p[x] ← NULL
6 Удалить zиз списка корнейH
7 if z = right[z]
8 then min[H] ← NULL
9 else min[H] ← right[z]
10 Consolidate(H)
11 n[H] ← n[H] − 1
12 returnz
На одном из этапов операции извлечения минимального узла выполняется уплотнение (англ.consolidating) списка корнейH. Для этого используется вспомогательная процедура Consolidate. Эта процедура использует вспомогательный массивA[0..D[n[H]]]. ЕслиA[i] =y, тоyв настоящий момент является корнем со степеньюdegree[y] =i.
Consolidate(H)
1 for i ← 0 to D(n[H])
2 doA[i] ← NULL
3 forдля каждого узлаwв списке корнейH
4 do x ← w
5 d ← degree[x]
6 whileA[d] ≠ NULL
7 doy←A[d] //Узел с той же степенью, что и уx
8 if key[x] > key[y]
9 then обменять x ↔ y
10 Fib_Heap_Link(H,y,x)
11 A[d] ← NULL
12 d ← d + 1
13 A[d] ← x
14 min[H] ← NULL
15 for i ← 0 to D(n[H])
16 do if A[i] ≠ NULL
17 thenДобавитьA[i] в список корнейH
18 if min[H] = NULL или key[A[i]] < key[min[H]]
19 then min[H] ← A[i]
Fib_Heap_Link(H,y,x)
1 Удалить yиз списка корнейH
2 Сделать yдочерним узломx, увеличитьdegree[x]
3 mark[y] ← FALSE
Амортизированная стоимость извлечения минимального узла равна O(lgn).
[Править] Уменьшение ключа
Fib_Heap_Decrease_Key(H,x,k)
1 if k > key[x]
2 then error «Новый ключ больше текущего»
3 key[x] ← k
4 y ← p[x]
5 if y ≠ NULL и key[x] < key[y]
6 then Cut(H,x,y)
7 Cascading_Cut(H,y)
8 if key[x] < key[min[H]]
9 then min[H] ← x
Cut(H,x,y)
1 Удаление xиз списка дочерних узловy, уменьшениеdegree[y]
2 Добавление xв список корнейH
3 p[x] ← NULL
4 mark[x] ← FALSE
Cascading_Cut(H,y)
1 z ← p[y]
2 if z ≠ NULL
3 then if mark[y] = FALSE
4 then mark[y] ← TRUE
5 else Cut(H,y,z)
6 Cascading_Cut(H,z)
Амортизированная стоимость уменьшения ключа не превышает O(1).