Handout Version (4 Folien pro Seite)

Werbung
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Grundlegende Algorithmen
Dynamische Mengen
Algorithmen und Datenstrukturen
Kapitel 7
Definition
Bisher hatten wir oft statische Mengen, bei denen sich die Anzahl
der Elemente nicht ändert (z.B. beim Sortieren).
Oft soll eine Menge aber zeitabhängig wachsen und schrumpfen
können. Man spricht dann von dynamischen Mengen.
Kennengelernt haben wir bereits den Stack, die Queue und die
verkettete Liste.
Dynamische Mengen, das Suchproblem
&
Binäre Suchbäume
Anmerkung
Wir beschränken uns oft auf die Darstellung der für unsere
Operationen wichtigen Daten. Meist enthalten die Objekte aber
zusätzliche Satellitendaten z.B. einen Wächter am Ende einer
verketteten Liste.
Frank Heitmann
[email protected]
25. November 2015
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
1/122
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Grundlegende Algorithmen
Dynamische Mengen
2/122
Einführung
Grundlegende Algorithmen
Das Suchproblem
Definition (Das Suchproblem)
Wichtige Operationen (dynamischer Mengen):
Eingabe: Eine Sequenz < a1 , a2 , . . . , an > von n Zahlen und ein
Wert k.
Gesucht: Ein Index i mit k = A[i], falls k in A vorkommt oder der
Wert nil.
Search(S, k). Gibt es einen Zeiger x auf ein Element in S mit
schlüssel[x] = k?
Insert(S, x).
Delete(S, x).
Definition (Das Suchproblem (allgemein))
Minimum(S), Maximum(S), Successor(S, x),
Predecessor(S, x).
Eingabe: Eine Menge M und ein Wert k.
Gesucht: Ein Zeiger x auf ein Element in M mit schlüssel[x] = k
oder nil, falls kein solches Element existiert.
Viele hiervon haben wir schon bei z.B. der verketteten Liste
gesehen, aber wie schnell waren die?
Frank Heitmann [email protected]
3/122
Frank Heitmann [email protected]
4/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Grundlegende Algorithmen
Brute-Force-Suche (Array)
Einführung
Grundlegende Algorithmen
Brute-Force-Suche (Liste)
Algorithmus 1 Search(A[1..n], k)
1: for i = 1 to n do
2:
if a[i] == k then
3:
return i
4:
end if
5: end for
6: return nil
Algorithmus 2 Search(L, k)
1: x = kopf[L]
2: while x 6= nil && schlüssel[x] 6= k do
3:
x = nachfolger[x]
4: end while
5: return x
Analyse
Analyse
Laufzeit ist in Θ(n). Korrektheit folgt mit Schleifeninvariante (oder
hier auch direkt).
Laufzeit ist wieder in Θ(n). Korrektheit zeigt man wie oben.
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
5/122
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Grundlegende Algorithmen
Binäre Suche
6/122
Einführung
Grundlegende Algorithmen
Grundlegende Algorithmen - Zusammenfassung
Algorithmus 3 Binäre Suche (Array)
1: while first ≤ last ∧ idx < 0 do
2:
m = first + ((last − first)/2)
3:
if a[m] < p then
4:
first = m + 1
5:
else if a[m] > p then
6:
last = m − 1
7:
else
8:
idx = m
9:
end if
10: end while
11: return idx
Zusammenfassung
Die Laufzeit der Brute-Force-Suchalgorithmen war in Θ(n),
insb. da jedes Element betrachtet werden musste.
Die binäre Suche erlaubt eine Laufzeit in Θ(log n), ist aber
nicht bei jeder Datenstruktur anwendbar!
Wir suchen nun Datenstrukturen, die die Suche und auch die
anderen Operationen für dynamische Mengen in wenig Zeit
(z.B. in O(log n)) erlauben.
Pause to Ponder
Unsere bisherigen Datenstrukturen erlauben dies nicht. Man überlege sich dies an Array, Stack, Queue, Liste und Heap...
Analyse
Laufzeit ist in Θ(log n) (T (n) = T (n/2) + c).
Frank Heitmann [email protected]
7/122
Frank Heitmann [email protected]
8/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Binäre Suchbäume - Die Idee
Binäre Suchbäume - Die Idee
Binäre Suchbaum-Eigenschaft: Sei p ein Knoten im binären
Suchbaum. Sei l ein Knoten im linken Teilbaum von n, r im
rechten, dann gilt stets: schlüssel[l] ≤ schlüssel[p] und
schlüssel[p] ≤ schlüssel[r ].
Ein binärer Suchbaum ist eine Datenstruktur, die viele Operationen
auf dynamischen Mengen ermöglicht, insb. die Operationen
Search, Minimum, Maximum, Predecessor, Successor, Insert und
Delete. Ein binärer Suchbaum ist ein binärer Baum (jeder Knoten
hat bis zu zwei Kindern), wobei der Baum noch die spezielle
Suchbaum-Eigenschaft erfüllt.
10
Der Baum wird (anders als der Heap!) meist durch eine
verkettete Datenstruktur (ähnlich der doppelt-verketteten
Liste) repräsentiert. Jeder Knoten ist ein Objekt mit den
Attributen
6
Frank Heitmann [email protected]
2
nil
9/122
Einführung
Operationen
Rot-Schwarz-Bäume
5
7
7
12
9
Frank Heitmann [email protected]
nil
13
nil
nil
16
nil
Frank Heitmann [email protected]
10/122
Einführung
Operationen
Rot-Schwarz-Bäume
Binäre Suchbäume - Beispiel (schlecht)
14
8
9
15
4
6
3
12
nil
Grundlagen
Binäre Suchbäume
Anhang
10
5
8
(Im Bild sind nicht alle nil-Knoten eingezeichnet, nachfolgend
verzichten wir meist ganz auf sie.)
Binäre Suchbäume - Beispiel (gut)
2
14
3
schlüssel (und den Satellitendaten),
links, rechts, p, die auf den jeweiligen linken bzw. rechten
Nachfolger, bzw. den Vaterknoten zeigen (fehlen diese, sind
die entsprechenden Attribute auf nil gesetzt).
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
6
15
13
7
16
8
11/122
Frank Heitmann [email protected]
12/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Die Operationen
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk - Die Idee
Wir werden nachfolgenden folgende Operationen betrachten:
Gibt die Schlüssel aus, wobei
InorderTreeWalk(x).
zuerst die Schlüssel des linken,
TreeSearch(x, k), IterativeTreeSearch(x, k).
dann der Schlüssel der Wurzel und
TreeMinimum(x), TreeMaximum(x).
dann die Schlüssel des rechten Teilbaumes
TreeSuccessor(x), TreePredecessor(x).
ausgegeben werden.
TreeInsert(T , x), TreeDelete(T , z).
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
13/122
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk - Beispiel
10
Algorithmus 4 InorderTreeWalk(x)
1: if x 6= nil then
2:
InorderTreeWalk(links[x])
3:
print schlüssel[x]
4:
InorderTreeWalk(rechts[x])
5: end if
6
14
3
Anmerkung
2
Ähnlich kann man auch PreorderTreeWalk (Wurzel zuerst) und
PostorderTreeWalk (Wurzel zuletzt) schreiben.
Frank Heitmann [email protected]
14/122
15/122
8
5
7
12
9
Frank Heitmann [email protected]
15
13
16
16/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk - Beispiel
InorderTreeWalk - Beispiel
10
10
6
14
3
2
8
5
7
12
9
6
15
16
13
14
3
2
2
8
5
7
12
9
15
16
13
2 3
Frank Heitmann [email protected]
17/122
Grundlagen
Binäre Suchbäume
Anhang
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
10
6
14
8
5
7
12
9
6
15
13
14
3
16
2
2 3 5
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk - Beispiel
10
3
18/122
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk - Beispiel
2
Einführung
Operationen
Rot-Schwarz-Bäume
8
5
7
12
9
15
13
16
2 3 5 6
19/122
Frank Heitmann [email protected]
20/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk - Beispiel
InorderTreeWalk - Beispiel
10
10
6
14
3
2
8
5
7
12
9
6
15
16
13
14
3
2
2 3 5 6 7
8
5
7
12
9
21/122
Grundlagen
Binäre Suchbäume
Anhang
10
14
8
12
9
6
15
13
14
3
16
2
2 3 5 6 7 8 9 10
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk - Beispiel
6
7
22/122
Grundlagen
Binäre Suchbäume
Anhang
10
5
16
13
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk - Beispiel
2
15
2 3 5 6 7 8 9
Frank Heitmann [email protected]
3
Einführung
Operationen
Rot-Schwarz-Bäume
8
5
7
12
9
15
13
16
2 3 5 6 7 8 9 10 12 13 14 15 16
23/122
Frank Heitmann [email protected]
24/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk
Algorithmus 5 InorderTreeWalk(x)
1: if x 6= nil then
2:
InorderTreeWalk(links[x])
3:
print schlüssel[x]
4:
InorderTreeWalk(rechts[x])
5: end if
Anmerkung
Bei einem binären Suchbaum werden die Schlüssel bei
InorderTreeWalk in sortierter Reihenfolge ausgegeben! (Der Satz,
dass dies korrekt ist, folgt gleich. Der Beweis mündlich.)
Pause to Ponder
Satz
Wenn x die Wurzel eines Teilbaums mit n Knoten ist, dann ist
InorderTreeWalk(x) korrekt (folgt per Induktion aus den
Eigenschaften binärer Suchbäume).
Laufzeit?
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
25/122
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk - Laufzeitanalyse (1/4)
26/122
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk - Laufzeitanalyse (2/4)
Satz
Wenn x die Wurzel eines Teilbaums mit n Knoten ist, dann ist
InorderTreeWalk(x) in Zeit Θ(n).
Beweis.
Behauptung: T (n) = e · n.
Wollen wir dies mit Induktion beweisen, so merken wir gleich beim
Induktionsanfang T (0) = e · 0 = 0 6= c. Wir müssen unsere
Vermutung also verbessern!
Neue Vermutung: T (n) = e · n + c. Damit ist immer noch
T (n) ∈ Θ(n), aber der Induktionsanfang klappt jetzt!
Beweis.
Aufstellen der Rekurrenzgleichung: Beim einem leeren (Teil-)Baum
gilt T (0) = c. Ferner gilt bei Aufruf auf einen Knoten dessen linker
Teilbaum k und dessen rechter Teilbaum n − k − 1 Knoten hat
T (n) = T (k) + T (n − k − 1) + d.
Wir vermuten nun T (n) ∈ Θ(n), d.h. wir vermuten T (n) = e · n
für eine Konstante e.
Frank Heitmann [email protected]
Frank Heitmann [email protected]
27/122
Frank Heitmann [email protected]
28/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk - Laufzeitanalyse (3/4)
Einführung
Operationen
Rot-Schwarz-Bäume
InorderTreeWalk - Laufzeitanalyse
Beweis.
Behauptung: T (n) = e · n + c.
Induktionsschritt (n − 1 ⇒ n):
Anmerkung
Nimmt man als Behauptung gleich T (n) = (c +d)n+c, so klappt alles sofort, aber die Gleichung fällt dann ’vom Himmel’. Oben kommt
man auf e = c + d, weil man ja möchte, dass sich T (n) = e · n + c
ergibt.
T (n) = T (k) + T (n − k − 1) + d
= (e · k + c) + (e · (n − k − 1) + c) + d
= e · n − e + 2c + d
Setzen wir e = c + d (denn wir wollen ja T (n) = e · n + c
erreichen (nicht T (n + 1) = ..., da wir den Induktionsschritt ja auf
n machen)) und verfeinern auf diese Weise also unsere Behauptung
erneut (!), so wird gleich alles klappen!
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
29/122
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
30/122
Grundlagen
Binäre Suchbäume
Anhang
InorderTreeWalk - Laufzeitanalyse (4/4)
Einführung
Operationen
Rot-Schwarz-Bäume
TreeSearch - Die Idee am Beispiel
Beweis.
Gegeben (aus dem Code): T (n) mit T (0) = c und
T (n) = T (k) + T (n − k − 1) + d.
Behauptung: T (n) = (c + d) · n + c.
Induktionsanfang: T (0) = c.
Induktionsannahme: Behauptung gelte schon für Werte kleiner n.
Induktionsschritt (n − 1 ⇒ n):
10
6
14
3
T (n) = T (k) + T (n − k − 1) + d
= ((c + d) · k + c) + ((c + d) · (n − k − 1) + c) + d
2
= (c + d) · n − (c + d) + 2c + d
= (c + d) · n + c
8
5
7
12
9
15
13
16
TreeSearch 7? 15? 11?
Also gilt T (n) ∈ Θ(n).
Frank Heitmann [email protected]
31/122
Frank Heitmann [email protected]
32/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
TreeSearch - Die Idee
Einführung
Operationen
Rot-Schwarz-Bäume
TreeSearch - Pseudocode
Algorithmus 6 TreeSearch(x, k)
1: if x == nil or k == schlüssel[x] then
2:
return x
3: else if k < schlüssel[x] then
4:
return TreeSearch(links[x], k)
5: else
6:
return TreeSearch(rechts[x], k)
7: end if
Beginne mit der Wurzel. Ist diese kleiner als der Schlüssel, so
suche im rechten Teilbaum, ist sie grösser, suche im linken.
Fahre wie oben mit der Wurzel diese Teilbaumes fort.
Breche ab, wenn Schlüssel gefunden oder, wenn nil-’Knoten’
erreicht wird.
Analyse
Die Knoten, die während der Rekursion besucht werden, bilden
einen Pfad von der Wurzel bis maximal zu einem Blatt. Die
Korrektheit folgt aus den Eigenschaften binärer Suchbäume. Die
Laufzeit ist in O(h), wobei h die Höhe des Baumes ist.
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
33/122
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
34/122
Grundlagen
Binäre Suchbäume
Anhang
TreeSearch - Pseudocode (iterativ)
Einführung
Operationen
Rot-Schwarz-Bäume
TreeSearch, Minimum und Maximum am Beispiel
10
Algorithmus 7 IterativeTreeSearch(x, k)
1: while x 6= nil and k 6= schlüssel[x] do
2:
if k < schlüssel[x] then
3:
x = links[x]
4:
else
5:
x = rechts[x]
6:
end if
7: end while
8: return x
6
14
3
2
8
5
7
12
9
15
13
16
TreeSearch 5? Minimum? Maximum?
Frank Heitmann [email protected]
35/122
Frank Heitmann [email protected]
36/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Minimum und Maximum
Vorgänger und Nachfolger
Wir wollen den Nachfolger eines Knotens in der sortierten
Reihenfolge ausgeben. (Den Vorgänger ermittelt man analog.)
Algorithmus 8 TreeMinimum(x)
1: while links[x] 6= nil do
2:
x = links[x]
3: end while
4: return x
10
6
Algorithmus 9 TreeMaximum(x)
1: while rechts[x] 6= nil do
2:
x = rechts[x]
3: end while
4: return x
2
Frank Heitmann [email protected]
8
5
7
12
9
13
16
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
38/122
Grundlagen
Binäre Suchbäume
Anhang
Nachfolger - Beispiel
Einführung
Operationen
Rot-Schwarz-Bäume
Nachfolger - Beispiel
10
10
6
14
3
8
5
15
Wir können dies machen ohne jemals Schlüssel zu vergleichen!
37/122
Grundlagen
Binäre Suchbäume
Anhang
14
3
Analyse (Korrektheit und Laufzeit) wie bei TreeSearch.
2
Einführung
Operationen
Rot-Schwarz-Bäume
7
12
9
Frank Heitmann [email protected]
6
15
13
14
3
16
2
39/122
8
5
7
12
9
Frank Heitmann [email protected]
15
13
16
40/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Nachfolger - Beispiel
Nachfolger - Beispiel
10
10
6
14
3
2
8
5
Einführung
Operationen
Rot-Schwarz-Bäume
7
12
9
6
15
13
3
16
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
2
41/122
Einführung
Operationen
Rot-Schwarz-Bäume
8
5
7
12
9
15
13
16
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Nachfolger - Die Idee
42/122
Einführung
Operationen
Rot-Schwarz-Bäume
Nachfolger - Die Idee
Dann ist der Nachfolger y der jüngste Vorfahre von x,
dessen linkes Kind ebenfalls ein Vorfahre von x ist.
Der Nachfolger eines Knotens x ist der Knoten mit dem kleinsten
Schlüssel, der größer ist als schlüssel[x].
Das heißt wir gehen von x aus nach oben und der erste Knoten y
auf den wir treffen von dem aus gesehen x in seinem linken
Teilbaum ist, ist der gesuchte. Dann gilt nämlich gerade
schlüssel[x] < schlüssel[y ] (wegen ’linken’ oben) und es gibt auch
keinen Schlüssel dazwischen (wegen ’erste’ oben).
Größer als schlüssel[x] heisst im rechten Teilbaum von x
und dort am kleinsten heisst das Minimum (’ganz links’).
⇒ Problem: x muss gar keinen rechten Teilbaum haben!
Dann ist der Nachfolger y der jüngste Vorfahre von x, dessen
linkes Kind ebenfalls ein Vorfahre von x ist.
(Obiges kann in einen Beweis um-/ausformuliert werden.)
Bemerkung
Umgangssprachlich: Wir gehen im Baum immer weiter nach oben,
wenn wir das erste Mal nach rechts gehen, haben wir den gesuchten
Knoten.
(Geht das auch nicht, dann ist x das größte Element und hat
keinen Nachfolger.)
Frank Heitmann [email protected]
14
43/122
Frank Heitmann [email protected]
44/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Nachfolger - Die Idee
Nachfolger - Die Idee
Dann ist der Nachfolger y der jüngste Vorfahre von x,
dessen linkes Kind ebenfalls ein Vorfahre von x ist.
Dann ist der Nachfolger y der jüngste Vorfahre von x,
dessen linkes Kind ebenfalls ein Vorfahre von x ist.
10
10
6
14
3
2
8
5
Einführung
Operationen
Rot-Schwarz-Bäume
7
12
9
6
15
13
3
16
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
14
2
45/122
Einführung
Operationen
Rot-Schwarz-Bäume
8
5
7
12
9
13
16
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Nachfolger - Pseudocode
15
46/122
Einführung
Operationen
Rot-Schwarz-Bäume
Einfügen - Die Idee
Algorithmus 10 TreeSucessor(x)
1: if rechts[x] 6= nil then
2:
return TreeMinimum(rechts[x])
3: end if
4: y = p[x]
5: while y 6= nil and x == rechts[y ] do
6:
x =y
7:
y = p[y ]
8: end while
9: return y
Wir manipulieren nun die (dynamische!) Datenstruktur, indem
wir ein Element hinzufügen. Dabei soll die Suchbaum-Eigenschaft
erhalten bleiben.
Im Prinzip suchen wir (ähnlich der Suche) den richtigen Platz und
fügen das neue Element einfach als Blatt an...
Analyse
Korrektheit folgt aus obigen Überlegungen. Laufzeit ist wieder in
O(h). Die Routine TreePredecessor implementiert man analog.
Frank Heitmann [email protected]
47/122
Frank Heitmann [email protected]
48/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Einfügen - Beispiel
Einfügen - Beispiel
10
10
6
14
3
2
Einführung
Operationen
Rot-Schwarz-Bäume
8
5
7
12
9
6
15
13
14
3
16
2
8
5
7
12
9
11
15
13
16
Insert 11? Insert 4?
Frank Heitmann [email protected]
49/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Einfügen - Beispiel
50/122
Einführung
Operationen
Rot-Schwarz-Bäume
Einfügen - Die Idee
10
6
14
3
2
8
5
7
12
9
11
Im Code halten wir nun einen Zeiger auf x (hier soll das neue
Element hin) und einen Zeiger y auf p[x]. An y wird dann das
neue Element angehängt...
15
13
16
4
Frank Heitmann [email protected]
51/122
Frank Heitmann [email protected]
52/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Einfügen - Pseudocode Teil 1
Einführung
Operationen
Rot-Schwarz-Bäume
Einfügen - Pseudocode Teil 2
Algorithmus 11 TreeInsert(T , z) - Teil 1
1: y = nil
2: x = wurzel[T ]
3: while x 6= nil do
4:
y =x
5:
if schlüssel[z] < schlüssel[x] then
6:
x = links[x]
7:
else
8:
x = rechts[x]
9:
end if
10: end while
Algorithmus 12 TreeInsert(T , z) - Teil 2
1: p[z] = y
2: if y == nil then
3:
wurzel[T ] = z
4: else
5:
if schlüssel[z] < schlüssel[y ] then
6:
links[y ] = z
7:
else
8:
rechts[y ] = z
9:
end if
10: end if
Erklärung
x zeigt jetzt auf nil. y auf den zuletzt besuchten Knoten an den
jetzt der neue Knoten z angefügt werden soll. Oft ist y ein Blatt.
Erklärung
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Der Vater von z ist y und z ist linkes oder rechtes Kind von y (je
nach Schlüssel). links[z] und rechts[z] sind ferner nil.
53/122
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Die Idee
z hat keine Kinder. Dann kann er einfach gelöscht werden.
(p[z] zeigt auf nil statt auf z).
2
z hat genau ein Kind. Dann werden p[z] und left[z]
bzw. right[z] verbunden und damit z ’ausgeschnitten’. (Man
vergleiche dies mit der Lösch-Operation bei verketteten
Listen!)
3
10
6
14
3
z hat zwei Kinder. Dann wird z’s Nachfolger y genommen
(hat kein linkes Kind!), ausgeschnitten (siehe 2. oben) und
mit seinen Daten die Daten von z ersetzt.
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
Löschen - Beispiel
Das Löschen eines Knotens z ist komplizierter. Es gibt drei Fälle:
1
54/122
2
55/122
8
5
7
12
9
Frank Heitmann [email protected]
15
13
16
56/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Beispiel
Löschen - Beispiel
10
10
6
14
3
2
8
5
7
12
9
6
15
13
Grundlagen
Binäre Suchbäume
Anhang
14
3
16
Frank Heitmann [email protected]
8
5
57/122
7
12
9
15
13
16
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Beispiel
58/122
Einführung
Operationen
Rot-Schwarz-Bäume
Löschen - Beispiel
10
10
6
14
3
8
5
Einführung
Operationen
Rot-Schwarz-Bäume
7
12
9
Frank Heitmann [email protected]
6
15
13
14
3
16
8
5
59/122
7
12
9
Frank Heitmann [email protected]
13
16
60/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Beispiel
Löschen - Beispiel
10
10
6
14
3
8
5
7
12
9
6
16
8
5
61/122
Grundlagen
Binäre Suchbäume
Anhang
14
3
13
Frank Heitmann [email protected]
7
12
9
16
13
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Beispiel
62/122
Einführung
Operationen
Rot-Schwarz-Bäume
Löschen - Beispiel
10
10
6
14
3
8
5
Einführung
Operationen
Rot-Schwarz-Bäume
7
12
9
Frank Heitmann [email protected]
6
14
16
8
13
5
63/122
7
12
9
Frank Heitmann [email protected]
16
13
64/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Beispiel
Einführung
Operationen
Rot-Schwarz-Bäume
Löschen - Beispiel
10
10
6
14
5
8
7
12
9
6
16
5
8
13
7
Frank Heitmann [email protected]
65/122
Grundlagen
Binäre Suchbäume
Anhang
14
12
9
13
Frank Heitmann [email protected]
Einführung
Operationen
Rot-Schwarz-Bäume
66/122
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Beispiel
16
Einführung
Operationen
Rot-Schwarz-Bäume
Löschen - Beispiel
10
10
6
14
5
8
7
12
9
Frank Heitmann [email protected]
6
16
14
5
13
8
7
67/122
12
9
Frank Heitmann [email protected]
16
13
68/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Beispiel
Einführung
Operationen
Rot-Schwarz-Bäume
Löschen - Beispiel
10
12
6
14
5
8
7
12
9
6
16
Grundlagen
Binäre Suchbäume
Anhang
5
13
Frank Heitmann [email protected]
14
7
69/122
Einführung
Operationen
Rot-Schwarz-Bäume
13
8
9
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Löschen - Pseudocode
16
70/122
Einführung
Operationen
Rot-Schwarz-Bäume
Operationen - Zusammenfassung (1/4)
Zusammenfassung der Operationen
InorderTreeWalk ≈ Rekursiv erst die Elemente des linken
Teilbaumes ausgeben, dann das Element selbst, dann die
Elemente des rechten Teilbaumes. Gibt bei einem binären
Suchbaum die Elemente in sortierter Reihenfolge aus.
Auf den Sourcecode verzichten wir hier. Ähnlich wie beim Einfügen
müssen die Zeigern ’umgebogen’ werden.
Weitere Details findet man im [Cormen] in Kapitel 12.3.
TreeSearch ≈ Suche im linken Teilbaum weiter, wenn zu
suchendes Element kleiner ist als das Wurzelelement, sonst im
rechten Teilbaum.
Frank Heitmann [email protected]
71/122
Frank Heitmann [email protected]
72/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Operationen - Zusammenfassung (2/4)
Operationen - Zusammenfassung (3/4)
Zusammenfassung der Operationen
Zusammenfassung der Operationen
Minimum ≈ Element ganz links.
Einfügen ≈ Ähnnlich wie beim Suchen die geeignete Position
suchen und das neue Element als neues Blatt anfügen.
Löschen ≈ Drei Fälle:
Maximum ≈ Element ganz rechts.
Nachfolger (von x) ≈ der Knoten mit dem kleinsten Schlüssel,
der größer ist als schlüssel[x]. Minimum im rechten Teilbaum
oder der jüngste Vorfahre von x, dessen linkes Kind ebenfalls
ein Vorfahre von x ist.
1
2
3
Vorgänger (von x) ≈ analog ...
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
73/122
Einführung
Operationen
Rot-Schwarz-Bäume
z hat keine Kinder. Dann kann er einfach gelöscht werden.
(p[z] zeigt auf nil statt auf z).
z hat genau ein Kind. Dann werden p[z] und left[z]
bzw. right[z] verbunden und damit z ’ausgeschnitten’.
z hat zwei Kinder. Dann wird z’s Nachfolger y genommen (hat
kein linkes Kind!), ausgeschnitten (siehe 2. oben) und mit
seinen Daten die Daten von z ersetzt.
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Operationen - Zusammenfassung (4/4)
74/122
Einführung
Operationen
Rot-Schwarz-Bäume
Rot-Schwarz-Bäume - Die Idee
Zusammenfassung der Operationen
Die Operationen InorderTreeWalk, TreeSearch, Minimum,
Maximum, Successor, Insert und Delete sind alle korrekt, was man
stets recht einfach über die Eigenschaften binärer Suchbäume
zeigen kann (ggf. mit Induktion über die Anzahl der Knoten oder
die Tiefe des Baumes).
Bei einem binären Suchbaum mit n Knoten der Höhe h, ist die
Laufzeit von InorderTreeWalk in O(n), die aller anderen
Operationen in O(h).
Rot-Schwarz-Bäume sind binäre Suchbäume, bei denen jeder
Knoten eine ’Farbe’ hat (rot oder schwarz). Durch
Einschränkungen (Rot-Schwarz-Eigenschaften) wird sichergestellt,
dass der Baum annähernd balanciert ist, so dass die Operationen
dann auch im worst-case in O(log n) laufen.
Das Problem ist es dann die Operationen wie insb. Einfügen und
Löschen so zu implementieren, dass die Rot-Schwarz-Eigenschaften
erhalten bleiben (und sie dann trotzdem in O(log n) sind)!
Anmerkung
Diese Laufzeiten sind zwar gut, da bei einem (ungefähr) ausgeglichenen Baum h ≈ log n ist. Das Problem ist aber, dass binäre
Suchbäume nicht ausgeglichen sein müssen! Im worst-case sind obige Operationen alle in Θ(n)!
Frank Heitmann [email protected]
75/122
Frank Heitmann [email protected]
76/122
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Eigenschaften
AVL-Bäume - Die Idee
1
Jeder Knoten ist entweder rot oder schwarz.
2
Die Wurzel ist schwarz.
3
Jedes Blatt ist schwarz.
4
Wenn ein Knoten rot ist, dann sind seine beiden Kinder
schwarz.
5
Für jeden Knoten enthalten alle Pfade, die an diesem Knoten
starten und in einem Blatt des Teilbaumes dieses Knotens
enden, die gleiche Anzahl schwarzer Knoten
Ein AVL-Baum ist ein binärer Suchbaum, der höhenbalanciert ist,
d.h. für jeden Knoten x unterscheiden sich die Höhen des linken
und rechten Teilbaumes maximal um 1. Ist also h[links[x]] die
Höhe des linken und h[rechts[x]] die Höhe des rechten Teilbaumes,
dann gilt bei einem AVL-Baum für jeden Knoten x
h[links[x]] − h[rechts[x]] ∈ {−1, 0, 1}
Bei AVL-Bäumen spielt wie auch bei Rot-Schwarz-Bäumen die
Rotation eine wichtige Rolle. Mit ihr wird der Baum nach einer
Einfügeoperation stets wieder ausbalanciert.
Satz
Ein Rot-Schwarz-Baum mit n inneren Knoten hat höchstens die
Höhe 2 · log(n + 1).
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Einführung
Operationen
Rot-Schwarz-Bäume
77/122
Einführung
Operationen
Rot-Schwarz-Bäume
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
78/122
Rot-Schwarz-Bäume
Zusammenfassung
Grundlagen des Suchens:
Brute-Force-Algorithmus
Binäres Suchen (Array muss sortiert sein!)
Anhang
Suchbäume
Definition
TreeWalk, Suchen, Minimum, Maximum
Vorgänger, Nachfolger
Einfügen, Entfernen
Rot-Schwarz-Bäume
AVL-Bäume
Frank Heitmann [email protected]
79/122
Frank Heitmann [email protected]
80/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Rot-Schwarz-Eigenschaften
Rot-Schwarz-Bäume
Ein Rot-Schwarz-Baum (noch ohne Färbung)
10
1
Jeder Knoten ist entweder rot oder schwarz.
2
Die Wurzel ist schwarz.
3
Jedes Blatt ist schwarz.
4
Wenn ein Knoten rot ist, dann sind seine beiden Kinder
schwarz.
5
Für jeden Knoten enthalten alle Pfade, die an diesem Knoten
starten und in einem Blatt des Teilbaumes dieses Knotens
enden, die gleiche Anzahl schwarzer Knoten
6
3
81/122
Grundlagen
Binäre Suchbäume
Anhang
8
2
nil
Frank Heitmann [email protected]
14
5
7
12
nil
nil
2
5
12
9
Rot-Schwarz-Bäume
6
15
13
14
3
16
2
8
5
7
12
9
nil [T]
Frank Heitmann [email protected]
nil
Ein Rot-Schwarz-Baum (Wurzel und Blätter gefärbt)
14
7
16
10
6
8
nil
82/122
Grundlagen
Binäre Suchbäume
Anhang
10
3
13
Frank Heitmann [email protected]
Rot-Schwarz-Bäume
Ein Rot-Schwarz-Baum (noch ohne Färbung)
nil
9
15
15
13
16
nil [T]
83/122
Frank Heitmann [email protected]
84/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Ein Rot-Schwarz-Baum (gefärbt)
Rot-Schwarz-Bäume
Ein Rot-Schwarz-Baum (in schön)
10
10
6
14
6
3
8
12
14
15
3
2
5
7
9
13
8
12
15
16
2
5
7
9
13
16
nil [T]
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
85/122
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Rot-Schwarz-Eigenschaften (Wiederholung)
1
Jeder Knoten ist entweder rot oder schwarz.
2
Die Wurzel ist schwarz.
3
Jedes Blatt ist schwarz.
4
Wenn ein Knoten rot ist, dann sind seine beiden Kinder
schwarz.
5
Für jeden Knoten enthalten alle Pfade, die an diesem Knoten
starten und in einem Blatt des Teilbaumes dieses Knotens
enden, die gleiche Anzahl schwarzer Knoten
86/122
Rot-Schwarz-Bäume
Balanciertheit
Satz
Ein Rot-Schwarz-Baum mit n inneren Knoten hat höchstens die
Höhe 2 · log(n + 1).
Satz
Die Operationen Search, Minimum, Maximum, Successor,
Predecessor für dynamische Mengen lassen sich auf
Rot-Schwarz-Bäumen in Zeit O(log n) implementieren, wobei n die
Anzahl der Knoten ist.
Anmerkung
Die Blätter sind alle nil-Knoten (der Wächter nil[T ]) und schwarz.
Die Wurzel hat als Vorgänger auch nil[T ] (Siehe die beiden vorherigen Bilder.)
Frank Heitmann [email protected]
87/122
Frank Heitmann [email protected]
88/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Rotationen
Rot-Schwarz-Bäume
Rotation - Bildlich
LeftRotate(x)
x
Auch die Operationen TreeInsert und TreeDelete sind in Zeit
O(log n), aber da sie den Baum modifizieren, kann es passieren,
dass die Rot-Schwarz-Eigenschaften danach nicht mehr erfüllt sind.
RightRotate(x)
A
Um die Eigenschaften wiederherzustellen, müssen ggf. Farben und
die Zeigerstruktur geändert werden. Ein wichtiges Hilfsmittel
hierbei (zur Änderung der Zeigerstruktur) ist die Rotation ...
y
B
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
y
89/122
C
A
B
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Linksrotation
C
x
90/122
Rot-Schwarz-Bäume
Linksrotation - zum Merken
LeftRotate(x)
x
A
y
B
y
C
x
C
A
A
B
y
B
Das rechte Kind (y ) von x ist nicht nil.
y wird neue Wurzel des Teilbaumes.
x wird das linke Kind von y .
Das linke Kind von y wird rechtes Kinds von x.
Frank Heitmann [email protected]
LeftRotate(x)
x
y
C
x
C
A
B
Ziehe an A-x-y -C wie an einer Schnur.
A und x rutschen nach unten, y und C nach oben
B bleibt übrig. Einziger sinnvoller Platz: rechts von x.
⇒ Erhälte die binäre Suchbaum-Eigenschaft!
91/122
Frank Heitmann [email protected]
92/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Rechtsrotation
Rot-Schwarz-Bäume
Rechtsrotation - zum Merken
x
y
x
y
RightRotate(x)
A
y
B
RightRotate(x)
C
x
C
A
A
B
B
Das linke Kind (x) von y ist nicht nil.
x wird neue Wurzel des Teilbaumes.
y wird das rechte Kind von y .
Das rechte Kind von x wird linkes Kinds von y .
93/122
A
Grundlagen
Binäre Suchbäume
Anhang
B
94/122
Rot-Schwarz-Bäume
Rotation - Beispiel
LeftRotate(x)
x
10
y
RightRotate(x)
y
B
C
Frank Heitmann [email protected]
Rot-Schwarz-Bäume
Rotation - Bildlich
A
C
x
Ziehe an A-x-y -C wie an einer Schnur.
C und y rutschen nach unten, x und A nach oben
B bleibt übrig. Einziger sinnvoller Platz: links von y .
⇒ Erhälte die binäre Suchbaum-Eigenschaft!
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
y
C
A
6
C
x
3
B
8
7
Die Rotation erhält die binäre Suchbaum-Eigenschaft!
Frank Heitmann [email protected]
14
95/122
12
9
Frank Heitmann [email protected]
15
13
16
96/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Rotation - Beispiel
Rot-Schwarz-Bäume
Rotation - Beispiel
10
10
6
14
3
8
7
12
9
8
15
13
6
16
Frank Heitmann [email protected]
3
97/122
Grundlagen
Binäre Suchbäume
Anhang
14
9
?
?
Rotation - Beispiel
15
?
7
?
13
16
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
12
98/122
Rot-Schwarz-Bäume
Rotation - Implementation
10
8
6
3
Die Implementierung ist wieder ’Zeigerspielerei’. (Ähnlich des
Ausschneidens in verketteten Listen.)
14
9
7
Frank Heitmann [email protected]
12
Details sind im [Cormen] zu finden.
Laufzeit ist in O(1), da nur (eine konstante Anzahl von)
Zeiger verändert werden.
15
13
16
99/122
Frank Heitmann [email protected]
100/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen
Rot-Schwarz-Bäume
Einfügen - Grossvater, Onkel und Vater...
z ist der neu eingefügte, rote Knoten. In einer while-Schleife, in der
immer geprüft wird, ob der Vater von z rot ist (nur dann muss man
fortfahren), werden nun drei Fälle unterschieden. Die drei Fälle
treten ’spiegelverkehrt’ auf, je nachdem ob z im linken Teilbaum
seines Grossvaters ist, oder im rechten. Wir behandeln nachfolgend
die erste Variante (z ist im linken Teilbaum seines Grossvaters).
Beim Einfügen passiert nun zunächst das gleiche wie bei normalen
binären Suchbäumen.
Die Farbe des neu eingefügten Knotens wird auf ’rot’ gesetzt.
Dann wird eine Routine aufgerufen, die die
Rot-Schwarz-Eigenschaften wiederherstellt...
Eine wichtige Rolle spielt der Onkel y (= rechts[p[p[z]]]) von z und
insb. dessen Farbe sowie, ob z ein linkes oder rechtes Kind ist.
(z hat nachfolgend Kinder, weil in der Routine der Zeiger z nach
oben wandern kann.)
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
101/122
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Fall 1
F
neu z
Fall 1: z’s Onkel y ist rot. Umfärben und z neu (!) setzen.
F
F
neu z
G
H
G
G
H
H
G
H
z
z
B
F
y
y
I
Rot-Schwarz-Bäume
Einfügen - Fall 1
Fall 1: z’s Onkel y ist rot. Umfärben und z neu (!) setzen.
A
102/122
D
E
C
Frank Heitmann [email protected]
I
A
B
D
I
A
E
B
C
103/122
D
E
C
Frank Heitmann [email protected]
I
A
B
D
E
C
104/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Fall 1b
Rot-Schwarz-Bäume
Einfügen - Fall 1b
Fall 1b: z’s Onkel y ist rot. Umfärben und z neu (!) setzen.
F
Fall 1b: z’s Onkel y ist rot. Umfärben und z neu (!) setzen.
F
F
neu z
y
y
G
F
neu z
H
G
G
H
H
G
H
z
z
I
B
A
D
E
I
A
C
B
D
B
C
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
I
E
105/122
A
D
C
B
Grundlagen
Binäre Suchbäume
Anhang
F
neu z
y
G
E
C
106/122
Rot-Schwarz-Bäume
F
F
G
D
Fall 2: z’s Onkel ist schwarz und z ist rechtes Kind seines Vaters. z
wird auf p[z] gesetzt und eine Linksrotation wird um (das neue) z
gemacht. Dann weiter mit Fall 3. (Der gilt jetzt!)
I
I
Frank Heitmann [email protected]
B
D
I
A
E
B
C
107/122
C
Frank Heitmann [email protected]
y
I
D
z
A
C
F
y
G
H
z
B
D
Einfügen - Fall 2
Fall 2: z’s Onkel ist schwarz und z ist rechtes Kind seines Vaters. z
wird auf p[z] gesetzt und eine Linksrotation wird um (das neue) z
gemacht. Dann weiter mit Fall 3. (Der gilt jetzt!)
A
A
Frank Heitmann [email protected]
Rot-Schwarz-Bäume
Einfügen - Fall 2
I
E
z
G
A
D
C
B
108/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Fall 3
Einfügen - Fall 3
Fall 3: z’s Onkel ist schwarz und z ist linkes Kind seines Vaters.
Farbe von p[z] auf schwarz (bisher rot), von p[p[z]] auf rot (bisher
schwarz) und Rechtsrotation um p[p[z]]. (z nicht neu setzen!)
F
z
G
Fall 3: z’s Onkel ist schwarz und z ist linkes Kind seines Vaters.
Farbe von p[z] auf schwarz (bisher rot), von p[p[z]] auf rot (bisher
schwarz) und Rechtsrotation um p[p[z]]. (z nicht neu setzen!)
F
I
y
I
G
D
A
B
C
G
C
A
F
B
C
D
B
B
109/122
Grundlagen
Binäre Suchbäume
Anhang
F
Grundlagen
Binäre Suchbäume
Anhang
G
z
B C
I
z
G
Rot-Schwarz-Bäume
I
y
D
C
110/122
Einfügen - Beispiel
F
y
D
Frank Heitmann [email protected]
Rot-Schwarz-Bäume
Einfügen - Fall 2 & 3 in Folge
A
G
D
D
Frank Heitmann [email protected]
I
y
I
F
z
C
I
z
A
A
Rot-Schwarz-Bäume
z
G
A
F
B
C
Nun einmal am Beispiel. Der Knoten 4 wird hier neu eingefügt...
D
A B
Frank Heitmann [email protected]
111/122
Frank Heitmann [email protected]
112/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Beispiel
Einfügen - Beispiel
11
2
11
14
1
2
7
5
z
Rot-Schwarz-Bäume
15
8
14
1
z
7
y
5
4
y
15
8
4
Fall 1: z’s Onkel y ist rot. Umfärben und z auf p[p[z]] neu setzen.
Frank Heitmann [email protected]
Fall 1: z’s Onkel y ist rot. Umfärben und z auf p[p[z]] neu setzen.
113/122
Grundlagen
Binäre Suchbäume
Anhang
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Beispiel
114/122
Rot-Schwarz-Bäume
Einfügen - Beispiel
11
2
11
14
1
z
7
5
y
7
z
15
8
1
4
8
y
15
5
4
Fall 2: z’s Onkel ist schwarz und z ist rechtes Kind seines Vaters. z
wird auf p[z] gesetzt und eine Linksrotation wird um (das neue) z
gemacht. Dann weiter mit Fall 3. (Der gilt jetzt!)
Frank Heitmann [email protected]
2
14
Fall 2: z’s Onkel ist schwarz und z ist rechtes Kind seines Vaters. z
wird auf p[z] gesetzt und eine Linksrotation wird um (das neue) z
gemacht. Dann weiter mit Fall 3. (Der gilt jetzt!)
115/122
Frank Heitmann [email protected]
116/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Beispiel
Einfügen - Beispiel
11
7
z
2
1
Rot-Schwarz-Bäume
7
14
8
y
z
15
2
11
1
5
5
8
14
4
15
4
Fall 3: z’s Onkel ist schwarz und z ist linkes Kind seines Vaters.
Farbe von p[z] auf schwarz (bisher rot), von p[p[z]] auf rot (bisher
schwarz) und Rechtsrotation um p[p[z]].
Fall 3: z’s Onkel ist schwarz und z ist linkes Kind seines Vaters.
Farbe von p[z] auf schwarz (bisher rot), von p[p[z]] auf rot (bisher
schwarz) und Rechtsrotation um p[p[z]].
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
117/122
Frank Heitmann [email protected]
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Zusammenfassung
118/122
Rot-Schwarz-Bäume
Einfügen - Die Schleifeninvariante
Der neu eingefüge Knoten z ist im linken Teilbaum seines
Grossvaters. z und sein Vater sind rot.
Die Schleifeninvariante:
Fall 1: z’s Onkel y ist rot. Umfärben und z auf p[p[z]] neu
setzen. (Es gibt hier zwei Fälle, die gleich behandelt werden.)
Fall 2: z’s Onkel ist schwarz und z ist rechtes Kind seines
Vaters. z wird auf p[z] gesetzt und eine Linksrotation wird um
(das neue) z gemacht. Dann weiter mit Fall 3. (Der gilt jetzt!)
Fall 3: z’s Onkel ist schwarz und z ist linkes Kind seines
Vaters. Farbe von p[z] auf schwarz (bisher rot), von p[p[z]]
auf rot (bisher schwarz) und Rechtsrotation um p[p[z]]. (z
nicht neu setzen, die Routine terminiert hier.)
a) Der Knoten z ist rot.
b) Falls p[z] die Wurzel ist, ist p[z] schwarz.
c) Falls es eine Verletzung der
Rot-Schwarz-Eigenschaften gibt, gibt es höchstens
eine und diese verletzt Eigenschaft 2 oder 4. Ist es 2,
so ist z die Wurzel und rot, ist es 4, so sind z und
p[z] beide rot.
Ist z im rechten Teilbaum seines Grossvaters treten obige Fälle
spiegelverkehrt auf. Überall muss dann links und rechts vertauscht
werden.
Frank Heitmann [email protected]
119/122
Frank Heitmann [email protected]
120/122
Grundlagen
Binäre Suchbäume
Anhang
Grundlagen
Binäre Suchbäume
Anhang
Rot-Schwarz-Bäume
Einfügen - Jetzt zu tun...
Zusammenfassung
Wir müssten jetzt - wir könnten jetzt...
Zusammenfassung
Rot-Schwarz-Bäume sind binäre Suchbäume, die die
zusätzlichen Rot-Schwarz-Eigenschaften erfüllen.
Den Pseudocode ausführlicher schreiben.
⇒ Dabei insb. auf ’Randfälle’ achten (leerer Baum, z hat keinen
Onkel, ...)
2 Die Schleifeninvariante bei Initialisierung zeigen.
3 Fortsetzung zeigen, wobei hier primär gezeigt werden muss,
dass die drei obigen Fälle die Invariante zu Beginn der
nächsten Iteration erhalten.
4 Terminierung zeigen und (unter Nutzung der
Schleifeninvarianten) dann die Korrektheit des Algorithmus
zeigen, d.h. dass wieder ein Rot-Schwarz-Baum vorliegt.
1
Ein Baum der die Rot-Schwarz-Eigenschaften erfüllt ist in
etwa ausgeglichen (h ≤ 2 · log(n + 1)).
Der Erhalt der Rot-Schwarz-Eigenschaften ist insb. bei der
Einfüge- und der Löschoperation zu beachten. Sie können in
O(log n) implementiert werden.
Damit erlauben Rot-Schwarz-Bäume die wichtigen
Operationen für dynamische Mengen alle in O(log n) Zeit!
(Allerdings sind sie dafür aufwändiger als normale binäre
Suchbäume.)
Den genauen Beweis der Schleifeninvarianten und den Pseudocode
der Einfügeoperation (sowie der Rotation) findet man im [Cormen].
Dort ist auch eine Behandlung der Löschoperation zu finden.
Frank Heitmann [email protected]
Rot-Schwarz-Bäume
121/122
Frank Heitmann [email protected]
122/122
Herunterladen