Fibonacci kupac

A Fibonacci kupac ( eng.  Fibonacci heap ) egy olyan adatstruktúra , amely egy nem csökkenő piramis tulajdonságának megfelelően rendezett fák halmaza . A Fibonacci kupacokat Michael Fredman és Robert Tarjan mutatta be 1984 -ben .

A struktúra a " Priority Queue " absztrakt adattípus megvalósítása , és figyelemre méltó, hogy a törlést nem igénylő műveletek amortizált futási ideje ( bináris kupac és binomiális kupac esetén az amortizált futási idő ). A szokásos , , , műveletek mellett a Fibonacci kupac lehetővé teszi két kupac egyesítésének műveletét is időben.INSERTMINDECREASE-KEYUNION

Szerkezet

Műveletek

Új Fibonacci kupac létrehozása

A Make_Fib_Heap eljárás egy fibonacci kupac objektumot ad vissza , és = NULL. Nincsenek fák .

Egy eljárás amortizált bekerülési értéke megegyezik a tényleges bekerülési értékkel .

Csomópont beszúrása

Fib_Heap_Insert 1 ← 0 2 ← NULL 3 ← NULL 4 ← 5 ← 6 ← HAMIS 7 A következőt tartalmazó gyökök listájának csatolása a gyökérlistához 8 ha = NULL vagy 9 , akkor ← 10 ← + 1

Egy eljárás amortizált bekerülési értéke megegyezik a tényleges bekerülési értékkel .

A minimális csomópont megkeresése

A Fib_Heap_Minimum eljárás egy .

Egy eljárás amortizált bekerülési értéke megegyezik a tényleges bekerülési értékkel .

Két Fibonacci kupac egyesülése

Fib_Heap_Union 1 ← Make_Fib_Heap() 2 ← 3 Gyökerek listájának hozzáadása a gyökérlistához 4 ha ( = NULL) vagy ( ≠ NULL és < ) 5 majd ← 6 ← 7 Objektumok elengedése és 8 visszatérés

Egy eljárás amortizált bekerülési értéke megegyezik a tényleges bekerülési értékkel .

A minimális csomópont kibontása

Fib_Heap_Extract_Min 1 ← 2 , ha ≠ NULL 3 , majd a 4. csomópont minden gyermekéhez tegye a Hozzáadás a gyökérlistához 5 ← NULL 6 Eltávolítás a gyökérlistából 7 if = 8 then ← NULL 9 más ← 10 Konszolidálás 11 ← 12 visszatérés

A minimális csomópont kinyerésének műveletének egyik szakaszában a gyökérlista tömörítése ( eng.  consolidating ) történik . Ehhez használja a Consolidate helper eljárást. Ez az eljárás egy segédtömböt használ . Ha , akkor jelenleg egy fokos gyök .

Konszolidálja az 1 -et ← 0 -tól 2 -ig ← NULL -hoz 3 a gyökérlista minden csomópontjához 4 tegye ← 5 ← 6 , míg ≠ NULL 7 do ← //Csomópont ugyanolyan mértékben, mint 8 , ha 9 , majd csere ↔ 10 Fib_Heap_Link 11 ← NULL 12 ← 13 ← 14 ← NULL 15 ← 0 és 16 között tegye , ha ≠ NULL 17 , majd Hozzáadás a gyökérlistához 18 if = NULL vagy 19 , akkor ← Fib_Heap_Link 1 Eltávolítás a gyökérlistából 2 Legyen gyermek csomópont , növekmény 3 ← FALSE

A minimális csomópont kitermelésének amortizált költsége .

Csökkentő billentyű

Fib_Heap_Decrease_Key 1 , ha 2 , akkor hibaüzenet : "Az új kulcs nagyobb, mint az aktuális" 3 ← 4 ← 5 ha ≠ NULL és 6 akkor Cut 7 Cascading_Cut 8 ha 9 akkor ← Kivágás 1 Eltávolítás a gyermek csomópontok listájából , kicsinyítés 2 Hozzáadás a gyökérlistához 3 ← NULL 4 ← HAMIS Cascading_Cut 1 ← 2 , ha ≠ NULL 3 akkor ha = HAMIS 4 , majd ← IGAZ 5 else Cut 6 Cascading_Cut

A kulcscsökkentés amortizált költsége nem haladja meg a .

Csomópont törlése

Fib_Heap_Delete 1 Fib_Heap_Decrease_Key ∞ 2 Fib_Heap_Extract_Min

Az eljárás amortizált lefutási ideje .

Lásd még

Linkek

Irodalom