Drzewa czerwono

Transkrypt

Drzewa czerwono
Wykład 3
Drzewa
czerwono-czarne
1
Drzewa zbalansowane
Wprowadzenie
Drzewa czerwono-czarne
– Definicja, wysokość drzewa
– Rotacje, operacje wstawiania i usuwania
Literatura
– Cormen, Leiserson, Rivest, “Wprowadzenie do algorytmów”, rozdz. 14
2
Wprowadzenie
Drzewa BST są wygodne do efektywnego implementowania operacji:
Search, Successor, Predecessor, Minimum, Maximum, Insert, Delete
w czasie O(h), (gdzie h jest wysokością drzewa)
Jeśli drzewo jest zbalansowane (ma wtedy wysokość h = O(lg n)),
operacje te są najbardziej efektywne.
Operacje wstawiania i usuwania elementów mogą powodować, że
drzewo przestaje być zbalansowane. W najgorszym przypadku
drzewo staje się listą liniową (h = O(n))!
3
Drzewa zbalansowane
Staramy się znaleźć takie metody operowania na drzewie, żeby
pozostawało ono zbalansowane.
Jeżeli operacja Insert lub Delete spowoduje utratę zbalansowania
drzewa, będziemy przywracać tę własność w czasie co najwyżej O(lgn)
tak aby nie zwiększać złożoności.
Potrzebujemy zapamiętywać dodatkowe informacje, aby to osiągnąć.
Najbardziej popularne struktury danych dla binarnych drzew
zbalansowanych to:
– Drzewa czerwono-czarne: o wysokości co najwyżej 2(lg n + 1)
– Drzewa AVL: różnica wysokości dla poddrzew wynosi co najwyżej 1.
4
Drzewa czerwono-czarne: definicja
Drzewem czerwono-czarnym (RB tree) nazywany drzewo poszukiwań
binarnych, dla którego każdy węzeł posiada dodatkowy bit koloru
(albo czerwony albo czarny) o następujących własnościach:
1. Każdy węzeł posiada kolor – czerwony lub czarny.
2. Korzeń jest koloru czarnego.
3. Każdy liść (null) jest czarny.
4. Dla czerwonego węzła obydwoje dzieci są czarne.
5. Każda ścieżka od ustalonego węzła do liścia musi zawierać tą
samą ilość czarnych węzłów.
Definicja: Czarną wysokością węzła– bh(x), nazywamy ilość czarnych
węzłów na ścieżce prowadzącej od tego węzła do dowolnego liścia.
5
Przykład
3 26
3 17
41 2
2 14
2 10
1 7
1 3
2 21
1 16 1 19
1 12 1 15
null null
null null null null null
null null
2 30
1 38
1 23 1 28
null null null null
1 20
null null
1 47
null null
35 1
39 1
null null
null null
Obok węzłów ich czarna wysokość
(węzły null mają czarną wysokość 0)
6
Wysokość w drzewie czerwono-czarnym
Lemat: drzewo czerwono-czarne o n wewnętrznych węzłach ma wysokość co
najwyżej 2 lg(n +1)
Dowód: dowiedziemy najpierw, że: dla każdego węzła x poddrzewo o korzeniu w
x zawiera co najmniej 2bh(x) –1 węzłów wewnętrznych.
Dowiedziemy tego przez indukcję względem wysokości węzła
dla h = 0, węzeł jest liściem, wtedy bh(x) = 0. Stąd poddrzewo o korzeniu w x
zawiera 20–1= 0 węzłów wewnętrznych.
7
Wysokość w drzewie czerwono-czarnym
Krok indukcyjny: niech x będzie węzłem wewnętrznym o wysokości h > 0, posiada więc
dwóch potomków, oznaczmy ich y i z. Wtedy jeśli:
– y jest czarny bh(y) = bh(x)–1
– y jest czerwony bh(y) = bh(x)
Stąd: bh(y) ≥ bh(x)–1
Możemy teraz wykorzystać założenie indukcyjne dla y ponieważ jego wysokość ( nie
czarna wysokość!) jest mniejsza od wysokości x. Stąd poddrzewo, o korzeniu w y
zawiera co najwyżej 2bh(x)–1 –1 wewnętrznych węzłów.
Mnożąc to przez 2 (dla oby potomków) i dodając 1, dostajemy ilość wewnętrznych
węzłów dla poddrzewa o korzeniu w x nie przekraczającą (2bh(x)–1 –1) + (2bh(x)–1 –1) +
1 = 2bh(x) –1.
8
Wysokość w drzewie czerwono-czarnym
Niech teraz h będzie wysokością drzewa, o korzeniu w x. Dowiedliśmy
poprzednio, że n ≥ 2bh(x) –1
Z własności 4. drzewa RB mamy – przynajmniej połowa węzłów na
ścieżce od korzenia do liścia (nie licząc korzenia) musi być czarna (w
drzewie nie może być sąsiednich czerwonych węzłów!)
Stąd czarna wysokość drzewa wynosi co najmniej h/2, więc ilość
węzłów wewnętrznych n wyniesie: n ≥ 2h/2 –1
Daje to :
n +1 ≥ 2h/2 lg (n +1) ≥ 2 lg h/2 h ≤ 2 lg (n+1)
9
Statyczne operacje dla drzewa RB
Operacje Max, Min, Search, Successor oraz Predecessor dla drzewa RB
zajmują czas O(lg n).
Dowód: operacje takie mogą być przeprowadzanie analogicznie, jak dla
drzew BST, ponieważ nie modyfikują one drzewa (kolor węzła może być
przy nich ignorowany).
Dla drzew BST umiemy takie operacje przeprowadzać w czasie O(h)
gdzie h jest wysokością drzewa, a z lematu dostajemy wysokość
drzewa O(lg n).
10
Dynamiczne operacje dla drzewa RB
Operacje Insert oraz Delete modyfikują drzewo.
Po przeprowadzeniu takiej operacji drzewo może przestać być
zbalansowane, oraz stracić własności drzewa RB.
Dla utrzymania struktury RB, musimy niekiedy zmieniać kolory węzłów i
ponownie balansować drzewo, zmieniając położenie poddrzew.
Ponowne balansowanie odbywa się przy pomocy rotacji, a następnie
„przekolorowaniu” węzłów (jeśli zajdzie taka potrzeba).
11
Rotacje
Rotacja w prawo
y
x
Rotacja w lewo
x
α
δ
β
α≤x≤β i x≤y≤δ
y
α
β
δ
α≤x≤y i β≤y≤δ
12
Rotacje mogą przywrócić własność RB
Rotacja w prawo
y
x
α
x
δ
β
y
α
Konflikt: dwa sąsiednie
węzły czerwone
β
δ
Rotacja rozwiązuje konflikt!
13
Left-Rotate
Inicjuj y
Left-Rotate(T,x)
y  right[x]
right[x]  left[y]
Zamień lewe poddrzewo y na prawe
poddrzewo x
parent[left[y]]  x
parent[y]  parent[x]
Przyłącz ojca x jako ojca y
if parent[x] = null
then root[T]  y
else if x = left[parent[x]] then left[parent[x]]  y
else right[parent[x]]  y
left[y]  x
Przyłącz x jako lewego syna y
parent[x]  y
14
Przykład: Left-Rotate (1)
7
4
3
x
11
6
9
19
14
2
12
y
18
22
17
20
15
Przykład: Left-Rotate (2)
7
4
3
x
11
6
9
α
2
y
18
19
14
12
22
17
β
20
δ
16
Przykład: Left-Rotate (3)
7
4
3
2
y
18
x
11
6
19
14
9
22
α
12
17
β
20
δ
17
Przykład: Left-Rotate (4)
7
4
3
2
y
18
11
6
x
19
14
9
12
22
17
20
18
Rotacje
Zachowują własność drzewa BST.
Zajmują stały czas O(1) – stała ilość operacji na wskaźnikach.
Rotacje w lewo i w prawo są symetryczne.
19
Operacja wstawiania (INSERT) (1)
Nowy węzeł wstawiamy tak, jak do zwykłego drzewa BST i kolorujemy na
czerwono.
Jeśli własności drzewa RB zostały zaburzone, to naprawiamy drzewo
poprzez zamianę kolorów i odpowiednie rotacje.
Które z własności mogą zostać zaburzone?
1. Każdy węzeł jest czerwony lub czarny OK
2. Korzeń jest czarny ?
3. Każdy liść (null) jest czarny OK
4. Obydwaj potomkowie czerwonego węzła są czarni ?
5. Każda ścieżka od węzła do liścia ma tę samą ilość czarnych
węzłów OK
20
Operacja wstawiania (INSERT) (2)
Zaburzenia i metody ich naprawy:
– 2. jeśli wstawiany węzeł x jest korzeniem przekolorujemy go na
czarno OK
– 4. co zrobić, kiedy ojciec jest również czerwony?
Rozpatrzymy trzy przypadki dla wstawianego węzła:
• przypadek 1: „stryj” wstawionego węzła jest też czerwony
• przypadek 2: „stryj” jest czarny, a wstawiany węzeł jest prawym
potomkiem
• przypadek 3: „stryj” jest czarny, a wstawiany węzeł jest lewym
potomkiem
21
przypadek 1: „stryj” wstawionego węzła jest też czerwony
Jeżeli z ma zarówno czerwonego ojca (B) i stryja (D), zmieniamy kolor
ojca i stryja na czarny, a dziadka (C) na czerwony:
Zmiany koloru
dziadek[z]
ojciec[z]
z
C
B
A
α ß
-
C
γ
stryj[z]
D
δ
ε
B
A
D
γ
δ
ε
α ß
jeżeli C jest nowym korzeniem – kolorujemy go na czarno
Jeżeli dziadek C dalej zaburza własności drzewa – naprawiamy dalej
drzewo (w C)
22
przypadek 2: „stryj” wstawionego węzła jest czarny, a z jest
prawym potomkiem
Jeżeli z jest prawym potomkiem czerwonego węzła A i ma czarnego
stryja D, przeprowadzamy rotację lewą dla A:
Lewa rotacja
C
C
ojciec[z]
A
α
z
stryj[z]
D
B
ß γ
δ
D
B
ε
γ
A
α
δ
ε
ß
• to doprowadza do sytuacji opisanej przez przypadek 3
23
przypadek 3: „stryj” wstawionego węzła jest czarny, a z jest
lewym potomkiem
Jeżeli z jest lewym potomkiem czerwonego ojca B i ma czarnego
stryja D, przeprowadzamy prawą rotację w C i zmieniamy kolor B i C:
Prawa rotacja
Zmiana koloru
dziadek[z]
ojciec[z]
z
C
B
B
A γ
α ß
stryj[z]
D
δ
ε
A
α ß
C
γ
D
δ
ε
Po takiej operacji nie ma już zaburzenia własności drzewa RB!
24
RB: wstawianie
Aby wstawić nowy węzeł z do drzewa RB, należy:
1.
Wstawić nowy węzeł z nie zważając na kolory.
2.
Kolorujemy z na czerwono.
3.
Naprawiamy otrzymane drzewo stosując, w razie potrzeby,
przypadki 1,2 i 3
Złożoność czasowa tej operacji wynosi O(lg n)
25
RB: Insert-Fixup (pseudokod)
RB-Insert-Fixup(T,z)
while color[parent[z]] = “red”
do y  z’s uncle
if color[y] = “red” then do Case 1
else do
if z = right[parent[z]] then do Case 2
do Case 3
color[root[T]]  “black”
26
RB: Insert-Fixup
1.
Węzeł wstawiany jest czerwony
2.
Jeśli parent[z] jest korzeniem drzewa, kolorujemy do na czarno
3.
Jeżeli własności drzewa zostały zaburzone to tylko jedna własność
może być niespełniona i jest to albo wł. 2, albo wł. 4.
–
Własność 2: korzeń drzewa jest czerwony
–
Własność 4: zarówno z, jak i jego ojciec (parent[z]) są czerwoni
27
Przykład (1)
11
2
14
1
7
ojciec[z]
5
15
8
stryj[z]
4
z
Zaburzenie: czerwony węzeł z oraz jego ojciec
Przyp. 1: stryj z jest czerwony zmieniamy kolor
28
Przykład (2)
11
ojciec[z]
2
14
1
7
5
4
z
stryj[z]
15
8
Zaburzenie: czerwony węzeł z oraz jego ojciec
Przyp. 2: stryj z jest czarny i z jest prawym
potomkiem rotacja w lewo
29
Przykład (3)
11
ojciec[z]
z
7
2
1
14
8
stryj[z]
15
5
Zaburzenie: czerwony węzeł z oraz jego
4
ojciec
Przyp. 3: stryj z jest czarny i z jest lewym
potomkiem potomkiem rotacja w prawo +
zmiana koloru
30
Przykład (4)
7
2
11
1
5
8
14
4
15
Dostajemy poprawne drzewo RB
Nie ma potrzeby dalszych działań!
31
RB: usuwanie (1)
Korzystamy ze standardowej operacji usuwania dla BST.
Jeżeli zaburzymy własności drzewa RB, to naprawiamy je wykorzystując
rotacje i zmiany kolorów węzłów.
Jakie własności drzewa mogą zostać zaburzone?
1. Każdy węzeł ma kolor czarny lub czerwony OK
2. Korzeń jest czarny ?
3. Każdy liść (null) jest czarny OK
4. Obaj potomkowie czerwonego węzła są czarni ?
5. Każde ścieżka od wybranego węzła do liścia zawiera tyle samo
węzłów czarnych ?
32
RB: usuwanie (2)
Zaburzenia:
– Mogą zostać zaburzone własności 2, 4, 5.
Mamy cztery przypadki:
– Przypadek 1: brat w węzła x jest czerwony (x – „sklejony” węzeł)
– Przypadek 2: brat w węzła x jest czarny, podobnie jak obaj potomkowie w
– Przypadek 3: brat w węzła x jest czarny, lewy potomek w jest czerwony, prawy czarny
– Przypadek 4: brat w węzła x jest czarny, obaj potomkowie w są czerwoni.
33
Przykład (1)
7
usuwane z
2
11
1
5
4
8
14
15
sklejane x
34
Przykład (2)
7
4
1
11
5
8
14
15
Nie ma zaburzeń !
35
Przypadek 1: brat x jest czerwony
Przypadek 1 przekształca się w jeden z pozostałych przypadków
poprzez zamianę kolorów węzłów B i D oraz zastosowanie lewej
rotacji:
Rotacja w lewo
B
x
Zmiana koloru
w
brat[x]
D
A
α
ß
D
C
E
γ δε ζ
E
B
x
A
C
α ßγ δ
ε
w ζ
brat[x]
Nie ma zmiany czarnej wysokości!
36
Przypadek 2: brat x i obaj jego potomkowie są czarni
Przypadek 2 – przenosimy problem o jeden poziom wyżej zmieniając kolor
D na czerwony:
Zmiana koloru
B
x
w
brat[x]
D
A
α ß
nowe x
B
C
E
γ δε ζ
D
A
α
ß
C
E
γ δε ζ
Zmniejszamy o 1 czarną wysokość potomków D!
37
Przypadek 3: brat x jest czarny, a jego potomkowie
czerwony i czarny
Przypadek ten przechodzi w przypadek 4 przez zamianę koloru węzłów C i
D oraz prawą rotacje:
Prawa rotacja
Zmiana kolorów
B
B
x
α ß
w
brat[x]
D
A
C
E
γ δε ζ
x
α ß
nowy w
C
A
γ
D
δ
Nie ma zmian czarnej wysokości!
E
ε
ζ
38
Przypadek 4: brat x jest czarny, a jego prawy potomek
czerwony
Zaburzenie można usunąć poprzez zamianę kolorów oraz rotację w
lewo:
Rotacja w lewo
B
x
Zmiana kolorów
α ß
w
brat[x]
D
A
C
D
E
γ δε ζ
E
B
A
C
ε ζ
α ßγ δ
Czarna wysokość węzłów poniżej A zwiększa się o 1!
39
RB-Delete
Aby usunąć węzeł x z drzewa RB należy:
1.
Usuwamy węzeł x tak, jak z drzewa BST nie zważając na
kolory.
2.
Naprawiamy drzewo (jeśli jest taka potrzeba) stosując
przypadki 1, 2, 3, i 4, aż do naprawienia drzewa
Złożoność takiej operacji wynosi O(lg n)
40
RB-Delete-Fixup (pseudokod)
RB-Delete-Fixup(T, x)
while x ≠ root[T] and color[x] = “black”
do if x = left[parent[x]]
po tym dostajemy
przyp. 2
then w  x’s brother
if color[w] = “red” then do Case 1
if color[w] = “black” and color[right[w]]= “black” and color[left[w]]= “black”
then do Case 2.
else if color[w] = “black” and color[right[w]] = “black”
then do Case 3
if color[w] = “black” and color[right[w]] = “red”
x przechodzi na
parent[x]
po tym
dostajemy
przyp. 4
then do Case 4
else to samo dla x = right[parent[x]]
po tym dostajemy x = root[T].
color[x]  “black”
41
Złożoność RB-Delete
Jeśli zajdzie przyp. 2 w następstwie przyp. 1, to nie wchodzimy
ponownie do pętli – ojciec x jest czerwony po wykonaniu przyp. 2.
Jeśli wykonane zostają przyp. 3 lub 4 również nie wchodzimy
ponownie do pętli.
Jedyny sposób wielokrotnego wykonywania pętli to otrzymywanie
przypadku 2 w następstwie przyp. 2. Stąd wchodzimy do pętli co
najwyżej O(h) razy.
Daje to złożoność O(lg n).
42
Drzewa RB - podsumowanie
Pięć prostych zasad kolorowania gwarantuje, że wysokość drzewa nie
przekroczy 2(lg n + 1) = O(lg n)
Wstawianie i usuwanie odbywa się na takiej samej zasadzie jak dla
zwykłych drzew BST
Operacje te mogą zaburzać własności drzewa RB. Przywracanie tych
własności odbywa się poprzez rotacje i przekolorowanie niektórych
węzłów
We wszystkich przypadkach wymagany jest czas co najwyżej O(lg n).
43

Podobne dokumenty