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
- A Fibonacci kupac fák gyűjteménye .
- Minden fára vonatkozik a kupac tulajdonság ( eng. min-heap property ): az egyes csomópontok kulcsa nem kisebb, mint a szülőcsomópont kulcsa.
- Minden egyes csomópont a következő mutatókat és mezőket tartalmazza:
- - a mező, amelyben a kulcsot tárolják;
- — mutató a szülőcsomópontra;
- — egy mutató az egyik gyermekcsomópontra;
- - mutató a bal oldali testvércsomópontra;
- - mutató a jobb testvércsomópontra;
- - egy mező, amely a gyermek csomópontok számát tárolja;
- — logikai érték, amely azt jelzi, hogy a csomópont elveszített-e gyermekcsomópontokat, mióta egy másik csomópont gyermekcsomópontja lett.
- Az utódcsomópontokat mutatók segítségével egy ciklikus , duplán összekapcsolt gyermekcsomópont -listává ( angol gyereklista ) egyesítjük .
- Az összes fa gyökerei mutatók segítségével kapcsolódnak össze egy ciklikus, kétszeresen összekapcsolt gyökérlistává ( eng. root lista ).
- A teljes Fibonacci kupac esetében a minimális kulcsú csomópontra mutató mutató is tárolódik, amely az egyik fa gyökere. Ezt a csomópontot minimum csomópontnak nevezzük .
- A csomópontok aktuális száma a következőben tárolódik: .
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
- Thomas H. Kormen et al. Algoritmusok: szerkesztés és elemzés. - 2. kiadás - M . : Williams Publishing House , 2007. - S. 1296. - ISBN 5-8459-0857-4 .
- Mehlhorn, Kurt, Sanders, Peter. 6.2.2 Fibonacci kupacok // Algoritmusok és adatstruktúrák: Az alapvető eszköztár. - Springer, 2008. - 300 p. — ISBN 978-3-540-77978-0 .