Informatik I Rot-Schwarz-Bäume Rot-Schwarz-Bäume Rot

Werbung
Rot-Schwarz-Bäume
Informatik I
Folgerung:
Einführung
• Die Operation suche, minimum, maximum, symmetrischer Nachfolger
und symmetrischer Vorgänger benötigen O(log n) Zeit auf
Rot-Schwarz-Bäumen
Rainer Schrader
• das gleiche gilt auch für füge_ein und lösche
Zentrum für Angewandte Informatik Köln
• allerdings können die bisherigen Realisierungen nicht garantieren, dass
auch nachher noch ein Rot-Schwarz-Baum vorliegt.
20. Juni 2005
• Wir werden zeigen, dass wir auch dies in O(log n) Zeit erreichen
können.
2 / 30
1 / 30
Rot-Schwarz-Bäume
Rot-Schwarz-Bäume
• Rotationen sind Hilfsoperationen, die helfen, nach Einfügen oder
Leftrotate(T , x )
Entfernen eines Knotens in einem Rot-Schwarz-Baum die
Eigenschaften 1–4 wieder herzustellen.
(1) setze y = rightson(x )
• Rotationen ändern lokal die Zeigerstruktur unter Erhaltung der
(2) setze rightson(x ) = leftson(y )
Suchbaum-Eigenschaft
(3) setze Vater (leftson(y )) = x
Links−Rotation
leftrotate(T,x)
(4) setze Vater (y ) = Vater (x )
Rechts−Rotation
rightrotate(T,y)
(5) ist x Wurzel von T , so mache y zur Wurzel von T
(6) andernfalls:
y
(7) ist x linker Sohn seines Vaters, so mache y zum linken Sohn des Vaters von x
x
rightrotate(T,y)
(8) ist x rechter Sohn seines Vaters, so mache y zum rechten Sohn des Vaters von x
x
(9) setze leftson(y ) = x
y
(10) setze Vater (x ) = y
α
γ
leftrotate(T,x)
α
β
β
Rightrotate ist symmetrisch zu Leftrotate.
γ
Laufzeit: O(1)
Bei Rechtsrotationen muss gelten x 6= NULL, entsprechend bei Linksrotationen.
3 / 30
4 / 30
Rot-Schwarz-Bäume
Rot-Schwarz-Bäume
Illustration:
füge_ein(T , u)
7
(1) füge u wie in Suchbäumen als neuen Knoten mit zwei neuen Blättern ein
x
4
(2) färbe die neuen Blätter schwarz und u rot.
11
y
3
6
9
(3) da wir einen schwarzen Knoten durch einen roten Knoten mit zwei schwarzen
Söhnen ersetzen, kann lediglich Bedingung (iii) verletzt sein.
18
2
14
(4) ist u Wurzel oder w = Vater(u) schwarz, stop. (T ist zulässig gefärbt.)
19
12
17
(5) andernfalls: ist w Wurzel, so färbe w schwarz, stop. (T ist zulässig gefärbt.)
22
(6) sei x = Vater(w ). Dann ist x schwarz, da w rot.
20
(7) sei w rechter Sohn von x (der andere Fall folgt symmetrisch)
(8) hat x nur rote Söhne, vertausche Farben, setze u := x und gehe zu (4) (Tx ist
repariert, gehe höher im Baum)
7
y
4
18
r+1
x
3
6
11
9
14
r+1
r
r
2
r+1
19
r+1
22
12
17
r
20
r
r
r
Untersuchung der Ränge
5 / 30
6 / 30
Rot-Schwarz-Bäume
Rot-Schwarz-Bäume
(8) andernfalls: da w rot ist, muß der Bruder b von u wegen (iii) schwarz sein. Wir
unterscheiden zwei Fälle
(8a)
u = Rightson(w ) : führe eine L-Rotation durch und färbe um
r+1
r+1
r
r
Laufzeit
r
r
• füge_ein: O(log n)
r
r
r
r
r
• Anzahl der Durchläufe von (4)-(7): O(log n). (immer nach oben)
r
r
(8b)
r
• also insgesamt O(log n) (bei maximal zwei Rotationen).
u = Leftson(w ) : führe zwei Rotationen durch und färbe um
r+1
r+1
r+1
r
r
r
r
r
r
r
r
r
r
r
r
r
r
r
r
r
r
7 / 30
8 / 30
Entfernung des Knotens z
Rot-Schwarz-Bäume
Illustration zum Entfernen:
Entferne(T , x )
15
v
5
16
3
u
sei y der Knoten, der aus T entfernt wird
•
•
•
sei also y schwarz
•
•
ist x rot, so färben wir x schwarz und erhalten einen Rot-Schwarz-Baum
ist y rot, so bleibt T ein Rot-Schwarz-Baum:
• der Rang (Schwarzhöhe) aller Knoten bleibt unverändert,
• keine zwei roten Knoten sind benachbart.
20
12
10
•
•
13
18
23
6
7
wenn y ein einziges Kind hat, sei x diese Kind, andernfalls sei x ein Blatt
es können zwei Fehler auftreten:
• x und Vater (y )(= Vater (x )) sind rot
• die Pfade, die y enthielten, haben einen schwarzen Knoten weniger
ist x schwarz, so ist Vater (x ) unbalanciert
9 / 30
10 / 30
Rot-Schwarz-Bäume
Rot-Schwarz-Bäume
Entferne(T , x )
•
zum Ausgleich machen wir x „doppelt schwarz“.
Entferne(T , x )
• dann stimmt die Farbbalance entlang von Pfaden
•
•
•
•
• aber x ist falsch gefärbt
•
wir schieben die doppelte Farbe schrittweise nach oben bis wir
a)
einen roten Knoten erreichen:
b)
oder die Wurzel erreichen:
c)
oder geeignete Rotation und Umfärbungen machen können.
sei x ein „doppelt schwarzer“ Knoten, der nicht schon die Wurzel ist
wir betrachten den Fall „x ist linkes Kind“ (rechtes Kind symmetrisch).
sei w der Bruder von x
w ist nicht Blatt, da sonst Vater(x ) vor dem Löschen die Balance verletzt hätte
; färbe ihn schwarz
; entferne zusätzliches schwarz
11 / 30
12 / 30
Rot-Schwarz-Bäume
•
•
•
•
•
•
Rot-Schwarz-Bäume
•
•
•
Fall 1: w ist rot
dann sind die Söhne von w schwarz
vertausche die Farben von w und Vater(x )
Fall 2: w ist schwarz, beide Söhne von w sind schwarz
färbe x einfach schwarz und w rot
schiebe schwarz zum Vater von x :
• ist Vater (x ) rot, so färbe ihn schwarz, STOP
• (wenn vorher Fall 1 eingetreten ist, ist Vater (x ) rot)
• andernfalls haben wir die doppelte Färbung nach oben verschoben
führe eine Linksrotation im Vater(x ) durch
danach ist der Bruder von x schwarz
; Fall 2,3 oder 4
• setze x = Vater (x ) und iteriere
r+1
r+1
B
D
Fall 1
x
w
r
r
A
r
D
C
r
E
r
B
E
w
A
C
w
A
r
r−1
r
r
D
A
D
E
r−1
C
r−1
r−2
r−1
r−1
D
r−1
r−2
r−1
B
Fall 2
x
D
x
r−2
x
B
r
r−1
C
r−2
r−1
r−2
r−2
r−1
E
r−2
r−2
13 / 30
14 / 30
Rot-Schwarz-Bäume
•
•
•
•
•
Rot-Schwarz-Bäume
•
•
•
•
•
Fall 3: w ist schwarz, der linke Sohn ist rot, der rechte ist schwarz
vertausche die Farben von w und seinem linken Sohn
führe eine Rechtsrotation an w aus
danach ist der neue Bruder w von x schwarz mit einem roten rechten Sohn
; Fall 4
Fall 4: w ist schwarz, der rechte Sohn ist rot
färbe w wie Vater (x ), Vater (x ) und den rechten Sohn von w schwarz,
führe eine Linksrotation im Vater (x ) aus
entferne die doppelte Färbung von x
danach ist T ein Rot-Schwarz-Baum
x
B
B
Fall 3
B
r
w
x
A
r−2
r
r
D
A
C
r
D
C
r−1
r−1
E
r−1
r−2
r
w
A
r−1
r
r
r−1
r−2
C
E
r−2
r−1
E
r−1
r−1
r−2
r
B
D
D
r−1
D
Fall 4
x
r−1
x
E
D
A
r−1
w
C
r−1
r−1
r−2
Laufzeit: O(log n).
15 / 30
16 / 30
Zusammenfassung
weitere Balancekonzepte
Rot-Schwarz-Bäume bilden eine Datenstruktur, die die folgenden
Operationen auf dynamischen Mengen unterstützt:
•
•
•
•
•
•
•
• Wir haben gesehen, dass rang-balancierte Bäume ebenfalls
suche
Rot-Schwarz-Bäume darstellen.
bestimme das Minimum
• Das gilt auch für ein weiteres Konzept von balancierten Bäumen.
bestimme das Maximum
bestimme den Vorgänger einer symmetrischen Durchmusterung
AVL-Bäume (nach Adelson-Velskii und Landis)
bestimme den Nachfolger einer symmetrischen Durchmusterung
Ein binärer Baum heißt AVL-Baum, wenn sich in jedem Knoten die Höhen
des rechten und des linken Teilbaums um höchstens 1 unterscheiden.
füge ein
lösche
17 / 30
18 / 30
weitere Balancekonzepte
Eine Anwendung: Das
Sichtbarkeitsproblem
Lemma
AVL-Bäume sind Rot-Schwarz-Bäume.
Beweisskizze:
9
• färbe alle Knoten mit gerader Höhe (einschließlich der Blätter) schwarz
• ein Knoten mit ungerader Höhe wird genau dann rot gefärbt, wenn die
Chip (n Zellen)
8
A
7
6
Höhe seines Vater um genau 1 größer ist
B
D
A
A
2
2
3
B
0
1
J
G
D
J
E
1
H
F
F
2
G
E
E
1
B
F
1
einhalten!
3
4
D
C
Mindestbestände
5
4
1
kompaktieren
1
H
0
19 / 30
1
2
3
4
5
6
7
8
9
10 11 12
20 / 30
Das Sichtbarkeitsproblem
Das Sichtbarkeitsproblem
9
9
8
A
7
6
B
5
8
kompaktieren
7
Mindestbestände
5
einhalten!
4
3
E
C
Mindestbestände
D
einhalten!
2
F
1
E
F
1
0
0
0
•
kompaktieren
B
3
2
•
•
Chip (n Zellen)
A
6
C
D
4
Chip (n Zellen)
1
2
3
4
5
6
7
8
9
10 11 12
0
Die relevanten Paare sind die, die sich „sehen“ können
(A, D) (A, E ) (B, E ) (C, F ) (D, E )
1
2
3
4
5
6
7
•
Naives Verfahren:
•
Überprüfung aller
•
;
`n ´
S, S 0
formal: zwei Paare
sind gegenseitig sichtbar, wenn es eine vertikale Linie
gibt, die S und S 0 , aber kein Element zwischen S und S 0 schneidet
2
8
9
10 11 12
Paare auf vertikale (horizontale) Sichtbarkeit
Ω(n 2 ) Laufzeit
21 / 30
22 / 30
Das Sichtbarkeitsproblem
Das Sichtbarkeitsproblem
Beobachtung: Beim vertikalen (horizontalen) Sichtbarkeitsproblem spielen die Höhen
(Breiten) der Zellen keine Rolle.
Weitere Beobachtung: Man kann alle Sichtbarkeiten durch vertikale Linien visualisieren, die sich gegenseitig nicht schneiden.
Bei vertikaler Sichtbarkeit Reduktion auf südliche Grenzen:
9
8
A
7
6
B
5
D
C
4
9
8
A
7
6
B
5
D
C
4
2
E
F
0
0
1
2
3
4
5
6
7
8
9
3
2
E
10 11 12
F
1
0
Vertikale Koordinaten:
y (A) = 7
y (B) = 5
..
.
3
1
Horizontale Segmente,
linke und rechte Koordinaten:
(xl (A), xr (A)) = (1, 4)
(xl (B), xr (B)) = (6, 8)
.
..
0
1
2
3
4
5
6
7
8
9 10 11 12
Der korrespondierende Graph mit n Knoten ist planar, d.h. er kann ohne Kantenüberkreuzungen gezeichnet werden.
23 / 30
24 / 30
Das Sichtbarkeitsproblem
Das Sichtbarkeitsproblem
Idee eines Scanline-Ansatzes
Satz (ohne Beweis)
Ein planarer Graph mit n ≥ 3 Knoten hat höchstens 3n − 6 Kanten.
⇒ Es kann nur O(n) viele Sichtbarkeitspaare geben.
Sei L eine Datenstruktur, die die Operationen unterstützt:
•
•
•
•
füge_ein
lösche
Vorgänger
•
•
•
•
wir fahren den Bereich von links nach rechts mit einer vertikalen Scan-Linie ab
•
während des Scannens verwalten wir dynamisch die Menge aller Segmente, die
von der Scan-Linie geschnitten werden:
•
wird der Anfangspunkt eines Intervalls erreicht, so fügen wir das Intervall in die
Menge ein
•
wird der Endpunkt eines Intervalls erreicht, so entfernen wir das Intervall aus der
Menge
•
die Sichtbarkeitsrelation wird durch benachbarte Schlüsselwerte bestimmt
Nachfolger
dabei halten wir nur an Anfangs- oder Endpunkten von Segmenten
dazu verwenden wir eine sortierte Liste aller x -Koordinaten dieser Punkte
die y -Koordinaten der Segmente fassen wir als Schlüssel auf
25 / 30
26 / 30
Das Sichtbarkeitsproblem
Skizze eines scan-line-Ansatzes
(1) while Q 6= ∅ do
Datenstrukturen
•
•
•
•
•
(2)
entferne das nächste Element (x , S, e) aus Q
(3)
if (e = l ) do
(4)
füge (y (S), S) in T ein
zu jedem Segment S existieren Angaben (xl , S, l ), (xr , S, r ) und (y , S)
(5)
sei (y 0 , S 0 ) Vorgänger in T
sortiere die 2n Werte (xl , S, l ), (xr , S, r ) aufsteigend nach x -Koordinaten ;
O(n log n)
(6)
falls S 0 existiert, gib (S, S 0 ) aus
(7)
sei (y 00 , S 00 ) Nachfolger in T
sei Q eine Schlange, die diese Werte aufsteigend enthält
(8)
falls S 00 existiert, gib (S, S 00 ) aus
sei T ein Rot-Schwarz-Baum, der die aktuellen Segmente aufnimmt
(9)
die Nachbarsegmente werden durch die Operationen „Nachfolger“ bzw.
„Vorgänger“ in der symmetrischen Durchmusterung bestimmt
else do
// e = r
(y 0 , S 0 )
(10)
sei
(11)
sei (y 00 , S 00 ) Nachfolger in T
(12)
falls S 0 , S 00 existieren, gib (S 0 , S 00 ) aus
(13)
lösche (y (S), S) aus T
(14)
Vorgänger in T
end if
(15) end while
27 / 30
28 / 30
Scanline-Ansatz
Das Sichtbarkeitsproblem
im Beispiel:
Anfang von Q
(1, A, l )
(1, E , l )
(2, D, l )
(3, D, r )
(4, A, r )
(6, B, l )
(7, E , r )
(8, B, r )
(9, C, l )
(9, F , l )
(10, F , r )
(11, C, r )
∅
Inhalt von L
(7, A)
(1, E ), (7, A)
(1, E ), (4, D), (7, A)
(1, E ), (7, A)
(1, E )
(1, E ), (5, B)
(5, B)
∅
(4, C)
(1, F ), (4, C)
(4, C)
∅
Ausgabe
• inklusive Dupklikate werden O(n) Paare ausgegeben
• implementiert man Q einfach als Array und sortiert etwa mit Heapsort,
(E , A)
(D, E ), (D, A)
(E , A)
so benötigt das Verfahren O(n log n) Zeit für die Erstellung von Q und
O(1) Zeit für jedes Entfernen aus Q
(B, E )
• im Rot-Schwarz-Baum T benötigen wir O(log n) Zeit für jede Operation
• daraus ergibt eine Gesamtlaufzeit von O(n log n)
(C, F )
• offensichtlich benötigt das Verfahren O(n) Speicherplatz.
29 / 30
30 / 30
Herunterladen