Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

WS 2006-07 Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer.

Ähnliche Präsentationen


Präsentation zum Thema: "WS 2006-07 Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer."—  Präsentation transkript:

1 WS 2006-07 Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer

2 2WS 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

3 3WS 2006-07 Fibonacci-Heaps: Operationen Q.initialize: Q.root = null Q.insert(e): F = new F-Heap(e) Q.meld(F) Zeit = O(1)

4 4WS 2006-07 Fibonacci-Heaps: deletemin Q.deletemin(): 1. Entferne den min-Knoten und hänge stattdessen die Liste 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) Lösche dabei evtl. vorhandene Markierungen der Knoten, die zu Söhnen eines anderen werden.

5 5WS 2006-07 deletemin: Beispiel 219 13458 3621 24 158352 79 117

6 6WS 2006-07 deletemin: Beispiel 19 24 8352 79 117 13458 362115

7 7WS 2006-07 deletemin: Beispiel 19 24 8352 79 117 13 45 8 362115

8 8WS 2006-07 deletemin: Beispiel 19 24 8352 79 11 7 1345 8 3621 15

9 9WS 2006-07 deletemin: Beispiel 19 24 8352 79 11 7 13458 362115

10 10WS 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

11 11WS 2006-07 consolidate: Beispiel 1913458 3621 24 15 8352 117 012345 Rang-Array:

12 12WS 2006-07 consolidate: Beispiel 1913458 3621 24 15 8352 117 012345 Rang-Array:

13 13WS 2006-07 consolidate: Beispiel 19 13458 3621 24 15 8352 117 012345 Rang-Array:

14 14WS 2006-07 consolidate: Beispiel 19 13 458 3621 24 15 8352 117 012345 Rang-Array:

15 15WS 2006-07 consolidate: Beispiel 19 13 45 8 3621 24 15 8352 117 012345 Rang-Array:

16 16WS 2006-07 consolidate: Beispiel 19 13 45 8 3621 24 15 8352 117

17 17WS 2006-07 Kosten von deletemin Vorläufig: O(maxRank(n)) + #links Dabei ist maxRank(n) der höchstmögliche Array-Eintrag, d.h. der größtmögliche Wurzelgrad (Rang). Im worst case ist #links = n – 1 Aber dies kann nur unter bestimmten Voraussetzungen eintreten! Amortisierte Analyse liefert realistischere Laufzeitabschätzung

18 18WS 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 ).

19 19WS 2006-07 Beispiel für decreasekey 65 13458 3621 24 158352 117 64 Setze den Schlüssel 64 auf 14 herab.

20 20WS 2006-07 Beispiel für decreasekey 65 13458 3621 24 158352 117 64 14

21 21WS 2006-07 Beispiel für decreasekey 65 13458 3621 24 158352 117 64 14

22 22WS 2006-07 Beispiel für decreasekey 65 13458 36 21 24 158352 117 64 14

23 23WS 2006-07 Beispiel für decreasekey 65 13458 36 21 24 158352 117 64 14

24 24WS 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. Im worst case kann auch #cuts = n – 1 sein. Dafür muss aber eine ganz bestimmte Folge von Operationen vorangegangen sein. Amortisierte Analyse betrachtet Laufzeit einer Operation im Kontext der vorangegangenen Operationen!

25 25WS 2006-07 Amortisierte Analyse – Potentialmethode Ordne jedem Zustand i der Datenstruktur einen Wert Ф i (Potential) zu Die amortisierten Kosten a i der i-ten Operation sind definiert als a i = c i + (Ф i – Ф i-1 ) d.h. die tatsächlichen Kosten zuzüglich der Änderung des Potentials, die durch die i-te Operation herbeigeführt wird. Für Fibonacci-Heaps definieren wir Ф i = w i + 2m i mit w i = Zahl der Wurzelknoten und m i = Zahl der markierten Knoten, die nicht Wurzeln sind

26 26WS 2006-07 Potential: Beispiel 25 13458 3621 24 158352 117 64 w i = m i = Ф i =

27 27WS 2006-07 Potentialmethode: Kosten von insert Insert: Füge den neuen Knoten in die Wurzelliste ein tatsächliche Kosten: c i = O(1) Potential erhöht sich um 1, also Ф i – Ф i-1 = 1 Amortisierte Kosten:a i = c i + 1

28 28WS 2006-07 Potentialmethode: Kosten von decreasekey Tatsächliche Kosten: c i = O(1) + #cascading cuts Potentialänderung: w i w i-1 + 1 + #cascading cuts m i m i-1 + 1 – #cascading cuts Ф i – Ф i-1 = w i + 2m i – (w i-1 +2m i-1 ) = w i – w i-1 + 2(m i – m i-1 ) 1 + #cascading cuts + 2(1 – #cascading cuts) = 3 – #cascading cuts Amortisierte Kosten: a i = c i + (Ф i – Ф i-1 ) O(1) + #cascading cuts + 3 – #cascading cuts

29 29WS 2006-07 Potentialmethode: Kosten von deletemin Tatsächliche Kosten: c i = O(maxRank(n)) + #links Potentialänderung: w i = w i-1 – 1 + rank(min) – #links w i-1 + maxRank(n) – #links m i m i-1 Ф i – Ф i-1 = w i + 2m i – (w i-1 + 2m i-1 ) = w i – w i-1 + 2(m i – m i-1 ) maxRank(n) – #links Amortisierte Kosten: a i = c i + (Ф i – Ф i-1 ) O(maxRank(n)) + #links + maxRank(n) – #links

30 30WS 2006-07 Bestimmung von maxRank maxRank(n) ist die maximal mögliche Zahl von Söhnen, die ein Knoten in einem Fibonacci-Heap mit n Elementen haben kann. Wir wollen zeigen, dass diese Zahl durch O(log n) beschränkt ist. Umgekehrt bedeutet dies, dass jeder Knoten eine Mindestzahl an Nachfahren haben muss, die exponentiell in der Anzahl seiner Söhne ist.

31 31WS 2006-07 Berechnung von maxRank(n) Lemma 1: Sei N ein Knoten in einem Fibonacci-Heap und k = N.rank. Betrachte die Söhne C 1,..., C k von N in der Reihenfolge, in der sie (mit link) zu N hinzugefügt wurden. Dann gilt: (1)C 1.rank 0 (2) C i.rank i - 2für i = 2,..., k Beweis: (1) klar (2)Als C i zum Sohn von N wurde, waren C 1,..., C i-1 schon Söhne von N, d.h. es war N.rank i-1. Da durch link immer Knoten mit gleichem Rang verbunden werden, war beim Einfügen also auch C i.rank i-1. Seither kann C i höchstens einen Sohn verloren haben (wegen cascading cuts), daher muss gelten: C i.rank i - 2

32 32WS 2006-07 Berechnung von maxRank(n) Lemma 2: Sei N ein Knoten in einem Fibonacci-Heap und k = N.rank. Sei size(N) = die Zahl der Knoten im Teilbaum mit Wurzel N. Dann gilt:size(N) F k+2 1.618 k D.h. ein Knoten mit k Söhnen hat mind. F k+2 Nachkommen (inkl. sich selbst). Beweis: Sei S k = min {size(N) | N mit N.rank = k}, d.h. die kleinstmögliche Größe eines Baums mit Wurzelrang k. (Klar: S 0 = 1 und S 1 = 2.) Seien wieder C 1,..., C k die Söhne von N in der Reihenfolge, in der sie zu N hinzugefügt wurden. Es ist size(N) S k =

33 33WS 2006-07 Berechnung von maxRank(n) Beweis: Sei S k = min {size(N) | N mit N.rank = k}, d.h. die kleinstmögliche Größe eines Baums mit Wurzelrang k. Seien wieder C 1,..., C k die Söhne von N in der Reihenfolge, in der sie zu N hinzugefügt wurden. Es ist size(N) S k = 13 36 21 10 3214 61

34 34WS 2006-07 Berechnung von maxRank(n) Erinnerung: Fibonacci-Zahlen F 0 = 0 F 1 = 1 F k+2 = F k+1 + F k für k 0 Die Folge der Fibonacci-Zahlen wächst exponentiell mit F k+2 1.618 k Es gilt außerdem:F k+2 = (einfacher Beweis durch vollständige Induktion über k.)

35 35WS 2006-07 Zusammenfassung Es ist außerdem S 0 = 1 = F 2 und S 1 = 2 = F 3 Damit ist klar: S k = F k+1 (Beweis per Induktion) Für einen Knoten N mit Rang k ist also size(N) S k = F k+1 1.618 k

36 36WS 2006-07 Berechnung von maxRank(n) Satz: Der maximale Rang maxRank(n) eines beliebigen Knotens in einem Fibonacci-Heap mit n Knoten ist beschränkt durch O(log n). Beweis: Sei N ein beliebiger Knoten eines Fibonacci-Heaps mit n Knoten und sei k = N.rank. Es istn size(N) 1.618 k (nach Lemma 2) Daher istk log 1.618 (n) = O(log n)

37 37WS 2006-07 Zusammenfassung Lineare Liste(Min-)Heap Fibonacci-Heap insert: O(1)O(log n) O(1) min: O(n)O(1) O(1) deletemin: O(n) O(log n) O(log n)* decreasekey: O(1)O(log n) O(1)* delete: O(n) O(log n) O(log n)* *Amortisierte Kosten


Herunterladen ppt "WS 2006-07 Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer."

Ähnliche Präsentationen


Google-Anzeigen