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

[Править] Операции

[править] Создание новой фибоначчиевой кучи

Процедура 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 zmin[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 xw

5 ddegree[x]

6 whileA[d] ≠ NULL

7 doyA[d] //Узел с той же степенью, что и уx

8 if key[x] > key[y]

9 then обменять xy

10 Fib_Heap_Link(H,y,x)

11 A[d] ← NULL

12 dd + 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 yp[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 zp[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).