14. Rot-Schwarz

Werbung
14. Rot-Schwarz-Bäume
Bislang: Wörterbuchoperationen bei binären
Suchbäume effizient durchführbar, falls Höhe des
Baums klein.
Rot-Schwarz-Bäume spezielle Suchbäume.
Rot-Schwarz-Baum mit n Knoten hat Höhe höchstens
2 log(n+1).
Tree-Search, Tree-Minimum,… können unverändert
bleiben.
Tree-Insert, Tree-Delete müssen erweitert werden,
um Rot-Schwarz-Bäume zu erhalten.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
1
Rot-Schwarz-Bäume - Überblick
1. Definition von Rot-Schwarz-Bäumen
2. Zeigen Rot-Schwarz-Baum mit n Knoten hat Höhe
höchstens 2 log(n+1).
3. Definieren Rotationen, als wichtiges Hilfsmittel zur
Erweiterung von Tree-Insert und Tree-Delete.
4. Beschreiben Erweiterungen von Tree-Insert (und
Tree-Delete), so dass Rot-Schwarz-Bäume erhalten
bleiben.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
2
Rot-Schwarz-Bäume – Definition (1)
Rot-Schwarz-Bäume sind binäre Suchbäume mit
zusätzlichem Feld color für jeden Knoten x.
color ist entweder Rot oder Schwarz.
Wenn ein Eltern oder ein Kind eines Knotens nicht
vorhanden, dann wird entsprechendes Feld auf
NIL gesetzt.
NIL wird als Verweis auf spezielle, externe Knoten
betrachtet.
Diese Knoten speichern keine Schlüssel.
Restliche Knoten sind interne Knoten.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
3
Rot-Schwarz-Bäume – Definition (2)
Definition 14.1: Ein binärer Suchbaum heisst RotSchwarz-Baum, wenn folgende Bedingungen
erfüllt sind:
1. Jeder Knoten ist entweder rot oder schwarz.
2. Die Wurzel ist schwarz.
3. Jedes Blatt (NIL-Knoten) ist schwarz.
4. Ist ein Knoten rot, so sind seine Kinder schwarz.
5. Für jeden Knoten x enthält jeder abwärts gerichteter
Pfad zu einem Blatt die gleiche Anzahl von
schwarzen Knoten.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
4
Illustration von Rot-Schwarz-Bäumen
NIL
7
2
11
1
NIL
5
NIL
NIL
14
NIL
NIL
4
NIL
SS 2006
8
NIL
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
NIL
15
NIL
NIL
5
Vereinfachung durch nil[T]
Vereinfachung durch Ersetzen der NIL-Knoten durch ein
zusätzliches Objekt nil[T]. Verweise zu NIL-Knoten ersetzt
durch Verweise auf nil[T].
7
2
11
1
5
8
4
14
15
nil[T]
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
6
Vereinfachte Darstellung
Verzichten bei Darstellung von Rot-Schwarz-Bäumen auf
nil[T] und auf Kanten zu nil[T]:
7
2
11
1
5
8
4
SS 2006
14
15
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
7
Höhe von Rot-Schwarz-Bäumen (2)
Satz 14.2: Ein Rot-Schwarz-Baum mit n inneren Knoten hat
höchstens Höhe 2 log(n+1).
Korollar 14.3: Bei einem Rot-Schwarz-Baum mit n Knoten
erfordern die Algorithmen
Tree-Search
Tree-Minimum, Tree-Maximum
Tree-Successor, Tree-Predecessor
Tree-Insert, Tree-Delete
Zeit O(log(n)).
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
8
Erhaltung der Rot-Schwarz-Eigenschaft
Nach Anwendung von Tree-Insert, Tree-Delete bei
Rot-Schwarz-Baum ist Rot-Schwarz-Eigenschaft nicht
notwendigerweise mehr erfüllt.
Tree-Insert, Tree-Delete garantieren damit nicht,
dass alle Wörterbuchoperationen effizient unterstützt
werden.
Dazu müssen Tree-Delete, Tree-Insert so erweitert
werden, dass sie Rot-Schwarz-Eigenschaft erhalten.
Erhaltung durch Umfärben von Knoten und Änderung
von Verweisen. Letzteres durch Rotationen.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
9
Illustration Rotationen
Links-Rotation(T,x)
y
x
α
γ
x
y
β
SS 2006
Rechts-Rotation(T,y)
γ
α
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
β
10
Algorithmus Left-Rotate
Left - Rotate(T, x )
LinksRotation(T,x)
1 y ← right [x ]
2 right [x ] ← left [y ]
x
3 if left [y ] ≠ nil [T ]
4 then p[left [y ]] ← x
5 p[y ] ← p[x ]
6 if p[x ] = nil [T ]
7
8
9
10
y
y
x
α
γ
β
γ
α
β
then root [T ] ← y
else if x = left [p[ x ]]
then left [p[x ]] ← y
else right [p[x ]] ← y
11 left [y ] ← x
12 p[x ] ← y
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
11
Illustration Left-Rotate
7
x
2
y
11
1
5
8
4
14
15
Left-Rotate(T,x)
y
11
x
2
7
14
8
15
5
1
4
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
12
Eigenschaften der Rotationen
Lemma 14.4: Left-Rotate und Right-Rotate benötigen
Zeit O(1).
Lemma 14.5: Left-Rotate und Right-Rotate erhalten die
Suchbaum-Eigenschaft. D.h. ist T ein Suchbaum
und x ein Knoten in T, dann ist auch der Baum
der nach Anwendung von Left-Rotate(T,x) entsteht ein Suchbaum, und analog für Right-Rotate.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
13
Einfügen eines Elements
Tree - Insert (T , z )
1 y ← nil [T ]
2 x ← root [T ]
3 while x ≠ nil [T ]
4
do y ← x
5
if key [z ] < key [x ]
6
then x ← left [x ]
7
else x ← right [x ]
8 p[z ] ← y
9 if y = nil [T ]
10
then root [T ] ← z
11
else if key [z ] < key [y ]
12
then left [y ] ← z
13
else right [y ] ← z
14 left [z ] ← nil [T ]
Änderungen zu Tree-Insert:
1. NIL ersetzt durch nil[T].
2. Setzen von left[z],right[z]
auf nil[T]. (Zeilen 14,15)
3. Färbung von z. (Zeile 16)
4. Aufruf von RB-Insert-Fixup.
(Zeile 17)
15 right [z ] ← nil [T ]
16 color [z ] ← RED
17 RB - Insert - Fixup(T,z )
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
14
Einfügen eines Elements - Illustration
11
2
14
1
7
15
5
8
Nach Einfügen von Knoten mit Schlüssel 4:
11
2
14
1
7
5
15
8
4
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
15
Verletzungen der Rot-Schwarz-Eigenschaft
nach Zeilen 1-16 von RB-Insert
Rot-Schwarz-Eigenschaft:
Rot-Schwarz-Eigenschaft nach RB-Insert:
1. Jeder Knoten ist entweder rot
oder schwarz.
1. Erfüllt.
2. Die Wurzel ist schwarz.
2. Nicht erfüllt, wenn z Wurzel.
3. Jedes Blatt (nil[T]) ist schwarz.
3. Erfüllt.
4. Ist ein Knoten rot, so sind seine
Kinder schwarz.
4. Nicht erfüllt, wenn Eltern von z bereits
rot ist.
5. Für jeden Knoten x enthält jeder
Pfad zu einem Blatt die gleiche
Anzahl von schwarzen Knoten.
5. Erfüllt.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
16
Algorithmus RB-Insert-Fixup
RB - Insert - Fixup(T,z )
1 while color [p[z ]] = RED
2
do if p[z ] = left [p[p[z ]]]
3
then y ← right [p[p[z ]]]
4
if color [y ] = RED
5
then color [p[z ]] ← BLACK
6
color [y ] ← BLACK
7
8
9
10
11
12
13
color [p[p[z ]]] ← RED
z ← p[p[z ]]
else if z = right [p[z ]]
then z ← p[z ]
Left - Rotate (T,z )
color [p[z ]] ← BLACK
color [p[p[z ]]] ← RED
14
Right - Rotate (T,p[p[z ]])
15
else (wie then, nur mit left/right vertauscht )
16 color [root [T ]] ← BLACK
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
17
Invariante für RB-Insert-Fixup
Ziel: Nach Durchlauf von RB-Insert-Fixup soll T wieder ein
Rot-Schwarz-Baum sein.
Invariante für while-Schleife:
a. Knoten z ist rot.
b. Ist p[z] die Wurzel, dann ist p[z] schwarz.
c. Gibt es eine Verletzung der Rot-Eigenschaft,
so ist Eigenschaft 2. und Eigenschaft 4.
verletzt. Ist Eigenschaft 2. verletzt, dann nur
weil z Wurzel und rot ist. Ist Eigenschaft 4.
verletzt, dann nur weil z und p[z] rot sind.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
18
Initialisierung der Invariante
Starten mit Rot-Schwarz-Baum, in den Knoten z eingefügt
wurde.
a. Eingefügter Knoten z ist rot.
b. Ist p[z] Wurzel, so war p[z] schwarz. RB-Insert
ändert Farbe von p[z] nicht.
c. Haben gesehen, dass 1., 3., 5., auch nach
Tree-Insert gelten.
Verletzung von 2. und 4. kann nur durch
Knoten z herbeigeführt werden.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
19
Verletzungen der Rot-Schwarz-Eigenschaft
nach Zeilen 1-16 von RB-Insert
Rot-Schwarz-Eigenschaft:
Rot-Schwarz-Eigenschaft nach RB-Insert:
1. Jeder Knoten ist entweder rot
oder schwarz.
1. Erfüllt.
2. Die Wurzel ist schwarz.
2. Nicht erfüllt, wenn z Wurzel.
3. Jedes Blatt (nil[T]) ist schwarz.
3. Erfüllt.
4. Ist ein Knoten rot, so sind seine
Kinder schwarz.
4. Nicht erfüllt, wenn Eltern von z bereits
rot ist.
5. Für jeden Knoten x enthält jeder
Pfad zu einem Blatt die gleiche
Anzahl von schwarzen Knoten.
5. Erfüllt.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
20
Terminierung der Invariante
Nach Invariante kann Rot-Schwarz-Eigenschaft nur bei
2. und 4. verletzt sein.
Bei Terminierung ist p[z] schwarz. Da Verletzung von 4.
nur bei p[z] und z auftreten kann, ist 4. erfüllt.
Nur noch 2. kann verletzt sein. Zeile 16 stellt sicher, dass
2. erfüllt ist. Zeile 16 kann nicht zur Verletzung anderer
Eigenschaften führen.
Alle 5 Eigenschaften erfüllt, damit T nach Durchlauf von
RB-Insert-Fixup wieder Rot-Schwarz-Baum.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
21
Erhaltung der Invariante (1)
Müssen bei Erhaltung 6 Fälle betrachten:
1) p[z] ist linkes Kind von p[p[z]]
und Onkel y von z ist rot.
4) p[z] ist rechtes Kind von p[p[z]]
und Onkel y von z ist rot.
2) p[z] ist linkes Kind von p[p[z]]
Onkel y von z ist schwarz und
z ist rechtes Kind.
5) p[z] ist rechtes Kind von p[p[z]]
Onkel y von z ist schwarz und z
ist rechtes Kind.
3) p[z] ist linkes Kind von p[p[z]]
Onkel y von z ist schwarz und
z ist linkes Kind.
6) p[z] ist rechtes Kind von p[p[z]]
Onkel y von z ist schwarz und z
ist linkes Kind.
Fälle 1),2),3) symmetrisch zu Fällen 4),5),6). Deshalb nur
1),2),3). Wie auch schon in RB-Insert-Fixup.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
22
Illustration Fall 1) und 2)
Fall 1)
11
2
14
1
7
15
5
z
8
y
4
Fall 2)
11
y
2
14
1
7
5
z
15
8
4
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
23
Illustration Fall 3)
Fall 3)
11
y
14
7
z
2
8
1
15
5
4
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
24
Algorithmus RB-Insert-Fixup
RB - Insert - Fixup(T,z )
1 while color [p[z ]] = RED
do if p[z ] = left [p[p[z ]]]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
then y ← right [p[p[z ]]]
if color [y ] = RED
then color [p[z ]] ← BLACK
• Fall 1) Zeilen 5 – 8
• Fall 2) Zeilen10-11
• Fall 3) Zeilen 12-14
color [y ] ← BLACK
color [p[p[z ]]] ← RED
z ← p[p[z ]]
else if z = right [p[z ]]
then z ← p[z ]
Left - Rotate(T,z )
color [p[z ]] ← BLACK
color [p[p[z ]]] ← RED
Right - Rotate(T,p[p[z ]])
else (wie then, nur mit left/right vertauscht )
16 color [root [T ]] ← BLACK
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
25
RB-Insert-Fixup in Fall 1)
then color [p[z ]] ← BLACK
color [y ] ← BLACK
color [p[p[z ]]] ← RED
z ← p[p[z ]]
5
6
7
8
neues z
C
C
D y
A
α
B
β
z
δ
γ
ε
A
D
α
B
β
δ
ε
γ
Wurzeln der Teilbäume α,β,γ,δ,ε jeweils schwarz.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
26
RB-Insert-Fixup in Fall 2)
z ← p[z ]
Left - Rotate(T,z )
10
11
C
C
δ y
A
α
B
β
z
z
γ
δ
B
α
A
y
γ
β
Wurzeln der Teilbäume α,β,γ,δ,ε jeweils schwarz.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
27
RB-Insert-Fixup in Fall 3)
color [p[z ]] ← BLACK
color [p[p[z ]]] ← RED
Right - Rotate (T,p[p[z ]])
12
13
14
C
δ
B
z
A
α
B
y
γ
z
α
A
C
β
γ
δ
β
Wurzeln der Teilbäume α,β,γ,δ,ε jeweils schwarz.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
28
Illustration von RB-Insert-Fixup
Fall 1)
11
2
14
1
2
7
15
5
z
11
8
14
1
7
5
y
4
z
y
15
8
4
Fall 2)
Fall 3)
7
z
2
11
11
7
z
1
5
4
SS 2006
8
14
2
1
15
14
y
8
15
5
4
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
29
Laufzeitanalyse
RB-Insert hat wie Tree-Insert Laufzeit proportional zur
Höhe des Baumes. Bei einem Rot-Schwarz-Baum mit
n Knoten also Laufzeit O(log(n)).
Fälle 2) und 3) von RB-Insert-Fixup werden jeweils
höchstens einmal ausgeführt. Nach 2) kommt immer
3) und in 3) wird die Verletzung von 4. beseitigt ohne
neue Verletzungen einzuführen.
In Fall 1) wird die Verletzung von Knoten z auf Knoten
p[p[z]] übertragen. Damit kann Fall 1) höchstens
O(log(n)) auftreten.
Laufzeit von RB-Insert-Fixup somit O(log(n)).
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
30
Tree-Delete und Zusammenfassung
Tree-Delete führt wie Tree-Insert zu Problemen: Nach
Anwendung auf Rot-Schwarz-Baum sind Rot-SchwarzEigenschaften nicht mehr erfüllt.
Erweiterung von Tree-Delete mit Hilfe von RB-DeleteFixup.
Zusammen Laufzeit O(log(n)) und erhalten Rot-SchwarzEigenschaften bei Entfernen von Knoten.
Insgesamt können also durch Rot-Schwarz-Bäume alle
Wörterbuchoperationen effizient nämlich in Zeit O(log(n))
unterstützt werden.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
31
Alternativen zu Rot-Schwarz-Bäumen
Neben Rot-Schwarz-Bäumen gibt es noch andere
Varianten von Suchbäumen, die Wörterbücher effizient
implementieren. Hierzu gehören u.a.
1. AVL-Bäume
2. 2-3-4-Bäume
3. Zufällige Suchbäume (randomized search trees
(RST))
4. B-Bäume (besonders gut für Sekundärspeicher
geeignet)
Als Alternative zu Hashing und Suchbäumen gibt es
noch Skip-Listen. Diese sind Erweiterungen von
verketteten Listen.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
32
Zusammenfassung Datenstrukturen
Dynamische Menge/abstrakten Datentypen sind Mengen
mit Operationen, die effizient ausgeführt werden sollen,
z.B. Wörterbücher, Warteschlangen,…. Dabei kann die
Menge durch Einfügen/Entfernen von Objekte geändert
werden.
Nützlich, wenn bestimmte Operationen immer wieder
durchgeführt werden müssen, z.B. Maximumbestimmung
bei Heap-Sort.
Datenstrukturen als Implementierungen von dynamischen
Mengen.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
33
Geometrische Datenstrukturen
Kennen gelernt:
1. Stacks, Queues, Listen
2. Hashing
3. Binäre Suchbäume, speziell Rot-SchwarzBäume
Datenstrukturen werden häufig auch in geometrischen
Anwendungen (Computer Graphik, Geographische
Informationssysteme (GIS)) benutzt.
Dynamische Menge S definiert durch Punkte in der
Ebene und so genannte Bereichsabfragen.
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
34
Geometrische Datenstrukturen
Bereichsabfragen: Gegeben ein geometrisches
Objekt eines bestimmten Typs, sollen alle Elemente
aus S berechnet werden, die im Objekt enthalten
sind.
Typen von Objekten können z.B. sein
Halbebenen
Kreise
Rechtecke
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
35
Geometrische Datenstrukturen - Beispiel
Kreisabfrage:
SS 2006
Datenstrukturen und Algorithmen
14. Rot-Schwarz-Bäume
36
Herunterladen