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-KEY
UNION
Struktur
- Fibonacci-högen är en samling träd .

- Varje träd i är föremål för heap -egenskapen ( eng. min-heap-egenskap ): nyckeln för varje nod är inte mindre än nyckeln för dess överordnade nod.
- Varje nod i innehåller följande pekare och fält:


- fältet där nyckeln är lagrad;
— pekare till modernoden;
— en pekare till en av barnnoderna;
- pekare till vänster systernod;
- pekare till höger systernod;
- ett fält som lagrar antalet underordnade noder;
— ett booleskt värde som indikerar om noden har förlorat några underordnade noder sedan den blev en undernod till någon annan nod.

- Barnnoder kombineras med hjälp av pekare till en cyklisk dubbellänkad lista med barnnoder ( eng. child list ) .



- Rötterna för alla träd i är sammankopplade med hjälp av pekare och till en cyklisk dubbellänkad lista av rötter ( eng. rotlista ).


- För hela Fibonacci-högen lagras också en pekare till noden med minimumnyckeln , som är roten till ett av träden. Denna nod kallas minimumnoden .

- Det aktuella antalet noder i lagras i .

![{\displaystyle n[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/92ed2faefa5bfbe5a8314ec6f2b3b1ca9bc406c7)
Operationer
Skapa en ny Fibonacci-hög
Proceduren Make_Fib_Heap returnerar ett fibonacci - högobjekt och = NULL. Det finns inga träd .

![{\displaystyle n[H]=0}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c6755b0e87ac6248f20059f3300df0f6cb90f896)
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)

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

Infoga en nod
Fib_Heap_Insert
1 ← 0

![{\displaystyle grad[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4fbb4e65cbfec576877633e2ad6ceaaaae241696)
2 ← NULL
![{\displaystyle p[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1b81272b44de4208e118d4381df4c6828cb52da8)
3 ← NULL
![{\displaystyle barn[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d7983ae8a15176fca40c69829753ebff7acd09cd)
4 ←
5 ←
6 ← FALSK
![{\displaystyle vänster[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0fa7823fa23979d95eb14ab7667a573c22e01b7a)

![{\displaystyle höger[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/11d488d953d9ad638c15d2594ab597b5e653f15e)

![{\displaystyle mark[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/542b7e5368647a254202d3b202a71c2df4bf1954)
7 Bifoga en lista med rötter som innehåller , till en lista med rötter
8 om = NULL eller
9 sedan ←
10 ← + 1

![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)

![{\displaystyle n[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/92ed2faefa5bfbe5a8314ec6f2b3b1ca9bc406c7)
Upplupet anskaffningsvärde för ett förfarande är lika med dess faktiska anskaffningsvärde .

Hitta minsta noden
Proceduren Fib_Heap_Minimum returnerar en .
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
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 < )
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
![{\displaystyle min[H_{1}]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c06be73dfdc2ebd7713d3a946a91127d751c86dd)


![{\displaystyle min[H_{1}]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c06be73dfdc2ebd7713d3a946a91127d751c86dd)
![{\displaystyle min[H_{2}]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7e4c15d462e9bc769e328ba3b93711b75d21de68)
![{\displaystyle-nyckel[min[H_{2}]]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dd38f11d72e5ef38a1dba12f4131e25d75e72ccf)
![{\displaystyle-nyckel[min[H_{1}]]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/05f66202f4a1f1ef6be319ab0caa46a70aa702da)
5 sedan ←
6 ←
7 Släpp objekt och
8 returnerar
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
![{\displaystyle min[H_{2}]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7e4c15d462e9bc769e328ba3b93711b75d21de68)
![{\displaystyle n[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/92ed2faefa5bfbe5a8314ec6f2b3b1ca9bc406c7)
![{\displaystyle n[H_{1}]+n[H_{2}]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e121253884bf636242ef97daaf19c6dffa47226e)

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




![{\displaystyle p[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1b81272b44de4208e118d4381df4c6828cb52da8)
6 Ta bort från rotlista
7 om =
8 sedan ← NULL


![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
9 annat ←
10 Konsolidera
11 ←
12 avkastning
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
![{\displaystyle höger[z]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ef6c0ca5e045f05b51a8e85a71a2652179a28f23)

![{\displaystyle n[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/92ed2faefa5bfbe5a8314ec6f2b3b1ca9bc406c7)
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 .

![{\displaystyle A[0..D[n[H]]]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/16a8aaf0c3fea41669e247dae3c99739997608c7)
![{\displaystyle A[i]=y}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e1773ac5c49b3da8c9e09a416b77c6fe80c7a307)

![{\displaystyle degree[y]=i}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dd44fdeab4b5b858a4e9e6d2c45ffcdcf96af6fc)
Konsolidera
1 för ← 0 till
2 gör ← NULL
![{\displaystyle A[i]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2a0d7a8a3371fad84f7032042e8d1e1caf6aa15e)
3 för varje nod i rotlistan
4 gör ←
5 ←
6 medan ≠ NULL




![{\displaystyle A[d]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/042feac7bdbe07a6252a95c7129cd511404b28ff)
7 gör ← //Nod med samma grad som
8 om
9 byt sedan ut ↔
10 Fib_Heap_Link
11 ← NULL

![{\displaystyle A[d]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/042feac7bdbe07a6252a95c7129cd511404b28ff)
![{\displaystyle-tangent[x]>tangent[y]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/07c4916c2e2b340131b0a221ca3590ecf2f98357)



![{\displaystyle A[d]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/042feac7bdbe07a6252a95c7129cd511404b28ff)
12 ←
13 ←
14 ← NULL


![{\displaystyle A[d]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/042feac7bdbe07a6252a95c7129cd511404b28ff)

![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
15 för ← 0 till
16 gör om ≠ NULL
![{\displaystyle A[i]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2a0d7a8a3371fad84f7032042e8d1e1caf6aa15e)
17 sedan Lägg till i rotlistan
18 om = NULL eller
19 sedan ←
![{\displaystyle A[i]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2a0d7a8a3371fad84f7032042e8d1e1caf6aa15e)
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)
![{\displaystyle A[i]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2a0d7a8a3371fad84f7032042e8d1e1caf6aa15e)
Fib_Heap_Link
1 Ta bort från rotlistan
2 Skapa underordnad nod , öka
3 ← FALSE





![{\displaystyle grad[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4fbb4e65cbfec576877633e2ad6ceaaaae241696)
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"
![{\displaystyle k>tangent[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ce139201a27c8a99d5bc6e6b21ccff58421d5225)
3 ←
4 ←
5 om ≠ NULL och
6 sedan Cut
7 Cascading_Cut
8 om
9 sedan ←
![{\displaystyle-nyckel[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/97b36173e5d88ef517878d66a8682fab5bdbabbd)



![{\displaystyle-tangent[x]<tangent[y]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2b19c276ef004ee01d9243b7dae5ca4d3550d9b6)

![{\displaystyle min[H]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a9c75b5f06b71957bc80e0c4e56425cdf8f30b07)

Klipp
1 Ta bort från listan över underordnade noder , minska
2 Lägg till i listan över rötter
3 ← NULL



![{\displaystyle grad[y]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a84c755349b58d4dbdf25eee53cabead167a765c)


![{\displaystyle p[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1b81272b44de4208e118d4381df4c6828cb52da8)
4 ← FALSKT
![{\displaystyle mark[x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/542b7e5368647a254202d3b202a71c2df4bf1954)
Cascading_Cut
1 ←
2 om ≠ NULL



3 sedan om = FALSK
![{\displaystyle mark[y]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/aecc871ae5dc12bfc3206f13c2a545fcd974bae4)
4 sedan ← TRUE
![{\displaystyle mark[y]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/aecc871ae5dc12bfc3206f13c2a545fcd974bae4)
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
- Thomas H. Kormen et al Algoritmer: konstruktion och analys. - 2:a uppl. - M . : Williams Publishing House , 2007. - S. 1296. - ISBN 5-8459-0857-4 .
- Mehlhorn, Kurt, Sanders, Peter. 6.2.2 Fibonacci Heaps // Algoritmer och datastrukturer: Den grundläggande verktygslådan. - Springer, 2008. - 300 sid. — ISBN 978-3-540-77978-0 .