Fibonacci hög

Fibonacci heap ( eng.  Fibonacci heap ) är en datastruktur som är en uppsättning träd ordnade i enlighet med egenskapen hos en icke-minskande pyramid. Fibonacci - högar introducerades av Michael Fredman och Robert Tarjan 1984 .

Strukturen är en implementering av den abstrakta datatypen " Priority Queue " och är anmärkningsvärd genom att operationer som inte kräver radering har en amorterad körtid på (för en binär hög och en binomial hög är den avskrivna körtiden ). Förutom standardoperationerna , , , låter Fibonacci-högen dig utföra operationen att slå samman två högar i tid. INSERTMINDECREASE-KEYUNION

Struktur

Operationer

Skapa en ny Fibonacci-hög

Proceduren Make_Fib_Heap returnerar ett fibonacci - högobjekt och = NULL. Det finns inga träd .

Upplupet anskaffningsvärde för ett förfarande är lika med dess faktiska anskaffningsvärde .

Infoga en nod

Fib_Heap_Insert 1 ← 0 2 ← NULL 3 ← NULL 4 ← 5 ← 6 ← FALSK 7 Bifoga en lista med rötter som innehåller , till en lista med rötter 8 om = NULL eller 9 sedan ← 10 ← + 1

Upplupet anskaffningsvärde för ett förfarande är lika med dess faktiska anskaffningsvärde .

Hitta minsta noden

Proceduren Fib_Heap_Minimum returnerar en .

Upplupet anskaffningsvärde för ett förfarande är lika med dess faktiska anskaffningsvärde .

Union av två Fibonacci-högar

Fib_Heap_Union 1 ← Make_Fib_Heap() 2 ← 3 Lägga till en lista med rötter till en lista med rötter 4 om ( = NULL) eller ( ≠ NULL och < ) 5 sedan ← 6 ← 7 Släpp objekt och 8 returnerar

Upplupet anskaffningsvärde för ett förfarande är lika med dess faktiska anskaffningsvärde .

Extraherar minimumnoden

Fib_Heap_Extract_Min 1 ← 2 om ≠ NULL 3 gör sedan för varje barn i nod 4 Lägg till i rotlistan 5 ← NULL 6 Ta bort från rotlista 7 om = 8 sedan ← NULL 9 annat ← 10 Konsolidera 11 ← 12 avkastning

I ett av stegen av operationen för att extrahera den minsta noden, utförs komprimering ( eng.  konsolidering ) av listan över rötter . För att göra detta, använd Consolide helper-proceduren. Denna procedur använder en extra array . If , då är för närvarande en rot med grad .

Konsolidera 1 för ← 0 till 2 gör ← NULL 3 för varje nod i rotlistan 4 gör ← 5 ← 6 medan ≠ NULL 7 gör ← //Nod med samma grad som 8 om 9 byt sedan ut ↔ 10 Fib_Heap_Link 11 ← NULL 12 ← 13 ← 14 ← NULL 15 för ← 0 till 16 gör om ≠ NULL 17 sedan Lägg till i rotlistan 18 om = NULL eller 19 sedan ← Fib_Heap_Link 1 Ta bort från rotlistan 2 Skapa underordnad nod , öka 3 ← FALSE

Den upplupna kostnaden för att extrahera minimumnoden är .

Minskande nyckel

Fib_Heap_Decrease_Key 1 om 2 då felet "Ny nyckel är större än nuvarande" 3 ← 4 ← 5 om ≠ NULL och 6 sedan Cut 7 Cascading_Cut 8 om 9 sedan ← Klipp 1 Ta bort från listan över underordnade noder , minska 2 Lägg till i listan över rötter 3 ← NULL 4 ← FALSKT Cascading_Cut 1 ← 2 om ≠ NULL 3 sedan om = FALSK 4 sedan ← TRUE 5 else Cut 6 Cascading_Cut

Upplupet anskaffningsvärde för nyckelminskning överstiger inte .

Ta bort en nod

Fib_Heap_Delete 1 Fib_Heap_Decrease_Key ∞ 2 Fib_Heap_Extract_Min

Den amorterade löptiden för proceduren är .

Se även

Länkar

Litteratur