Rot-Schwarz-Baum

Werbung
5.7 RotRot-SchwarzSchwarz-Bäume
(2,4)-Bäume
sind ausgeglichen: gleiche Höhe für alle Blätter
Standardoperationen auf Mengen in O(h), d.h. O(log n)
unterschiedliche Knoten (1, 2 oder 3 Schlüssel)
Frage:
lassen
sich die beiden ersten Eigenschaften von (2,4)Bäume auch mit binären Knoten erreichen?
Warum
eigentlich??
(2,4)-Bäume sind Hauptspeicherdatenstruktur,
nur B-Bäume mit t >> 2 für Externspeicher.
Implementierungsvarianten (Hauptspeicher):
gleiche Knoten mit unterschiedlich vielen Werten
=> speicherineffizient
verschiedene Knoten: zusätzliche
Abfragen (welcher Knotentyp?)
hs / fub – alp3-21-RBbaum-1 1
(2,4)(2,4)-Bäume als Binärbäume implementieren?
implementieren?
Antwort:
sicher "nicht ganz": müssten sonst immer 2h+1-1
Knoten enthalten (ausgeglichen!) .
aber "im Wesentlichen":
R. Bayer: Symmetric Binary B-Trees: Data Structure
and Maintenance Algorithms. Acta Informatica, Vol
1, 290-306,
1972 ,
heute Rot-Schwarz-Bäume genannt.
Idee:
Abbilden von (2,4) – Knoten auf binäre.
hs / fub – alp3-21-RBbaum-1 2
1
2, 3 und 44-Knoten als binäre Teilbäume
7
7
5
3 5
3
3
5
6
hs / fub – alp3-21-RBbaum-1 3
5
358
3
8
6
Per Konstruktion: Jeder (2,4)-Baum lässt sich in einen
binären Suchbaum umwandeln.
2
Beispiel
5 12
15
10
3 4
5
2
4
6 79
13 14
11
12
3
17
Fragen:
2
- Höhe von RB-Baum
im Vergleich zu (2,4)?
- Operationen
- Was ist überhaupt
ein RB-Baum??
4
10
11
7
3
6
9
6
15
13
17
14
6
hs / fub – alp3-21-RBbaum-1 5
Eigenschaften
3
2
1
5
3
2
2
4
1
1
12
3
1
3
6
1. Wurzel ist schwarz.
10
1
7
1
0. Knoten sind rot
oder schwarz.
9
6
11
2
1
15
13
1
1
14
6
2. Externe Knoten
sind schwarz
17
3. Die Kinder von
roten Knoten sind
schwarz (Rotbedingung
4. Jeder Pfad von einem Knoten x zu einem externen
Knoten besitzt die gleiche Anzahl schwarzer Knoten.
4a) Diese Anzahl (x nicht gezählt) heißt
schwarze Höhe bh(x) eines Knotens.
hs / fub – alp3-21-RBbaum-1 6
3
RotRot-SchwarzSchwarz-Bäume
Ein
binärer Suchbaum, der die Eigenschaften
0 bis 4 erfüllt, heißt Rot-Schwarz-Baum
(Red-Black-, RB-Tree)
Jeder
(2,4)-Baum kann in einen Rot-Schwarz-Baum
umgewandelt werden.
Gilt nach Konstruktion: beibehalten von 1-Knoten,
ersetzen von 2- und 3-Knoten so, dass schwarzer
Knoten mit einem oder zwei roten Kindern entsteht.
hs / fub – alp3-21-RBbaum-1 7
RotRot-SchwarzSchwarz-Bäume
Umgekehrt:
zu jedem Rot-Schwarz-Baum gibt es
einen (2,4)-Baum.
Konstruktiv: Vereinige jeden roten Knoten x mit seinem
Elternknoten e (der ist schwarz!) zu einem 2-Knoten, wenn x
schwarzen Nachbarn hat, sonst zu einem gemeinsamen 3Knoten, der x, e und den roten Nachbarn y von x enthält.
Dabei folgt aus der Eindeutigkeit der Reihenfolge (x, e) bzw.
(e, x ) und (x, e, y) bzw. (y,e,x) gemäß Sortierfolge die
Eindeutigkeit des (2,4)-Baumes.
Für
die externe Höhe von Rot-Schwarzbäumen mit n
internen Knoten gilt h <= 2* log (n+1).
hs / fub – alp3-21-RBbaum-1 8
4
Operationen auf RotRot-SchwarzSchwarz-Bäumen
search()
: wie in binären Suchbäumen
insert(Key
k)
search(k)
findet externen Knoten e als Einfügepunkt
(oder DUPL_KEY)
ersetze e durch roten Knoten k mit schwarzen Kindern
e' und e'' (externe Knoten)
erhalte RB-Invarianten
7
5
9
6
entspricht
in (2,4)-Baum:
5 7 9
hs / fub – alp3-21-RBbaum-1 9
Einfügen in RotRot-SchwarzSchwarz-Baum: die kritischen Fälle
Kritische
Fälle im (2,4)-Baum:
4-Knoten k, k enthält schon 3 Schlüssel
3 6 8
8
6
3
2
9
5 7
Einfügen an diesen
Stellen ist kritisch
6
entspricht
2
5
7
9
führt zur Verletzung der Rot-Bedingung
hs / fub – alp3-21-RBbaum-1 10
5
Umfärbung der Knoten: Spalten im (2,4)(2,4)-Baum
... 6 ...
3 5
3 6 8
6
5
6
5
8
3
8
3
8
Beachte:
keine Änderung
der schwarzen
Tiefe!
5
hs / fub – alp3-21-RBbaum-1 11
Funktionale Implementierung
data RBTree a = Empty
| Node Color (RBTree a) a (RBTree a)
data Color = R | B
deriving (Show)
insert ::
Ord a => RBTree a -> a -> RBTree a
Situation entspricht dem folgenden Muster:
recolour B (Node R (Node B lll vll llr)
vl (Node R lrl vlr lrr))
v
(Node R rl vr rr)
= Node R (Node B (Node B lll vll llr)
vl (Node R lrl vlr lrr))
v (Node B rl vr rr)
6
Funktionale Implementierung
Weitere
Fälle analog zu (2,4)-Knotenspaltung.
recolour B (Node R (Node R lll vll llr)
vl lr )
v (Node R rl vr rr)
= Node R (Node B (Node R lll vll llr)
vl lr)
v (Node B rl vr rr)
6 v
vl
vll
3
lr
1
rl
6
8 vr
rr
llr
lll
3
8
1
hs / fub – alp3-21-RBbaum-1 13
Funktionale Implementierung
Die
restlichen Fälle:
recolour
B (Node R ll vl
v (Node R (Node
vr rr)
= Node R (Node B ll vl
v (Node B (Node
vr rr)
recolour
= Node
lr)
R rll vrl rlr)
lr)
R rll vrl rlr)
B (Node R ll vl lr)
v (Node R rl
vr (Node R rrl vrr rrr))
R (Node B ll vl lr)
v (Node B rl
vr (Node R rrl vrr rrr))
In allen 4 Fällen: rote Nachbarn (d.h. 4-Knoten in (2,4)-B).
hs / fub – alp3-21-RBbaum-1 14
7
Transformieren in RotRot-SchwarzSchwarz-Baum
Knoten
mit 2 Werten in (2,4)-Baum führen ebenfalls
zur Verletzung der Rot-Eigenschaft!
3 6
1
6 v
vl
vll
... 8 ...
insert()
8 vr
3
lr
1
rr
rl
llr
lll
Kein Problem im (2,4)-Baum, aber....
hs / fub – alp3-21-RBbaum-1 15
Transformieren
1
3 6
1
vl
lll
... 8 ...
... 8 ...
insert()
vll
3 6
1
6 v
3
lr
llr
rl
8 vr
r
rr
vl 3
vll
lll
llr
v
6
1
8 vr
lr
rl
r
rr
hs / fub – alp3-21-RBbaum-1 16
8
Implementierung Transformieren
balance B (Node R (Node R lll vll llr)
vl lr)
v r
= Node B (Node R lll vll llr)
vl (Node R lr v r)
Wenn Musterabgleich zur Färbung vorher durchgeführt
wird, ist hier ein Muster "Schwarzer Zwilling" entbehrlich:
balance B (Node R (Node R lll vll llr)
vl lr)
v (Node B rl vr rr)
= ...
hs / fub – alp3-21-RBbaum-1 17
Transformation: weiterer Fall
vl
ll
vlr 5
6 v
r
3
5
lrl
vlr
vl
ll
3
lrl
6 v
lrr
r
lrr
balance B (Node R ll vl (Node R lrl vlr lrr))
v r
= Node B
(Node R ll vl lrl)
vlr (Node R lrr v r)
hs / fub – alp3-21-RBbaum-1 18
9
|= B4--<
Beispiel
,- B6--<
`- B2--<
,- R8--<
`- B5--<
,- B3--<
`- B1--<
,- B9--<
`- B7--<
,- [-]
`- [-]
,- [-]
`- [-]
,- [-]
`- [-]
,- [
,- R10--<
`- [
`- [-]
,- [-]
`- [-]
Einfügen in von 1 .. 10
in dieser Reihenfolge.
Transformation des BeispielBeispiel-Baums in (2,4)(2,4)-Baum
4
2
1
6 8
3
5
7
9 10
Ergibt sich derselbe (2,4)-Baum bei Einfügen
in gleicher Reihenfolge: insert x : x<- [1..10] ?
hs / fub – alp3-21-RBbaum-1 20
10
Implementierung
Vereinfachte
vl
Implementierung:
vlr 5
6 v
8
vl
vlr
ll
3
ll
5
lrl
6 v
3
8
lrr
lrl
r
lrr
Immer Transformieren, wenn Rotbedingung verletzt,
kein Umfärben.
hs / fub – alp3-21-RBbaum-1 21
Laufzeit
Eine
3
6
Transformation ausreichend!
3
r
5
6
5
Ggf.
r
Wenn Rotbedingung
vor Einfügen erfüllt,
dann auch nach
Transformation.
bis zur Wurzel rückschreitendes Umfärben.
3
6
5
8
3
6
8
5
hs / fub – alp3-21-RBbaum-1 22
11
Laufzeit
Einfügen in einen Rot-Schwarz-Baum benötigt
- O(log n) Schritte zur Suche der Einfügeposition
wie binärer Suchbaum
- maximal eine Transformation O(1)
- maximal h <= 2* log (n+1) Umfärbungen
=> insert() hat Laufzeit O(log n)
Praktisch sehr gute Ergebnisse:
Suche benötigt ca. 1,002 log2 n Vergleiche.
hs / fub – alp3-21-RBbaum-1 23
Löschen in RotRot-SchwarzSchwarz-Bäumen
Löschen
eines von n Werten :
Maximal 2 Umstrukturierungen
O(log n) Umfärbungen
=> Suche, Einfügen, Ändern in Rot-Schwarz-Bäumen in
O(log n) Laufzeit.
... und gute Konstanten.
hs / fub – alp3-21-RBbaum-1 24
12
Herunterladen