Balancierte Bäume

Werbung
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 }).
Herunterladen