Fibonacciho hromada
Fibonacciho halda ( angl. Fibonacci halda ) je datová struktura , která je množinou stromů uspořádaných v souladu s vlastností neklesající pyramidy. Fibonacciho haldy představili Michael Fredman a Robert Tarjan v roce 1984 .
Struktura je implementací abstraktního datového typu " Prioritní fronta " a je pozoruhodná tím, že operace, které nevyžadují odstranění, mají amortizovanou dobu běhu (u binární haldy a binomické haldy je amortizovaná doba běhu ). Kromě standardních operací , , , Fibonacci halda umožňuje provést operaci sloučení dvou hald v čase.
INSERTMINDECREASE-KEYUNION
Struktura
- Fibonacciho halda je sbírka stromů .
- Každý strom v podléhá vlastnosti heap ( angl. min-heap property ): klíč každého uzlu není menší než klíč jeho nadřazeného uzlu.
- Každý uzel v obsahuje následující ukazatele a pole:
- - pole, ve kterém je klíč uložen;
- — ukazatel na nadřazený uzel;
- — ukazatel na jeden z podřízených uzlů;
- - ukazatel na levý sesterský uzel;
- - ukazatel na pravý sesterský uzel;
- - pole, které ukládá počet podřízených uzlů;
- — booleovská hodnota, která označuje, zda uzel ztratil nějaké podřízené uzly od doby, kdy se stal podřízeným uzlem nějakého jiného uzlu.
- Podřízené uzly jsou kombinovány pomocí ukazatelů do jednoho cyklického dvojitě propojeného seznamu podřízených uzlů ( angl. child list ) .
- Kořeny všech stromů v jsou spojeny pomocí ukazatelů a do cyklického dvojitě propojeného seznamu kořenů ( angl. root list ).
- Pro celou Fibonacciho haldu je také uložen ukazatel na uzel s minimálním klíčem , který je kořenem jednoho ze stromů. Tento uzel se nazývá minimální uzel .
- Aktuální počet uzlů v je uložen v .
Operace
Vytváření nové Fibonacciho haldy
Procedura Make_Fib_Heap vrací objekt haldy Fibonacci a = NULL. Nejsou tam žádné stromy .
Zůstatková cena postupu se rovná jeho skutečným nákladům .
Vložení uzlu
Fib_Heap_Insert
1 ← 0
2 ← NULL
3 ← NULL
4 ←
5 ←
6 ← NEPRAVDA
7 Připojení seznamu kořenů obsahujících , k seznamu kořenů
8 if = NULL nebo
9 pak ←
10 ← + 1
Zůstatková cena postupu se rovná jeho skutečným nákladům .
Nalezení minimálního uzlu
Procedura Fib_Heap_Minimum vrací .
Zůstatková cena postupu se rovná jeho skutečným nákladům .
Spojení dvou Fibonacciho hald
Fib_Heap_Union
1 ← Make_Fib_Heap()
2 ←
3 Přidání seznamu kořenů do seznamu kořenů
4 pokud ( = NULL) nebo ( ≠ NULL a < )
5 pak ←
6 ←
7 Uvolněte předměty a
8 se vraťte
Zůstatková cena postupu se rovná jeho skutečným nákladům .
Extrahování minimálního uzlu
Fib_Heap_Extract_Min
1 ←
2 , pokud ≠ NULL
3 pak pro každého potomka uzlu
4 proveďte Přidat do kořenového seznamu
5 ← NULL
6 Odebrat z kořenového seznamu
7 if =
8 pak ← NULL
9 jinak ←
10 Konsolidovat
11 ←
12 vrátit
V jedné z fází operace vytěžování minimálního uzlu se provádí zhutnění ( angl. konsolidace ) seznamu kořenů . K tomu použijte pomocný postup Consolidate. Tento postup používá pomocné pole . If , then je aktuálně kořen se stupněm .
Konsolidujte
1 pro ← 0 až
2 do ← NULL
3 pro každý uzel v kořenovém seznamu
4 proveďte ←
5 ←
6 , zatímco ≠ NULL
7 do ← //Uzel se stejným stupněm jako
8 , pokud
9 , pak vyměňte ↔
10 Fib_Heap_Link
11 ← NULL
12 ←
13 ←
14 ← NULL
15 pro ← 0 až
16 proveďte, pokud ≠ NULL
17 pak Přidat do kořenového seznamu
18 if = NULL nebo
19 pak ←
Fib_Heap_Link
1 Odebrat z kořenového seznamu
2 Vytvořit podřízený uzel , přírůstek
3 ← FALSE
Amortizované náklady na extrakci minimálního uzlu jsou .
Klesající klíč
Fib_Heap_Decrease_Key
1 , pokud
2 , pak chyba "Nový klíč je větší než aktuální"
3 ←
4 ←
5 pokud ≠ NULL a
6 pak Vyjmout
7 Cascading_Cut
8 , pokud
9 pak ←
Vyjmout
1 Odebrat ze seznamu podřízených uzlů , zmenšit
2 Přidat do seznamu kořenů
3 ← NULL
4 ← NEPRAVDA
Cascading_Cut
1 ←
2 , pokud ≠ NULL
3 pak if = FALSE
4 pak ← TRUE
5 else Cut
6 Cascading_Cut
Amortizované náklady na snížení klíče nepřesahují .
Smazání uzlu
Fib_Heap_Delete
1 Fib_Heap_Decrease_Key ∞
2 Fib_Heap_Extract_Min
Amortizovaná doba trvání postupu je .
Viz také
Odkazy
Literatura
- Thomas H. Kormen aj. Algoritmy: konstrukce a analýza. - 2. vyd. - M . : Williams Publishing House , 2007. - S. 1296. - ISBN 5-8459-0857-4 .
- Mehlhorn, Kurt, Sanders, Peter. 6.2.2 Fibonacciho haldy // Algoritmy a datové struktury: Základní sada nástrojů. - Springer, 2008. - 300 s. — ISBN 978-3-540-77978-0 .