Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Adalheidis Rehagen Geändert vor über 10 Jahren
1
WS 2006-07 Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer
2
2WS 2006-07 Vorrangswarteschlangen Implementationen ListeHeapBin. – Q.Fib.-Hp. insertO(1)O(log n) O(1) minO(n)O(1)O(log n)O(1) delete- min O(n)O(log n) O(log n)* meld (m n) O(1) O(n) od. O(m log n) O(log n)O(1) decr.-keyO(1)O(log n) O(1)* * = amortisierte Kosten Q.delete(e) = Q.decreasekey(e, - ) + Q.deletemin()
3
3WS 2006-07 Fibonacci-Heaps als lazy Binomial Queues Verschmelze Bäume nur dann, wenn ohnehin alle Wurzeln betrachtet werden müssen Lasse auch Bäume zu, die keine Binomialbäume sind 219 13458 3621 24 158352 79 117
4
4WS 2006-07 Erweiterte Child-Sibling Darstellung Knotenformat: parent entrydegree childmark leftright 219 13458 3621 24 158352 79 117 min
5
5WS 2006-07 Vorteile der zusätzlichen Zeiger Zugriff auf Minimum (accessmin) jederzeit in O(1) (allerdings muss der min-Zeiger immer aktuell gehalten werden) Verketten von (und damit auch das Einfügen in) zirkulären Listen ist in O(1) möglich Entfernen aus doppelt verketteten Listen ebenfalls in O(1)
6
6WS 2006-07 Fibonacci-Bäume: Vereinigung (Link) Vereinigung zweier Bäume B, B´ von gleicher Ordnung (degree) k Link-Operation: Ausführbar in konstanter Zeit: O(1) Resultierender Baum hat Grad k+1 Unterschied zu Binomial Queues: Ursprungsbäume müssen nicht dieselbe Gestalt haben. 2 138 3621 24 8352 2 138 3621 24 8352
7
7WS 2006-07 Verschmelzen zweier F-Heaps (meld) Hänge die Wurzellisten der beiden F-Heaps aneinander. Aktualisiere den min-Zeiger, so dass er auf den kleineren der beiden Minimalknoten zeigt Q.meld(F-Heap F): 1 Q.min.right.left = F.min.left 2 F.min.left.right = Q.min.right 3 Q.min.right = F.min 4 F.min.left = Q.min 5 Q.min = min { F.min, Q.min }
8
8WS 2006-07 Fibonacci-Heaps: Operationen Q.initialize: Q.root = null Q.insert(e): F = new F-Heap(e) Q.meld(F) Zeit = O(1)
9
9WS 2006-07 Fibonacci-Heaps: Deletemin Q.deletemin(): 1. Entferne den min-Knoten und hänge stattdessen die Lister seiner Söhne in die Wurzelliste ein. 2. Gehe die Wurzelliste durch: (a) bestimme den neuen Minimalknoten (b) konsolidiere dabei die Liste, d.h. verbinde Bäume mit gleichem Wurzelgrad (link) Zeit: ?
10
10WS 2006-07 deletemin: Beispiel 219 13458 3621 24 158352 79 117
11
WS 2006-07 deletemin: Beispiel 19 24 8352 79 117 13458 362115
12
12WS 2006-07 deletemin: Beispiel 19 24 8352 79 11 7 13458 362115
13
13WS 2006-07 consolidate: Beispiel 1913458 3621 24 15 8352 117 012345 Rang-Array:
14
14WS 2006-07 Kosten von deletemin Das eigentliche Entfernen geht in O(1) Kosten hängen im Wesentlichen vom Konsolidierungsprozess ab, d.h. von der Länger der Wurzelliste und der Anzahl der notwendigen link-Operationen Wie lässt sich das Konsolidieren effizient bewerkstelligen? Beobachtungen: Jeder Wurzelknoten muss mindestens einmal betrachtet werden Am Ende darf es für jeden möglichen Rang höchstens einen Knoten geben
15
15WS 2006-07 consolidate: Beispiel 1913458 3621 24 15 8352 117 012345 Rang-Array:
16
16WS 2006-07 consolidate: Beispiel 1913458 3621 24 15 8352 117 012345 Rang-Array:
17
17WS 2006-07 consolidate: Beispiel 19 13458 3621 24 15 8352 117 012345 Rang-Array:
18
18WS 2006-07 consolidate: Beispiel 19 13 458 3621 24 15 8352 117 012345 Rang-Array:
19
19WS 2006-07 consolidate: Beispiel 19 13 45 8 3621 24 15 8352 117 012345 Rang-Array:
20
20WS 2006-07 consolidate: Beispiel 19 13 45 8 3621 24 15 8352 117
21
21WS 2006-07 Analyse von consolidate rankArray = new FibNode[maxRank(n)+1]; // Erstelle das Array for each FibNode N in rootlist { while (rankArray[N.rank] != null) { // Position besetzt N = link(N, rankArray[N.rank]); // Verbinde Bäume rankArray[N.rank-1] = null; // Lösche alte Pos. } rankArray[N.rank] = N; // Eintragen in Array }
22
22WS 2006-07 Analyse for each FibNode N in rootlist { while (rankArray[N.rank] != null) { N = link(N, rankArray[N.rank]); rankArray[N.rank-1] = null; } rankArray[N.rank] = N; } Sei k = #Wurzelknoten vor dem Konsolidieren. Diese k Knoten lassen sich aufteilen in W ={Knoten, die am Ende noch in der Wurzelliste sind} L = {Knoten, die an einen anderen Knoten angehängt wurden} Es gilt:Kosten(for-Schleife) = Kosten(W) + Kosten(L) = |rankArray| + #links
23
23WS 2006-07 Kosten von deletemin Vorläufig: O(maxRank(n)) + O(#links)
24
24WS 2006-07 Fibonacci-Heaps: decreasekey Q.decreasekey(FibNode N, int k) : Setze den Schlüsselwert von N auf k herab. Wenn die Heap-Bedingung nicht mehr erfüllt ist ( k < N.parent.key ): Trenne N von seinem Vater ab (mit cut) und hänge ihn (rechts vom Minimalknoten) in die Wurzelliste ein Falls der Vater markiert ist ( N.parent.mark == true ), trenne auch ihn von seinem Vater ab; wenn auch dessen Vater markiert ist, trenne auch diesen ab usw. (cascading cuts) Markiere den Knoten, dessen Sohn zuletzt abgetrennt wurde (sofern dieser kein Wurzelknoten ist). Aktualisiere den Minimum-Zeiger (falls k < min.key ).
25
25WS 2006-07 Beispiel für decreasekey 65 13458 3621 24 158352 117 64 Setze den Schlüssel 64 auf 14 herab.
26
26WS 2006-07 Beispiel für decreasekey 65 13458 3621 24 158352 117 64 14
27
27WS 2006-07 Beispiel für decreasekey 65 13458 3621 24 158352 117 64 14
28
28WS 2006-07 Beispiel für decreasekey 65 13458 36 21 24 158352 117 64 14
29
29WS 2006-07 Beispiel für decreasekey 65 13458 36 21 24 158352 117 64 14
30
30WS 2006-07 Kosten von decreasekey Schlüssel neu setzen und Vergleich mit Vater: O(1) Abtrennen vom Vaterknoten und in Wurzelliste:O(1) Cascading cuts:#cuts Markieren des letzten Knotens:O(1) Kosten hängen von der Anzahl der cascading cuts ab.
31
31WS 2006-07 Amortisierte Analyse – Potentialmethode Ordne jedem Zustand der Datenstruktur einen Wert Ф (Potential) zu Die amortisierten Kosten ai der i-ten Operation sind definiert als ai = ci + (Фi – Фi-1) die tatsächlichen Kosten zuzüglich der Änderung des Potentials durch die i-te Operation. Definiere Фi = wi + 2mi mit wi = Zahl der Wurzelknoten und mi = Zahl der markierten Knoten (die nicht Wurzeln sind) Beispiel: insert tatsächliche Kosten: ci = O(1) Potential erhöht sich um 1, also Фi – Фi-1 = 1 ai = ci + 1
32
32WS 2006-07
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.