Fibonacci bunke
Fibonacci heap ( eng. Fibonacci heap ) er en datastruktur, der er et sæt af træer ordnet i overensstemmelse med egenskaben for en ikke-aftagende pyramide. Fibonacci-dynger blev introduceret af Michael Fredman og Robert Tarjan i 1984 .
Strukturen er en implementering af den abstrakte datatype " Priority Queue " og er bemærkelsesværdig ved, at operationer, der ikke kræver sletning, har en amortiseret køretid på (for en binær heap og en binomial heap er den amortiserede køretid ). Ud over standardoperationerne , , , giver Fibonacci-heapen dig mulighed for at udføre operationen med at slå to dynger sammen i tide.
INSERTMINDECREASE-KEYUNION
Struktur
- Fibonacci-bunken er en samling af træer .
- Hvert træ i er underlagt heap -egenskaben ( eng. min-heap-egenskab ): nøglen til hver node er ikke mindre end nøglen til dens overordnede node.
- Hver node i indeholder følgende pointere og felter:
- - det felt, hvori nøglen er gemt;
- — pointer til den overordnede node;
- — en pegepind til en af børneknuderne;
- - markør til venstre søsterknude;
- - pointer til højre søsterknude;
- - et felt, der gemmer antallet af børneknuder;
- — en boolsk værdi, der angiver, om knudepunktet har mistet nogen underknudepunkter, siden det blev en underknude til en anden knude.
- Underordnede noder kombineres ved hjælp af pointere til én cyklisk dobbeltforbundet liste over underordnede noder ( eng. child list ) .
- Rødderne af alle træer i er forbundet ved hjælp af pointere og ind i en cyklisk dobbeltforbundet liste af rødder ( eng. root list ).
- For hele Fibonacci-bunken er der også gemt en pointer til noden med minimumsnøglen , som er roden til et af træerne. Denne node kaldes minimumsknuden .
- Det aktuelle antal noder i er gemt i .
Operationer
Oprettelse af en ny Fibonacci-bunke
Make_Fib_Heap-proceduren returnerer et fibonacci-heap-objekt , og = NULL. Der er ingen træer .
Den amortiserede kostpris for en procedure er lig med dens faktiske kostpris .
Indsættelse af en node
Fib_Heap_Insert
1 ← 0
2 ← NULL
3 ← NULL
4 ←
5 ←
6 ← FALSK
7 Vedhæftning af en liste over rødder indeholdende , til en liste over rødder
8 hvis = NULL eller
9 så ←
10 ← + 1
Den amortiserede kostpris for en procedure er lig med dens faktiske kostpris .
Find minimumsknuden
Fib_Heap_Minimum-proceduren returnerer en .
Den amortiserede kostpris for en procedure er lig med dens faktiske kostpris .
Union af to Fibonacci-dynger
Fib_Heap_Union
1 ← Make_Fib_Heap()
2 ←
3 Tilføjelse af en liste over rødder til en liste over rødder
4 hvis ( = NULL) eller ( ≠ NULL og < )
5 derefter ←
6 ←
7 Slip objekter og
8 returnerer
Den amortiserede kostpris for en procedure er lig med dens faktiske kostpris .
Udpakning af minimumsknuden
Fib_Heap_Extract_Min
1 ←
2 hvis ≠ NULL
3 og derefter for hvert barn af node
4 , skal du tilføje til rodliste
5 ← NULL
6 Fjern fra rodliste
7 hvis =
8 så ← NULL
9 andet ←
10 Konsolider
11 ←
12 retur
På et af stadierne af operationen med at udtrække minimumsknuden udføres komprimering ( eng. konsolidering ) af listen over rødder . For at gøre dette skal du bruge Consolide helper-proceduren. Denne procedure bruger et hjælpearray . Hvis , så er i øjeblikket en rod med grad .
Konsolider
1 for ← 0 til
2 gør ← NULL
3 for hver node i rodlisten
4 gør ←
5 ←
6 mens ≠ NULL
7 gør ← //Knudepunkt med samme grad som
8 hvis
9 så byt ↔
10 Fib_Heap_Link
11 ← NULL
12 ←
13 ←
14 ← NULL
15 for ← 0 til
16 gør hvis ≠ NULL
17 derefter Tilføj til rodliste
18 hvis = NULL eller
19 så ←
Fib_Heap_Link
1 Fjern fra rodliste
2 Lav underordnet node , øg
3 ← FALSK
Den amortiserede pris for at udvinde minimumsknuden er .
Aftagende nøgle
Fib_Heap_Decrease_Key
1 hvis
2 så fejlen "Ny nøgle er større end den nuværende"
3 ←
4 ←
5 hvis ≠ NULL og
6 derefter Cut
7 Cascading_Cut
8 hvis
9 derefter ←
Klip
1 Fjern fra listen over underordnede noder , reducer
2 Føj til listen over rødder
3 ← NULL
4 ← FALSK
Cascading_Cut
1 ←
2 hvis ≠ NULL
3 så hvis = FALSK
4 derefter ← TRUE
5 andet Klip
6 Cascading_Cut
Den amortiserede kostpris for nøglereduktion overstiger ikke .
Sletning af en node
Fib_Heap_Delete
1 Fib_Heap_Decrease_Key ∞
2 Fib_Heap_Extract_Min
Den amortiserede køretid for proceduren er .
Se også
Links
Litteratur
- Thomas H. Kormen et al. Algoritmer: konstruktion og analyse. - 2. udg. - M . : Williams Publishing House , 2007. - S. 1296. - ISBN 5-8459-0857-4 .
- Mehlhorn, Kurt, Sanders, Peter. 6.2.2 Fibonacci-dynger // Algoritmer og datastrukturer: Den grundlæggende værktøjskasse. - Springer, 2008. - 300 s. — ISBN 978-3-540-77978-0 .