Kapitel 5 Balancierte Bäume Wir haben gesehen, daß fast alle Operationen auf Bäume von der Höhe des Baumes abhängen. Wir wollen uns in diesem Kapitel überlegen, wie wir die Bäume so aufbauen, daß eine möglichst geringe Höhe dabei erzielt wird und unter Einfügeund Lösch-Operationen auch erhalten bleibt. Die ersten beiden Abschnitte führen jeweils Konzepte der “Balanciertheit” eines binären Baums ein. Wenn nötig, werden nach Einfüge- und Löschoperationen Rotationen von Teilbäumen um Knoten durchgeführt, die die Balance wiederherstellen. Wegen der starken Ähnlichkeit behandeln wir in der Vorlesung nur das erste Konzept ausführlich. Die beiden letzten Versionen der Balanciertheit beziehen sich auf allgemeine Bäume, in denen die Daten ausschließlich in den Blättern abgelegt sind, und die inneren Knoten nur der Verwaltung des Baums dienen. 5.1 AVL-Bäume Definition 5.1. Ein binärer Baum heißt AVL-Baum (nach Adelson-Velskii und Landis), wenn sich in jedem Knoten die Höhe des linken und die Höhe des rechten Teilbaums um höchstens 1 unterscheiden. Wir werden zeigen, daß die Höhe von AVL-Bäumen logarithmisch von der Anzahl der Knoten abhängt. Um dies einzusehen, betrachten wir knotenminimale AVLBäume. 5.1.1 Fibonacci-Heaps Ein Fibonacci-Heap Fh der Höhe h − 1 ist wie folgt rekursiv definiert (vgl. Abbildung 5.1): F1 besteht aus einer Wurzel, F2 aus einer Wurzel mit einem Blatt und Fh , h ≥ 3 besteht aus einer Wurzel, einem Teilbaum F h−1 und einem Teilbaum Fh−2 . Per Induktion zeigt man: i) |Fh | = 1 + |Fh−1 | + |Fh−2 |. ii) Fibonacci-Heaps sind knotenminimale AVL-Bäume. Daraus ergibt sich das folgende Lemma: 66 67 KAPITEL 5. BALANCIERTE BÄUME F 3 F 1 F h F 2 Fh-2 F h-1 Abbildung 5.1: Konstruktion der Fibonacci-Heaps F 0 , F1 , F2 , . . . Fh Lemma 5.2. Ein AVL- Baum der Höhe h hat höchstens 2h+1 − 1 und mindestens √ √ √ √ 5+2 5 1+ 5 h 5−2 5 1− 5 h ( ) + ( ) −1 5 2 5 2 Knoten. Beweis: Die obere Schranke folgt aus Lemma 2.7. Die untere Schranke folgt per Induktion aus der Anzahl der Knoten von Fibonacci-Heaps: |Fh | = 1 + |Fh−1 | + |Fh−2 | √ √ √ 5+2 5 1+ 5 h−1 5−2 5 5 2 5 √ √ √ 1+ 5 h−2 5−2 5 5+2 5 5 2 5 √ √ √ 5+2 5 1+ 5 h−2 1+ 5 5 2 2 √ √ √ 1+ 5 h 3+ 5 5+2 5 4 √ 5 2 2 (1+ 5)2 √ √ √ √ 5+2 5 1+ 5 h 5−2 5 1− 5 5 2 5 2 = 1+ ( ) + + ( ) + = = = ( ( ( ) (1 + √ ( 1−2 5 )h−2 − 1 )+ ) ( ) + √ ( 1−2 5 )h−1 − 1 )+ ( √ 5−2 5 5 √ 5−2 5 5 h √ ( 1−2 5 )h−2 (1 + ( √ 1− 5 2 h ) ( √ 3− 5 2 √ 1− 5 2 (1− 4 √ )−1 5)2 )−1 ) −1 2 Korollar 5.3. Sei T ein AVL-Baum mit n Knoten. Dann gilt Höhe(T ) = O(log n). 2 5.1.2 Einfügen(x, S) in AVL-Bäume Durch ungeschicktes Einfügen von neuen Elementen in einen AVL-Baum kann sicherlich die AVL-Eigenschaft zerstört werden. Es stellt sich daher die Frage, wie und mit welchem Aufwand wir die Elemente so einfügen können, daß die AVLEigenschaft erhalten bleibt. Definition 5.4. Sei T ein binärer Baum und v ein Knoten in T . Die Balance von v ist definiert als balance(v) = Höhe(Tr )− Höhe(Tl ). Für AVL-Bäume gilt somit stets balance(v) ∈ {+1, 0, −1}. Es kann passieren, daß wir einen Knoten u einfügen und ein Vorgänger v existiert mit (o.B.d.A.) balance(v) = +1 und u erhöht die Höhe des rechten Teilbaums (vgl. Abbildung 5.2). 68 KAPITEL 5. BALANCIERTE BÄUME v w h h+1 u Abbildung 5.2: Unbalancierter Baum nach Einfügen von u (1) Sei v der erste solche Knoten auf dem Weg zurück zur Wurzel. (2) Sei w die Wurzel des rechten Teilbaums und balance’ die Balance nach Hinzufügen von u. (3) Wir unterscheiden drei Fälle (vgl. Abbildung 5.3): (i) balance’(w) = +1 ⇒ balance(w) = 0 (ii) balance’(w) = −1 ⇒ balance(w) = 0 (iii) balance’(w) = 0 ⇒ u hat Höhe(w) nicht erhöht. Widerspruch. v v w h A h w h h B A h h C B u u C Abbildung 5.3: Fall (i) und Fall (ii) Im 2. Fall ist entweder h = 0 (vgl. Abbildung 5.4) oder die Situation stellt sich wie in Abbildung 5.5 dar. In diesem Fall gilt balance(x) = 0, da sonst u nicht die Höhe erhöhen würde, bzw. x anstelle von v gewählt worden wäre. v w u Abbildung 5.4: Fall (ii) mit h = 0 69 KAPITEL 5. BALANCIERTE BÄUME v w h x A h-1 h-1 B C D h u Abbildung 5.5: Fall (ii) mit h 6= 0 Zur Wiederherstellung der Balance führen wir lokale Rotationen durch. Die zugelassenen Rotationen und Doppelrotationen sind in Abb. 5.6 dargestellt. Man überzeugt sich schnell von der Richtigkeit der folgenden Beobachtung 5.5. i) Kosten pro Rotation: O(1). ii) Suchbaumeigenschaft bleibt erhalten R-Rotation v v w x L-Rotation x A w A D B B C C D RL-Doppelrot. R-Rotation RL-Doppelrot. x L-Rotation w v A B C D Abbildung 5.6: Rotation und Doppelrotation Mithilfe der Rotationen können wir den unbalancierten Baum wieder rebalancieren. i) Im Fall (i) rotieren wir v und w nach links (vgl. Abb. 5.7) ii) Im Fall (ii) rotieren wir x und w nach rechts und danach v und x nach links (vgl. Abb. 5.8) 70 KAPITEL 5. BALANCIERTE BÄUME w v w h v h A B h C h h C h A B u u Abbildung 5.7: Rebalancierung im Fall (i) v x w v w h h x A h-1 h D A h-1 B h-1 C h D h-1 B C u u Abbildung 5.8: Rebalancierung im Fall (ii) Eine Überprüfung der Fälle zeigt, daß der rebalancierte Teilbaum die gleiche Höhe hat wie der ursprüngliche Teilbaum vor dem Einfügen von u. Damit ist der gesamte Baum jetzt wieder ein AVL-Baum. Damit folgt: Lemma 5.6. Einfüge(x, S) in AVL-Bäumen benötigt O(log n) Schritte und höchstens eine (Doppel-) Rotation. 2 5.1.3 Lösche(x, S) O.B.d.A. sei balance(v) = −1 und die Höhe des rechten Teilbaums sinkt nach dem Löschen (vgl. Abb. 5.9). v w h h-2 Abbildung 5.9: Verlust der Balance nach einer Lösch-Operation Wir unterscheiden 3 Fälle (vgl. Abbildung 5.10). Dabei ist h−3 ≤ Höhe(B), Höhe(C) ≤ h − 2. 71 KAPITEL 5. BALANCIERTE BÄUME v V V W w h-2 D x h-2 W h-2 h-2 h-2 h-1 A A B C C h-1 h-1 A B B C x W v w W V V A A A B C C D B C B Abbildung 5.10: Rebalancierungen nach einer Lösch-Operation (i) balance(w) = 1: führe LR-Doppelrotation durch (ii) balance(w) = −1: führe R-Rotation durch (iii) balance(w) = 0: führe R-Rotation durch Beobachtung 5.7. Außer in Fall (iii) verringert sich die Höhe des Teilbaums. Wir müssen daher in diesen Fällen das Verfahren rekursiv bis zur Wurzel anwenden. Lemma 5.8. Löschen in AVL-Bäumen benötigt O(log n) Schritte mit höchstens O(log n) (Doppel-)Rotationen. 2 Satz 5.9. In AVL-Suchbäumen benötigen die Operationen Zugriff(x, S), Einfüge(x, S), Streiche(x, S), Ord(k, S) (mit Zusatzinformationen) O(log n) Schritte und List(S) O(n) Schritte. 2 5.2 α-balancierte Bäume Das Konzept der α-Balance verlangt, das in jedem Knoten des Baumes die Anzahl der Blätter in seinem linken und rechten Teilbaum nicht zu stark voneinander abweichen. Dies impliziert wiederum, daß die Höhe des Baums logoarithmisch von der Anzahl der Knoten abhängt. Ähnlich wie bei den AVL-Bäumen werden Rotationen durchgeführt, um die Balance nach Operationen wiederherzustellen. Definition 5.10. Sei T ein binärer Baum mit Teilbäumen Tl und Tr . i) Die Wurzelbalance von T ist wb(T ) = ii) Sei α ∈ ( 14 , 1 − Teilbäume T 0 √ 2 2 ). |Blätter in Tr | |Blätter in Tl | =1− |Blätter in T | |Blätter in T | Ein binärer Baum T heißt α-balanciert, wenn für alle α ≤ wb(T 0 ) ≤ 1 − α. 72 KAPITEL 5. BALANCIERTE BÄUME Lemma 5.11. Sei T ein α-balancierter Baum mit n Knoten. Dann ist Höhe(T ) = O(log n). Beweis: Sei v0 , v1 , . . . , vk−1 ein maximaler Pfad von der Wurzel zu dem Vater eines Blattes. Sei wi die Anzahl der Blätter im Unterbaum mit Wurzel vi . Es ist und ⇒ ⇒ 2 ≤ wk−1 (da vk−1 α-balanciert) wi ≤ (1 − α)wi−1 2 ≤ wk−1 ≤ (1 − α)k−1 w0 ≤ (1 − α)k−1 (n − 1) k = O(log n) 2 Beim Einfügen bzw. Streichen kann die Wurzelbalance verletzt werden. Sie läßt sich aber durch (Doppel-)Rotationen wiederherstellen (vgl. Abbildung 5.11). X y y X A C B C A B Abbildung 5.11: Rebalancierung von α-balancierten Bäumen Seien wb bzw. wb0 die Wurzelbalance vor bzw. nach Rotation. Die neue Wurzelbalance läßt sich direkt angeben. wb0 (y) = wb(x) + (1 − wb(x))wb(y) wb0 (x) = wb(x) wb(x) + (1 − wb(x))wb(y) Entsprechend X 7 y X 7 y 73 KAPITEL 5. BALANCIERTE BÄUME wb0 (x) = wb(x) wb(x) + (1 − wb(x))wb(y)wb(z) wb0 (y) = wb(y)(1 − wb(z)) 1 − wb(y)wb(z) wb0 (z) = wb(x) + (1 − wb(x))wb(y)wb(z) Lemma 5.12. Es existiert eine Konstante d ∈ [α, 1 − α], so daß 1) ist wb(y) ≤ d, so wird T durch eine Rotation rebalanciert 2) ist wb(y) > d, so wird T durch eine Doppelrotation rebalanciert. 2 Entsprechendes gilt für “Streiche(x, S).” Satz 5.13. Sei T ein α-balancierter binärer Suchbaum. Dann benötigen die Operationen Finde(x, S), Zugriff(x, S), Einfügen(x, S), Streiche(x, S), Ord(k, S), O(log n) Schritte und List(S) O(n) Schritte. 2 5.3 Rang-balancierte Bäume Wir betrachten in den folgenden beiden Abschnitten Bäume T , bei denen die abzuspeichernde Menge S in den Blättern abgelegt ist. Sei S = {x1 , . . . , xn } mit x1 < · · · < xn und T ein (nicht notwendigerweise binärer) Baum mit den folgenden Eigenschaften: i) Die Blätter von T enthalten von links nach rechts die Elemente von S in aufsteigender Folge. ii) Ist v ein innerer Knoten von T mit k Söhnen, so enthält v k − 1 Elemente c1 (v), . . . , ck−1 (v) so, daß für alle Blätter w im i-ten Teilbaum von v gilt ci−1 (v) < Inhalt(w) ≤ ci (v). 4 2 1 789 3 7 8 9 10 Abbildung 5.12: Baum mit blattorienterter Speicherung Definition 5.14. Ein binärer Baum T heißt rang-balanciert, wenn zu jedem Knoten v eine Zahl rang(v) ∈ Z existiert mit: i) rang(v) ≤ rang(Vater(v)) ≤ rang(v) + 1 ii) rang(v) < rang(Vater(Vater(v))) KAPITEL 5. BALANCIERTE BÄUME 74 iii) Ist v Blatt ⇒ rang(v) = 0, rang(Vater(v)) = 1 Rang-balancierte Bäume sind äquivalent (Übungsaufgabe) zu rot-schwarzBäumen, bei denen die Knoten so rot und schwarz gefärbt sind, daß i) die Blätter schwarz sind, ii) für jeden Knoten v die Pfade zu den Blättern die gleiche Anzahl von schwarzen Knoten enthalten und iii) kein Pfad zwei aufeinanderfolgende rote Knoten enthält. Wir werden im folgenden von der Äquivalenz zwischen rang-balancierten Bäumen und rot-schwarz-Bäumen Gebrauch machen. Zur Vereinfachung betrachten wir in diesem Abschnitt nur rang-balancierte Bäume, bei denen jeder Knoten entweder 2 Söhne oder keinen Sohn hat. Lemma 5.15. Sei T rang-balanciert. Sei u ein Knoten mit rang(u) = k. Dann gilt: i) 12 Höhe(u) ≤ rang(u) ≤ Höhe(u) ii) h hat mindestens 2k − 1 Nachfolger. iii) Höhe(T ) = O(log n). Beweis: Da (iii) aus (i) und (ii) folgt, reicht es, diese beiden Aussagen zu zeigen. (i) Die Aussage ist richtig für k = 0. Sei u ein Knoten vom Rang k + 1. Wenn u keinen Enkel hat, so ist rang(u) = 1 und Höhe(u) = 1. Andernfalls sei v ein Enkel von u maximaler Höhe. Dann ist Höhe(u) = Höhe(v) + 2 und rang(u) ≤ rang(v) + 2 ≤ Höhe(v) + 2 ≤ 2 rang(v) + 2 = 2 (rang(v) + 1) ≤ 2 rang(u) (ii) Hat u einen Sohn vom Rang k +1, so folgt (ii) per Induktion über die Höhe. Andernfalls haben beide Söhne von u den Rang k und u hat per Induktion mindestens 2 · (2k − 1) + 2 ≥ 2k+1 − 1 Nachfolger. 2 5.3.1 Einfügen(x, S) in rang-balancierten Suchbäume (1) Die Suche nach x endet in einem Blatt u mit Inhalt(u) < > x. (2) Füge an u zwei neue Blätter v1 = Leftson(u), v2 = Rightson(u) an mit (vgl. Abbildung 5.13). Inhalt(v1 ) = min{Inhalt(u), x} Inhalt(v2 ) = max{Inhalt(u), x} Inhalt(u) = Inhalt(v1 ) (3) Färbe die neuen Blätter schwarz und u rot. Da wir einen schwarzen Knoten durch einen roten Knoten mit zwei schwarzen Söhnen ersetzen, kann lediglich Bedingung (iii) verletzt sein. (4) Ist u Wurzel oder w = Vater(u) schwarz, stop. (T ist zulässig gefärbt.) 75 KAPITEL 5. BALANCIERTE BÄUME 2 2 2 3 Abbildung 5.13: Einfügen(3,S) x x w w u u Abbildung 5.14: (5) Andernfalls: ist w Wurzel, so färbe w schwarz, stop. (T ist zulässig gefärbt.) (6) Sei x = Vater(w). Dann ist x schwarz, da w rot. (7) Hat x nur rote Söhne, vertausche Farben, setze u := x und gehe zu (4) (vgl. Abb. 5.14). (Tx ist repariert, gehe höher im Baum) (8) Andernfalls: da w rot ist, muß der Bruder b von u wegen (iii) schwarz sein. Wir unterscheiden zwei Fälle (vgl. Abb. 5.15): (8a) u = Rightson(w) : führe eine L-Rotation durch und färbe um (8b) u = Leftson(w) : führe eine RL-Rotation durch und färbe um 5.3.2 Streiche(x, S) (1) Suche(x, S) endet in einem Blatt u. Sei w der Vater von u. Ersetze Inhalt(w) durch Inhalt(Bruder(u)), färbe w schwarz und streiche u, Bruder(u) (vgl. Abb. 5.16). (2) Sei v = Vater(w). Teste, ob v die Bedingung (ii) verletzt, falls nicht, so ist T balanciert. Andernfalls sei x der Bruder von w. (3) falls x schwarz ist: (a) Beide Söhne von x sind schwarz: färbe x rot und v schwarz. Dann ist Tv zulässig gefärbt. Ersetze v durch Vater(v) und gehe zu (2) (b) Der linke Sohn von x ist schwarz. Führe ein L-Rotation durch. Ist v rot, Stop. Ist v schwarz, färbe rechten Sohn von v schwarz, Stop. (c) Der linke Sohn von x ist rot. Führe eine RL-Doppelrotation durch. 76 KAPITEL 5. BALANCIERTE BÄUME x w x w u a u b a c d d x u w a c b x w u d a c b d c b Abbildung 5.15: 2 1 3 3 Abbildung 5.16: Schritt (1) v v w x w Abbildung 5.17: Schritt (3a) x 77 KAPITEL 5. BALANCIERTE BÄUME x v v x w s t t w s x x v v t w t w s s Abbildung 5.18: Schritt (3b) y v x w x v y w v schwarz v rot y v w y x v w Abbildung 5.19: Schritt (3c) x 78 KAPITEL 5. BALANCIERTE BÄUME x v v x w w x v v x w w Abbildung 5.20: Schritt (4) v v w x w x Abbildung 5.21: abschließender Schritt War v rot: so färbe v schwarz. War v schwarz: so färbe y schwarz, Stop. (4) Ist x rot. Dann sind beide Söhne von x schwarz und v schwarz. Führe eine L-Rotation durch. Tausche Farben von v und x, benenne um und gehe zu (3) Beobachtung 5.16. Nach Durchlauf von Schritt (4) bricht das Verfahren entweder in 3(b) oder 3(c) ab oder es wird 3(a) ausgeführt: Danach sind alle Knoten ausgeglichen und das Verfahren bricht ab. Lemma 5.17. i) Einfüge (x, S) in rang-balancierten Bäumen benötigt O(log n) Schritte und höchstens eine (Doppel-)Rotation. ii) Streiche(x, S) in rang-balancierten Bäumen benötigt O(log n) Schritte und höchstens drei (Doppel-)Rotationen. 2 79 KAPITEL 5. BALANCIERTE BÄUME (a, b)-Bäume 5.4 Definition 5.18. Seien a, b ∈ N mit a ≥ 2 und b ≥ 2a − 1. Ein Baum T heißt (a, b)-Baum, wenn gilt: i) ii) iii) iv) alle Blätter haben die gleiche Tiefe jeder Knoten hat höchstens b Söhne jeder innere Knoten außer der Wurzal hat mindestens a Söhne die Wurzel hat mindestens 2 Söhne. Wie bei den rang-balancierten Bäumen, tragen die inneren Knoten Label, die die Suche unterstützen. Bemerkung 5.19. (2, 4)-Baum ⇔ rot-schwarz-Baum ( Übungsaufgabe) Lemma 5.20. Sei T ein (a, b)-Baum mit n Blättern und Höhe h. Dann gilt: i) 2ah−1 ≤ n ≤ bh ii) log n/ log b ≤ h ≤ 1 + log(n/2)/ log a Beweis: Da jeder Knoten höchstens b Söhne hat, existieren höchstens bh Blätter. Da die Wurzel mindestens zwei, jeder andere mindestens h Söhne hat, folgt (i). (ii) folgt aus (i) durch Logarithmieren. 2 5.4.1 Einfüge(x, S) (1) Die Suche nach x endet in einem Blatt w. Ist Inhalt(w) = x, stop. Andernfalls spalten wir w, speichern x im neuen Blatt und fügen die entsprechende Schlüsselinformation im Vater v von w ein. (2) Hat v höchstens b Söhne, stop. (3) v hat b + 1 Söhne: ist v die Wurzel von T , so sei y ein neuer Knoten mit einzigem Sohn v. Andernfalls sei y der Vater von v. (4) Sei v 0 ein neuer Zwilling rechts von v unter y. Mache die rechtesten d(b+1)/2e Söhne zu Söhnen von v 0 und speichere die Schlüssel cd(b+1)/2e+1 (v), . . . , cb (v) nach v 0 um, bewege den Schlüssel cb(b+1)/2c (v) von v nach y (zwischen die Zeiger auf v und v 0 .) Setze v := y und gehe zu (2). Beispiel 5.21. (2, 4)-Baum für S = {1, 3, 7, 8, 9, 10}, Einfüge (6, S) Lemma 5.22. Das Einfügen in einen (a, b)-Baum hat Zeitkomplexität O(log n) Beweis: Die Suche nach x benötigt O(log n) Schritte. Danach führen wir maximal O(log n) Spaltoperationen aus, die jeweils O(1) Schritte benötigen. Bei einer Spaltung wird ein Knoten v mit b + 1 Söhnen in 2 Knoten mit jeweils b(b + 1)/2c und d(b + 1)/2e Söhnen zerlegt. Da b ≥ 3, ist d(b + 1)/2e ≤ b+1 2 + 1 ≤ b, und da b ≥ 2a − 1 ist b(b + 1)/2c ≥ a. 2 80 KAPITEL 5. BALANCIERTE BÄUME 4 2 1 789 3 7 8 9 10 4 2 1 6789 3 6 7 Spalte v 8 9 10 47 2 1 5.4.2 6 3 6 89 7 8 9 10 Streiche(x, S) Die Operation wird ähnlich implementiert. (1) Lösche das Blatt mit Inhalt x und den zugehörigen Schlüssel im Vater v von x. Danach hat v einen Sohn weniger. (2) Ist v die Wurzel und hat sie nur noch einen Sohn, so streiche sie. Hat andernfalls v noch mindestens a Söhne, stop. Andernfalls hat v a − 1 Söhne. (3) Falls v einen linken oder rechten Bruder hat, der mindestens a + 1 Söhne hat, so mache einen dieser Söhne zu einem Sohn von v (Stehlen) und wir sind fertig. (4) Andernfalls sei y ein Bruder von v mit a Söhnen und z der Vater von v und y. Verschmelze v und y, d.h. bewege alle Schlüssel und Söhne von y nach v und streiche y. Bewege den Schlüssel in z, der zu y gehört, ebenfalls nach v. Setze v = z und gehe zu (2). Lemma 5.23. Streiche(x, S) benötigt O(log n) Zeiteinheiten. Beweis: Wir benötigen höchstens O(log n) Verschmelzungs- und 1 Stehl-Operation, die jeweils O(1) Schritte benötigen. Eine Verschmelzung vereint einen Knoten mit a und einen mit a − 1 Söhnen zu einem Knoten mit 2a − 1 ≤ b Söhnen. 2 5.4.3 Konkateniere(S1 , S2 , S3 ) Die disjunkten Mengen S1 und S2 seien in (a, b)-Bäumen T1 bzw. T2 (mit identischen Parametern) abgelegt. Es sei max S 1 < min S2 . Gesucht ist ein (a, b)-Baum T3 , der S1 ∪ S2 repräsentiert. (T1 und T2 können dabei zerstört werden.) 81 KAPITEL 5. BALANCIERTE BÄUME (1) Berechne h1 = Höhe(T1 ) → O(h1 ) h2 = Höhe(T2 ) → O(h2 ) t1 = max{s ∈ S1 } → O(h1 ) (2) Sei o.B.d.A. h1 ≥ h2 . Sei r2 die Wurzel von T2 und v ∈ T1 des rechtesten Knoten in T1 der Tiefe h1 − h2 r1 r 2 v (3) verschmelze v und r2 , wobei t1 als neuer Schlüssel aufgenommen wird. (4) Hat der neue Knoten höchstens b Söhne, stop. Andernfalls fahre fort wie beim Einfügen. Lemma 5.24. Konkatenieren (S1 , S2 , S3 ) benötigt O(log(max{|S1 |, |S2 |})) Schritte in (a, b)-Bäumen. Der neue (a, b)-Baum hat Höhe ≤ max{h1 , h2 } + 1. 2 Bemerkung 5.25. Wenn wir zusätzlich in der Wurzel eines Baumes seine Höhe und den maximalen Wert eines Blattinhalts speichern, so benötigt das Konkatenieren höchstens O(|h1 − h2 | + 1) Schritte. Wir können diese Angaben fortschreiben, ohne die Laufzeiten der bisher betrachteten Opeartionen zu verändern. 5.4.4 Split(x, S) Wenn Wir S ersetzen wollen durch S1 = {y ∈ S : y < x} und S2 = {y ∈ S : y ≥ x}, so müssen wir dazu lediglich den Wurzelknoten aufspalten. Etwas komplizierter wird die Operation, wenn wir S ersetzen wollen durch S 1 = {y ∈ S : y ≤ x} und S2 = {y ∈ S : y > x}. Anschaulich fährt das Verfahren wie ein Blitz durch den Baum und spaltet ihn entlang der Bruchstelle in Teilbäume auf. Die dabei entstehenden Teilbaäume sind (mit evtl. Ausnahem ihrer Wurzel) wieder (a, b)Bäume. Wir sammeln dann die linken Teilbäume durch Verschmelzen wie oben auf, um S1 zu erzeugen. Entsprechend erhalten wir S 2 . (1) Suche nach x. Auf dem Suchpfad sei im Knoten v c i−1 (v) < x ≤ ci (v), d.h. die Suche geht zum i-ten Sohn w über. Löse die Verbindung von v zu seinem Vater und erzeuge zwei neue Bäume mit neuen Wurzelknoten v 0 und v 00 auf, wobei v 0 die ersten i − 1 Söhne von v und die Schlüsselelemente c1 (v) . . . ci−2 (v) erhält und v 00 die restlichen Söhne und die Schlüsselelemente ci (v), . . . , ck−1 (v). Zusätzlich: 82 KAPITEL 5. BALANCIERTE BÄUME (a) ist 1 < i < k, so ist max T (v 0 ) ≤ ci−1 (v) < min T (v 00 ). Speichere ci−1 (v). (b) ist i = 1, so ist max T (w) ≤ c1 (v) < min T (v 00 ). Speichere c1 (v). (c) ist i = k, so ist max T (v 0 ) ≤ ck−1 (v) < min T (w). Speichere ck−1 (v). v v’ v’’ <x >x w w Beispiel 5.26. ? 7 14 11 3 4 5 6 1 2 1 2 3 4 5 17 8 9 10 6 7 8 9 10 11 12 13 19 20 21 15 16 17 12 13 14 15 16 17 18 19 20 21 7 14 11 3 4 5 6 1 2 1 2 3 4 5 8 9 10 6 7 B 8 9 12 13 10 1 2 4 5 6 2 7 8 4 5 8 2 4 5 10 11 12 13 14 18 19 20 21 9 B 7 8 15 16 17 18 19 17 18 19 17 18 19 20 21 1 12 13 10 11 12 13 19 20 21 15 16 17 14 15 16 20 21 1 17 2 9 19 20 21 17 2 B 3 8 9 10 6 17 15 16 17 B 4 5 6 3 12 13 1 3 1 16 17 8 9 10 7 B 1 2 9 B 6 15 B 4 5 6 3 14 1 3 1 2 13 11 8 9 10 B 1 12 B1 4 5 6 3 11 19 20 21 15 16 17 1 3 1 2 17 10 11 12 B 13 2 14 19 20 21 15 16 17 15 16 20 21 (2) Dabei enstehen 2 Mengen Fl , Fr von Bäumen, die (a, b)-Bäume sind mit der möglichen Ausnahme, daß die Wurzel nur einen Sohn hat. Sei S 1 die Menge der Blätter in Fl , S2 die der Blätter in Fr . (3) Sei Fl = {B1 , . . . , Bm } die Menge der linken Bäume von links nach rechts durchnumeriert. (Fr entsprechend, wir betrachten im folgenden nur F l .) (4) Sei hi = h(Bi ). Da Fl auf dem Suchpfad erzeugt wird, gilt h 1 > h2 > . . . > hm und m ≤ Höhe(S). (5) Es ist max{s ∈ Bj } ≤ t < min{s ∈ Bj+1 }, wobei t der in diesem Spaltschritt gespeicherte Wert ist. 83 KAPITEL 5. BALANCIERTE BÄUME 0 0 0 (6) Führe Konkateniere(Bm−1 , Bm , Bm−1 ), Konkateniere(Bm−2 , Bm−1 , Bm−2 ) 0 0 , . . . , Konkateniere(B1 , B2 , B1 ) aus wie bei (a, b)-Bäumen. Hat am Schluß die Wurzel nur einen Sohn, so lösche sie. v’ v’’ C (v)... C 1 i-2 (v) C (v)...C (v) i k-1 w Lemma 5.27. Für 1 ≤ i ≤ m − 2 gilt hi+1 ≤ h0i+1 ≤ hi+1 + 1 ≤ hi . w v’’ C 2 (v)...Ck-1 (v) Abbildung 5.22: Der Fall i = 1 0 Beweis: Da Bi+1 in Bi+1 aufgeht, folgt hi+1 ≤ h0i+1 . Weiter gilt hi+1 +1 ≤ hi . Rest per Induktion über i = m−2, . . . , 1. Für i = m−2 ist h0m−1 ≤ max{hm−1 , hm−2 }+ 1 ≤ hm−1 + 1. Für i < m − 2 ist h0i+1 ≤ max{hi+1 , h0i+2 } + 1 ≤ hi+1 + 1, da 2 h0i+2 ≤ hi+1 . v’ w C 1 (v)...C k-2 (v) Abbildung 5.23: Der Fall i = k Lemma 5.28. Die Operation Split(x, S) in (a, b)-Bäumen benötigt O(log |S|) Schritte. Beweis: Die Aufspaltphase benötigt O(log |S|) Schritte. Bei jedem Konkatenierungsschritt sind Schlüsselwerte t bekannt. Daraus folgt mit Bemerkung 5.25 für 84 KAPITEL 5. BALANCIERTE BÄUME die Laufzeit L(Split)der Aufbauphase: L(Split) = |hm−1 − hm | + = hm−1 − hm + ≤ h0m−1 − hm + m−2 X i=1 m−2 X i=1 m−2 X i=1 |hi − h0i+1 | + m − 1 (hi − h0i+1 ) + m − 1 (h0i − h0i+1 ) + m ≤ m + h01 ≤ m + h1 + 1 = O(log |S|) 2 5.4.5 Amortisierte Kosten von Rebalancierungsoperationen Wir haben bisher worst-case-Abschätzungen für die Laufzeiten unserer Operationen durchgeführt und gesehen, daß eine Rebalancierung schlimmstenfalls O(log |S|) Schritte benötigt. Wir wollen nun zeigen, daß eine dynamische Verwaltung eines (a, b)-Baums, bei der wir eine Folge von E Einfüge und S Streiche-Operationen (mit n = E + S) in einem anfangs leeren Baum durchführen, Kosten von lediglich O(n) verursacht. Diese Operationen werden mehrmals hintereinander ausgeführt. Es ist daher durchaus möglich, daß wir bei einer Ausführung Arbeit investieren, die sich bei späteren Ausführungen durch eine geringere Laufzeit bezahlt machen. Die Analyse wird üblicherweise mit amortisierten Kosten gemacht. Sei dazu zu jedem (a, b)Baum T eine nichtnegative Zahl potential(T ) gegeben, die wir später geeignet spezifizieren. Definition 5.29. Einer Operation Op, die den Baum T 1 in den Baum T2 überführt, ordnen wir wie folgt amortisierte Kosten zu: amortisierteKosten (Op) = Lauf zeit(Op) + potential(T 2 ) − potential(T1 ) Bemerkung 5.30. Wir starten mit einem leeren Baum T 0 mit potential(T0 ) = 0 und führen eine Folge von Operationen Op 1 , Op2 , . . . , Opk durch, wobei Opi den Baum Ti−1 in den Baum Ti überführt. Dann ergeben sich die amortisierten Gesamtkosten als Summe der Laufzeiten + potential(H k ). Da potential(Hk ) ≥ 0, gilt stets: Laufzeit ≤ amortisierte Kosten. Somit stellen die amortisierten Kosten eine obere Schranke für die Laufzeit dar. Es reicht also, die amortisierten Kosten zu berechnen, die meist besser als die Laufzeiten abgeschätzt werden können. Dabei ist es natürlich wichtig, eine geeignete Potentialfunktion zu wählen. 85 KAPITEL 5. BALANCIERTE BÄUME b+1 • Sei a ≥ 2, b ≥ 2a und c := min{a − 1, d b+1 2 e − a, b − 2a + 1, b − b 2 c} • Für einen inneren Knoten v bezeichne grad(v) die Anzahl seiner Söhne • Für einen inneren Knoten v sei die Balance wie folgt definiert: b(v) = min{grad(v) − a, b − grad(v), c} v nicht Wurzel b∗ (v) = min{grad(v) − 2, b − grad(v), c} v Wurzel • (T, v) heißt teilweise rebalancierter (a, b)-Baum, falls T in allen Knoten u 6= v die Sohn-Bedingung erfüllt und in v um höchstens 1 unter-/überschreitet. P • Das Potential von (T, v) ist potential(T ) = b ∗ (v) + u∈T innerer Knoten b(u) u nicht Wurzel Lemma 5.31. i) a ≥ 2, b ≥ 2a ⇒ c ≥ 1 b+1 00 0 00 ii) grad(v 0 ) = b b+1 2 c, grad(v ) = d 2 e ⇒ b(v ) + b(v ) ≥ 2c − 1 iii) Ist grad(v) = 2a − 1, so ist b(v) = c bzw. (b ∗ (v) = c) iv) Ist grad(v) = a − 1 ⇒ b(v) = −1 v) Ist grad(v) = a ⇒ b(v) = 0 Beweis: Die Aussage (i) folgt aus den Definitionen. (iv) und (v) folgen aus (i). (ii) b(v 0 ) = min{b b+1 2 c − a, c} b(v 00 ) = min{b − d b+1 2 e, c} (a) b = 2k + 1 : b+1 0 b b+1 2 c − a = k + 1 − a = d 2 e − a ⇒ b(v ) = c b+1 00 b − d b+1 2 e = k = b − b 2 c ⇒ b(v ) = c (b) b = 2k : b+1 0 b b+1 2 c − a = k − a = d 2 e − a − 1 ⇒ b(v ) ≥ c − 1 b+1 00 b − d b+1 2 e = 2k − (k + 1) = b − b 2 c − 1 ⇒ b(v ) ≥ c − 1 Angenommen b(v 0 ) + b(v 00 ) = 2(c − 1). Dann folgt k + 1 − a = c = 2k − k und somit a = 1, im Widerspruch zu a ≥ 2. (iii) Da b(v) = min{a−1, b−(2a−1), c} und c ≤ b−(2a−1) sowie c ≤ a−1, folgt der erste Teil der Behauptung. Der zweite Teil folgt aus c ≤ a − 1 = 2a − 1 − a ≤ 2a − 1 − 2. 2 Lemma 5.32. Sei T ein (a, b)-Baum und T 0 der teilweise rebalancierte Baum der nach Hinzufügen oder Streichen eines Blattes entsteht. Dann ist potential(T 0 ) ≥ potential(T ) − 1. Beweis: Für den Vater v des Blattes gilt grad(v) = grad(v) ± 1 2 KAPITEL 5. BALANCIERTE BÄUME 86 Lemma 5.33. Sei (T, v) ein teilweise rebalancierter Baum mit grad(v) = b + 1. Spalten von v und Expandieren des Vaters von v erzeugt einen teilweise rebalancierten Baum T 0 mit potential(T 0 ) ≥ potential(T ) + 2c − 1. Beweis: (i) v ist nicht Wurzel. Da c ≥ 1, folgt b(v) = −1. Sei x der Vater von v. b+1 v wird in v 0 und v 00 vom Grad b b+1 2 c bzw. d 2 e gespalten und der Grad von x um eins erhöht. Also sinkt die Balance von x um höchstens eins. Es gilt potential(T 0 ) ≥ potential(T ) + b(v 0 ) + b(v 00 ) − b(v) − 1. Da b(v) = −1 und nach Lemma 5.31 b(v 0 ) + b(v 00 ) ≥ 2c − 1, folgt potential(T 0 ) ≥ potential(T ) + 2c − 1. (ii) v ist die Wurzel. Da grad(v) = b + 1, folgt b ∗ (v) = −1. Der Vater x von v wird nun geschaffen, sein Grad wird 2. potential(T 0 ) = potential(T ) + b(v 0 ) + b(v 00 ) − b∗ (v) + b∗ (x) ≥ potential(T ) + (2c − 1) + 1 + 0 2 Lemma 5.34. Sei (T, v) ein teilweise rebalancierter (a, b)-Baum mit grad(v) = a − 1, wobei v nicht die Wurzel von T ist. Sei y ein benachbarter Bruder von v und x der Vater. i) Ist grad(y) = a, so sei T 0 der Baum nach Verschmelzen von v und y und Schrumpfen von x. Ist x die Wurzel und hat x den Grad 1 nach Schrumpfen, so wird x gelöscht. Dann ist potential(T 0 ) ≥ potential(T )+c. ii) Ist grad(y) > a, dann sei T 0 der Baum nach Stehlen eines Sohnes von a. Dann gilt potential(T 0 ) ≥ potential(T ). Beweis: (i) Sei w der neue Knoten mit grad(w) = 2a − 1. (a) x ist nicht Wurzel von T. Der Grad von x fällt um eins und somit die Balance um höchstens eins. Weiter ist nach Lemma 5.31 b(w) = c, b(v) = −1, b(y) = 0. potential(T 0 ) ≥ potential(T ) + b(w) − b(v) − b(y) − 1 ≥ potential(T ) + c − (−1) − 0 − 1 = potential(T ) + c (b) x ist die Wurzel von T. Ist Grad von x ≥ 3, so wird x nach Verschmelzen nicht gelöscht und die Aussage folgt wie vorher. Ist grad(x) = 2 (d.h. b ∗ (x) = 0) vor dem Verschmelzen, so wird x anschließend gelöscht, w wird Wurzel mit b∗ (w) = c. Somit potential(T 0 ) = potential(T ) + b∗ (w) − b(v) − b(y) − b∗ (x) = potential(T ) + c − (−1) − 0 − 0 ≥ potential(T ) + c (ii) Die Balance von y sinkt um höchstens 1. Der Grad von v steigt von a − 1 auf a und damit b(v) um 1. Somit ist potential(T 0 ) ≥ potential(T ). 2 87 KAPITEL 5. BALANCIERTE BÄUME Lemma 5.35. Sei T ein (a, b)-Baum mit m Blättern. Dann ist c 0 ≤ potential(T ) ≤ c + (m − 2) a+c−1 Beweis: Für 0 ≤ j < c sei mj die Anzahl der inneren Knoten 6= der Wurzel, die vom Grad a + j sind. Ferner sei mc die Anzahl der Knoten, die verschieden von der Wurzel und vom Grad mindestens a + c sind. Da b∗ (Wurzel) ≤ c, gilt: potential(T ) ≤ c + c X jmj . j=0 P Weiter ist m + cj=0 mj die Anzahl der inneren Knoten und der Blätter ohne Wurzel. Da in P einem Baum die Anzahl der Kanten gleich der Anzahl der Knoten 1 ist, und 2 + cj=0 (a + j)mj eine untere Schranke für die Anzahl der Kanten ist, folgt c c X X 2+ (a + j)mj ≤ m + mj . j=0 Somit c X j=0 Schließlich ist j a+j−1 ≤ c a+c−1 j=0 (a + j − 1)mj ≤ m − 2 für 0 ≤ j ≤ c. Damit folgt: potential(T ) ≤ c + = c+ c X j=0 c X j=0 ≤ c+ jmj j (a + j − 1)mj a+j −1 c (m − 2). a+c−1 2 Satz 5.36. Sei a ≥ 2, b ≥ 2a. Wir betrachten eine Folge von E Einfüge- und S Streiche-Operationen (n = E + S) in einem anfänglich leeren (a, b)-Baum T0 . Sei KS = # Knotenspaltungen, KV = # Knotenverschmelzungen und KD = # Knotendiebstähle, so gilt: i) KD ≤ S ≤ n c (E − S − 2) ii) (2c − 1)KS + c · KV ≤ n + c + a+c−1 iii) Die Rebalancierung benötigt O(n) Operationen. Beweis: (i) Diebstahl wird höchstens einmal pro Streichoperation durchgeführt. (ii) Ist T0 der leere Baum, so gilt potential(T 0 ) = 0. Wir erhalten schließlich Tn mit E − S Blättern. Nach Lemma 5.35 gilt: potential(Tn ) ≤ c + (E − S − 2) · c a+c−1 KAPITEL 5. BALANCIERTE BÄUME 88 Nach Lemma 5.32 sinkt die Balance beim Hinzufügen oder Streichen eines Blattes um höchstens 1. Nach Lemma 5.33 steigt sie bei einer Spaltung um mindestens 2c − 1 und nach Lemma 5.34 bei einer Verschmelzung um mindestens c. Somit potential(T0 ) + (2c − 1) · KS + cKV − n ≤ potential(Tn ). Da potential(T0 ) ≥ 0, folgt (E − S − 2)c (2c − 1)KS + cKV ≤ n + c + a+c−1 . (iii) Nach (i) ist KD ≤ n. Da nach Lemma 5.31 c ≥ 1 ist, folgt aus (ii) KS+KV ≤ n n−2 2 c +1+ a . 5.4.6 Anwendung: Sortieren von fast-sortierten Daten Wir haben gesehen, daß die bisher behandelten Sortierverfahren eine Vorsortierung der Daten nicht ausnützen können. Unter Umständen benötigen sie sogar maximale Laufzeit bei bereits vollständig sortierten Eingabedaten. Zur Erinnerung: Definition 5.37. Sei x1 , . . . , xn eine Eingabefolge, die aufsteigend sortiert werden soll. Für jedes i sei fi := |{xj : j > Pi, xj < xi }| die Anzahl der Fehlstände von i. Die Fehlstände der Folge sei F := ni=1 fi . Beispiel 5.38. Die Folge x1 < . . . < xn hat F = 0, die Folge x1 > . . . > xn hat Fehlstände F = n(n − 1)/2. Der Algorithmus geht wie folgt vor: (1) Benutze (a, b)-Bäume zur Sortierung, wobei wir jeden Knoten um einen SohnVater-Zeiger erweitern. (2) Füge xn in einen leeren (a, b)-Baum ein (isoliertes Blatt). (3) Füge xi in einen Baum mit den Blättern xi+1 . . . xn ein: (Wenn die Folge fast sortiert ist, wird xi sehr weit links eingefügt werden müssen.) (4) gehe so lange die linke Schulter hinauf durch die inneren Knoten v 1 , v2 , . . ., bis zum ersten Mal xi ≤ c1 (vj ) (d.h. xi muß im linkesten Unterbaum von vj , nicht aber im linkesten Unterbaum von v j−1 abgespeichert werden) oder die Wurzel erreicht ist. (5) Suche von vj aus abwärts nach xi . (6) füge xi ein und rebalanciere. 5.4.6.1 Laufzeitanalyse Hinauflaufen Suche Einfügen Rebalancieren O(Höhe(vj )) O(Höhe(vj )) O(1) O(KSi ) KS = # Spaltungen nach Einfügen von xi Zur Abschätzung der von Höhe(vj ): 89 KAPITEL 5. BALANCIERTE BÄUME 1) entweder j = 1, 2 ⇒ Höhe(vj ) = 1, 2 2) oder j ≥ 3 : Dann sind die Inhalte der Blätter im ersten Unterbaum von vj−1 < xi , d.h. die Inhalte der Blätter im Unterbaum Tvj−2 mit Wurzel vj−2 sind kleiner als xi . Dann folgt mit Lemma 5.20 fi ≥ # Blätter in Tvj−2 ≥ 2aHöhe(vj−2 ) und somit Höhe(vj ) = Höhe(vj−2 ) + 2 = O(log fi ) . Satz 5.39. Eine Folge von n Elementen mit F Fehlständen kann in O(n + n log(F/n)) Schritten sortiert werden. Beweis: Nach den obigen Bemerkungen ist der Zeitbedarf für das Sortieren durch Einfügen: n n X X O(n + log fi + KSi ) i=1 fi ≥1 Nach Satz 5.36 ist Pn i=1 i=1 KSi = O(n). Weiter gilt mit Lemma A.5 n X i=1 log fi = log( n Y fi ) i=1 ≤ n log( n1 Pn i=1 fi ) = n log(F/n), woraus die Behauptung folgt. 2 Beispielsweise erhalten wir für F = n log n eine Laufzeit von O(n log log n). 5.4.7 Eine Anwendung von (a, b)-Bäumen: Kürzeste Wege in Graphen Gegeben sei ein gerichteter Graph G = (V, E) mit Knotenmenge V und Kantenmenge E und Entfernungen ce ≥ 0 für e ∈ E. Zusätzlich sei ein Knoten s ∈ V ausgezeichnet. Definition 5.40. Ein Weg von v ∈ V nach w ∈ V ist eine Folge v 0 , v1 , . . . , vk von Knoten, so P daß v0 = v, vk = w und (vi , vi+1 ) ∈ E für 0 ≤ i ≤ k − 1. Der Weg k−1 hat die Länge i=0 c(i,i+1) . Gesucht: Kürzeste Wege von s zu allen anderen Knoten. Idee des Verfahrens - Wir vergrößern schrittweise eine Menge M von Knoten, für deren Elemente v ∈ M wir bereits einen kürzesten Weg von s nach v gefunden haben. - allen anderen Knoten v ∈ / M ordnen wir die Länge des bisher gefundenen kürzesten Weges zu. 90 KAPITEL 5. BALANCIERTE BÄUME v 1 5 s 9 7 v3 2 6 v4 3 v2 - Sei Dist(v) = Länge des (bisherigen) kürzesten Weges Vor(v) = Vorgänger auf so einem Weg. Dijkstra-Algorithmus (1) Setze Dist(s) := 0 Dist(v) := c(s, v) für (s, v) ∈ E Vor(v) := s Dist(v) := +∞ für (s, v) ∈ /E Vor(v) := ∅ M = {s} (2) Bestimme u ∈ / M mit Dist(u) = min{Dist(v) : v ∈ / M } Setze M = M ∪ {u} (3) Für alle v ∈ V mit (u, v) ∈ E (4) Falls Dist(v) > Dist(u) + c(u, v) setze Dist(v) = Dist(u) + c(u, v) Vor(v) = u (5) Falls M 6= V , gehe zu 2. Schaut man sich den Ablauf des Verfahrens an, so bekommt man den Eindruck, daß sich die Menge M kreisförmig“ um den Startknoten s ausbreitet. (Hierbei ist ” allerdings die Kreisförmigkeit“ relativ zu den gewählten Distanzen zu verstehen.) ” Bezeichne d(u) den Wert von Dist(u) zu dem Zeitpunkt, zu dem u in die Menge M aufgenommen wird. Lemma 5.41. Wird u vor v in M aufgenommen, so gilt d(u) ≤ d(v). Beweis: Angenommen es existieren Knoten u und v, so daß u vor v aufgenommen wird, aber d(u) > d(v) gilt. Unter allen diesen Knoten v wähle den als ersten in M aufgenommenen. In dem Moment, in dem u aufgenommen wird, gilt d(u) = Dist(u) ≤ Dist(v). Da per Definition d(u) nicht mehr verändert wird, muß später Dist(v) verringert KAPITEL 5. BALANCIERTE BÄUME 91 worden sein. Dies kann nur passieren, wenn ein Knoten w in M aufgenommen und Dist(v) = Dist(w)+c(w, v) gesetzt wird. Sei w der letzte solche Knoten, d.h. es gilt d(v) = d(w) + c(w, v). Nach Wahl von v gilt aber d(u) ≤ d(w). Da c(w, v) ≥ 0, folgt d(v) ≥ d(u), im Widerspruch zur Annahme. 2 Wenn das Verfahren kürzeste Wege von s zu allen anderen Knoten berechnet, so muß sicherlich am Schluß gelten, daß Dist(u) ≤ Dist(v)+c(v, u), denn ansonsten wäre es kürzer über u und die Kante (u, v) nach v zu gehen. Das folgende Lemma zeigt, daß unser Verfahren zumindest diese notwendige Bedingung erfüllt. Lemma 5.42. Nach Beendigung des Verfahrens gilt für alle Kanten (u, v) ∈ E : Dist(v) ≤ Dist(u) + c(u, v). Beweis: Die Aussage gilt sicherlich direkt nach der Iteration, in der u aufgenommen wird. Wenn sie zu einem späteren Zeitpunkt nicht mehr gilt, muß Dist(u) verringert worden sein, da Dist(v) nicht wächst. D.h. es gilt Dist(u) < d(u). Dies kann wiederum nur passiert sein, als ein Knoten w in M aufgenommen und Dist(u) = d(w) + c(w, u) gesetzt wurde. Da aber nach Lemma 5.41 d(w) ≥ d(u) und c(w, u) ≥ 0, folgt Dist(u) ≥ d(u), Widerspruch. 2 Aus der letzten Aussage ergibt sich unmittelbar, daß der Dijkstra-Algorithmus korrekt arbeitet. Satz 5.43. Der Dijkstra-Algorithmus berechnet kürzeste Wege von s zu allen anderen erreichbaren Knoten. Beweis: Wir zeigen per Induktion über die Anzahl der Knoten auf einem kürzesten Weg, daß die notwendige Bedingung auch hinreichend ist. Die Aussage ist sicherlich richtig für s. Sei jetzt v ein Knoten und u ein Vorgänger auf einem kürzesten Weg. Per Induktion können wir annehmen, daß Dist(u) die Länge eines kürzesten Wegs von s nach u ist. Da Dist(v) ≤ Dist(u) + c(u, v), ist dann Dist(v) die Länge eines kürzesten Wegesn nach v. 2 Aus dem Dijkstra-Algorithmus und Lemma 5.42 ergibt sich, daß sobald ein Knoten u in die Menge M aufgenommen wird, auch schon ein küzester Weg gefunden worden ist und sich der Wert Dist(u) nicht mehr ändert. Es reicht daher, eine im allgemeinen kleinere Menge U von Knoten dynamisch zu verwalten. Dijkstra in Pidgin (1) Dist(s) := 0, U = {s} (2) for v ∈ V \{s} do (3) Dist(v) = +∞ endfor (4) while U 6= ∅ (5) choose u ∈ U with Dist(u) minimal (6) U := U \ {u} (7) for all (u, v) ∈ E (8) if Dist(u) + c(u, v) < Dist(v) then (9) Dist(v) = Dist(u) + c(u, v), V or(v) = u, 92 KAPITEL 5. BALANCIERTE BÄUME (10) (11) U := U ∪ {v} endif endfor endwhile Datenstrukturen • Adjazenzliste Feld Tail[1, . . . , n] Tail(i) zeigt auf Beginn einer verketteten Liste, die die Endknoten und Kosten von Kanten (i, j) ∈ E enthält. 2 4 1 3 5 1 2 2 C12 3 C23 4 5 3 4 5 3 5 1 • Felder Dist[1, . . . , n], Vor[1, . . . , n] • ein ungeordneter (a, b)-Baum mit b = 2a für die Menge {(Dist(u), u) : u ∈ U } mit: - die Blätter enthalten die Elemente von U in beliebiger Reihenfolge, - jeder innere Knoten v enthält einen Zeiger auf das Blatt von Tv , das minimalen Wert hat. • zusätzlich Zeigerfeld Pointer[1 . . . n] auf das Blatt, das Knoten u enthält, bzw. Pointer(u) = ∅, falls u ∈ / U. Der Algorithmus führt folgende Operationen aus 1) 2) 3) 4) finde Min lösche Min füge ein verringere Inhalt eines Blattes mit Zeiger KAPITEL 5. BALANCIERTE BÄUME 93 Laufzeiten 1) finde Min in O(1) 2) lösche Min: beim Zurückgehen zur Wurzel wird rebalanciert und jeweils in O(a) Schritten das Minimum fortgeschrieben: O(aHöhe(T )) 3) einfügen mit Fortschreibung des Minimums: O(aHöhe(T )) 4) verringern: zurück zur Wurzel und Min-Zeiger fortschreiben, dabei muß jeweils nur das alte Minimum mit dem verringerten Wert verglichen werden: O(Höhe(T )) Wie oft werden die Operationen durchgeführt? 1) 2) 3) 4) finde Min: höchstens n mal lösche Min: höchstens n mal füge ein: höchstens n mal verringere: höchstens m mal Zur Erinnerung: Für die Höhe in einem (a, 2a)-Baum gilt: Höhe(T ) = O(log n/ log a) Satz 5.44. Der Dijkstra-Algorithmus mit ungeordneten (a, 2a)-Bäumen hat eine Laufzeit von O(an log n/ log a + m log n/ log a) 2 Bemerkungen zur Wahl von a - m =O(n2 ): wähle a = n. Dann hat der Dijkstra-Algorithmus eine Laufzeit von O(n2 ) und der Baum wird zum Feld - m = O(n): wähle a = 2. Dann hat der Dijkstra-Algorithmus eine Laufzeit von O(n log n) - allgemein: wähle a = max(2, m n ). Dann hat der Dijkstra-Algorithmus eine Laufzeit von O(m log n/ max{1, log m n }).