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

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