Drzewa AVL i 2-3-4

Transkrypt

Drzewa AVL i 2-3-4
Wykład 8
Drzewa AVL i 2-3-4
1
Drzewa AVL
Ø  Drzewa AVL
–  Definicja drzewa AVL
–  Operacje wstawiania i usuwania
–  Złożoność obliczeniowa
Ø  Drzewa 2-3-4
–  Definicja drzewa 2-3-4
–  Operacje wstawiania i usuwania
–  Złożoność obliczeniowa
Literatura
–  R. Sedgewick, “Algorytmy w C++”, rozdz. 13
2
Drzewa AVL
Definicja: drzewem AVL nazywamy drzewo BST, takie że dla każdego z
węzłów różnica wysokości jego lewego i prawego poddrzewa wynosi co
najwyżej 1.
Skrót AVL pochodzi od nazwisk twórców: Adelson-Velskii oraz Landis
x
h
h-1 S
h-1
Sh-2
h-2
Sh
Sh = Sh–1 + Sh–2
3
Przykład drzewa AVL
4
44
2
3
17
78
1
2
32
1
88
50
1
48
62
1
4
Wysokość drzewa AVL
Twierdzenie:wysokość drzewa AVL
przechowującego n węzłów wynosi O(log n).
n(2)
3
4
n(1)
Dowód: ograniczymy najpierw n(h): minimalną ilość wewnętrznych węzłów w
drzewie AVL o wysokości h.
–  widać, że n(1) = 1 i n(2) = 2
–  dla n > 2, drzewo o wysokości h zawiera korzeń oraz dwa poddrzewa o
wysokościach h-1 i h-2.
stąd: n(h) = 1 + n(h-1) + n(h-2)
–  wiemy, że n(h-1) > n(h-2), więc n(h) > 2n(h-2). Dalej n(h) > 2n(h-2), n(h) >
4n(h-4), n(h) > 8n(n-6), …,n(h) > 2in(h-2i)
–  rozwiązując powyższe dostaniemy n(h) > 2 h/2-1 , czyli h < 2log n(h) +2
Ø Stąd wysokość drzewa AVL wynosi O(log n)
5
Wstawianie
Ø  Wstawiamy tak jak do drzewa BST
Ø  Zawsze dodajemy nowy liść.
Ø  Przykład :
44
44
17
78
17
78
c=z
a=y
32
50
48
88
62
32
50
48
w
przed
88
62
b=x
54
Po wstawieniu 54
6
Rotacje
Rotacja w prawo
y
x
Rotacja w lewo
x
α
δ
β
α≤x≤β i x≤y≤δ
y
α
β
δ
α≤x≤y i β≤y≤δ
7
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
8
Przykład: Left-Rotate (1)
7
4
3
x
11
6
9
19
14
2
12
y
18
22
17
20
9
Przykład: Left-Rotate (2)
7
4
3
2
x
11
6
9
α
y
18
19
14
12
22
17
β
20
δ
10
Przykład: Left-Rotate (3)
7
4
3
2
18
11
6
19
14
9
α
x
y
12
22
17
β
20
δ
11
Przykład: Left-Rotate (4)
7
4
3
2
18
11
6
x
y
19
14
9
12
22
17
20
12
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.
13
Przebudowa drzewa
Ø  niech (a,b,c) będzie pożądaną listą wierzchołków w porządku inorder
Ø  Przeprowadzamy rotacje, niezbędne do przemieszczenia b na górę
poddrzewa
(pozostałe dwa
przypadki są
symetryczne)
a=z
a=z
przypadek 2: podwójna
rotacja
(prawa c, a potem lewa a)
c=y
b=y
T0
T0
b=x
c=x
T1
T3
b=y
T2
T3
przypadek 1: pojedyncza rotacja
(lewa rotacja a)
T0
T1
a=z
b=x
T2
c=x
T1
T2
a=z
T3
T0
c=y
T1
T2
T3
14
Przykład wstawiania
44
2
5
z
17
3
1
1
32
niezbalansowane...
1
50
48
2
1
7
78
2y
1
64
3
4
62
88
x
5
T3
54
T2
T0
T1
44
4
3
2
17
1
32
1
1
2 y
2
48
...zbalansowane
T0
50
4
x
z6
62
3
1
Nie można wyświetlić
obrazu. Na komputerze
może brakować pamięci do
otwarcia obrazu lub obraz
może być uszkodzony.
Uruchom ponownie
komputer, a następnie
otwórz plik ponownie. Jeśli
czerwony znak x nadal
będzie wyświetlany,
konieczne może być
usunięcie obrazu, a
następnie ponowne
wstawienie go.
5
78
54
T1
2
7
1
88
T2
T3
15
Przebudowa drzewa (pojedyncza rotacja)
1 rotacja
a=z
b=y
b=y
a=z
Nie
moż
na
wyś
wietl
ić
obra
zu.
Na
kom
pute
rze
moż
e
brak
ować
T0
T1
c=x
T3
T0
T2
T0
a=x
T3
T2
c=x
T3
T2
b=y
b=y
Nie
mo
żna
wyś
wiet
lić
obr
azu
. Na
ko
mp
uter
T1
1 rotacja
c=z
a=x
Nie
moż
na
wyś
wietl
ić
obra
zu.
Na
kom
pute
rze
moż
e
brak
ować
T3
c=z
Nie
mo
żna
wyś
wiet
lić
obr
azu.
Na
ko
mp
uter
T2
T1
T0
T1
16
Przebudowa drzewa (podwójna rotacja)
2 rotacje
a=z
b=x
c=y
Nie
możn
a
wyświ
etlić
obraz
u. Na
komp
uterz
e
może
brako
wać
pamię
ci do
otwar
T0
a=z
b=x
T3
T2
T0
c=y
Nie
możn
a
wyświ
etlić
obraz
u. Na
komp
uterz
e
może
brako
wać
pamię
ci do
otwar
T2
T1
T3
T1
2 rotacje
c=z
b=x
a=y
a=y
b=x
T3
Nie
mo
żna
wyś
wiet
lić
obr
azu.
Na
ko
mp
uter
T2
T0
T3
T2
Nie
mo
żna
wyś
wiet
lić
obr
azu.
Na
ko
mp
uter
T1
c=z
T0
T1
17
Usuwanie z drzewa AVL
Ø  Usuwamy, jak z drzewa BST – może spowodować to zaburzenie
zbalansowania drzewa.
Ø  Przykład:
44
44
17
62
32
50
48
17
62
78
54
Przed usunięciem 32
50
88
48
78
54
88
Po usunięciu
18
Przywracanie zbalansowania po usunięciu
Ø  Niech z będzie pierwszym „niezbalansowanym” węzłem, na który
natrafiamy idąc od w. Niech y będzie dzieckiem z o większej wysokości,
a x jego dzieckiem o większej wysokości.
Ø  Przeprowadzamy przebudowę drzewa w x , tak aby przywrócić
zbalansowanie w z.
Ø  Ponieważ operacja taka może zachwiać balans w węźle powyżej musimy sprawdzać zbalansowanie drzewa powyżej (aż do korzenia)
a=z
w
62
44
17
50
48
c=x
78
54
44
b=y
62
88
17
78
50
48
88
54
19
Złożoność obliczeniowa operacji na drzewach AVL
Ø  Pojedyncza przebudowa zabiera czas O(1)
–  Jeśli korzystamy ze struktury łączonego drzewa binarnego
Ø  Wyszukiwanie zajmuje O(log n)
–  Wysokość drzewa wynosi O(log n), nie potrzeba przebudowywać
drzewa
Ø  Wstawianie zajmuje O(log n)
–  Odnalezienie miejsca O(log n) – ze względu na wysokość drzewa
–  Przebudowa drzewa O(1)
Ø  Usuwanie - O(log n)
–  Odnalezienie zabiera czas O(log n)
–  Naprawa drzewa O(log n) – ze względuu na wysokość drzewa
20
Drzewa 2-3-4
9
2 5 7
10 14
21
Drzewa poszukiwań o wielu drogach
Ø  Drzewem poszukiwań o wielu drogach (B-drzewem) nazywamy
uporządkowane drzewo o następujących cechach:
–  Każdy węzeł wewnętrzny posiada co najmniej 2 potomków i
przechowuje d -1 elementów-kluczy (ki, oi), gdzie d jest ilością
potomków węzła
–  Dla każdego węzła o potomkach v1 v2 … vd przechowującego klucze k1
k2 … kd-1
•  Klucze w poddrzewie v1 są mniejsze od k1
•  Klucze w poddrzewie vi są pomiędzy ki-1 i ki (i = 2, …, d - 1)
•  Klucze w poddrzewie vd są większe od kd-1
–  Liście nie przechowują kluczy
11
2 6 8
24
15
27
32
30
22
Przechodzenie InOrder w drzewach o wielu drogach
Ø  Możliwe jest rozszerzenie notacji odwiedzania węzłów InOrder z
drzew binarnych na drzewa o wielu drogach
Ø  Odwiedzamy element (ki, oi) w węźle v pomiędzy rekursywnymi
odwiedzinami poddrzew v o korzeniu w vi i vi + 1
Ø  Odwiedzane węzły w tak zdefiniowanym porządku InOrder są
uporządkowane rosnąco
11
24
8
2 6 8
2
1
4
3
15
6
5
12
27
14
10
7
9
32
18
30
11
13
19
16
15
17
23
Poszukiwanie w drzewach o wielu drogach
Ø  Podobnie do poszukiwania w drzewie BST
Ø  Dla każdego węzła wewnętrznego o potomkach v1 v2 … vd o kluczach
k1 k2 … kd-1:
–  k = ki (i = 1, …, d - 1):poszukiwanie zakończone sukcesem
–  k < k1: poszukiwanie kontynuujemy w poddrzewie v1
–  ki-1 < k < ki (i = 2, …, d - 1): poszukiwanie kontynuujemy w poddrzewie
vi
–  k > kd-1: poszukiwania kontynuujemy w poddrzewie vd
Ø  Dotarcie do liścia kończy poszukiwania (porażka)
Ø  Przykład : odszukujemy klucza 30
11
2 6 8
24
15
27
32
30
24
Drzewa 2-3-4
Ø  Drzewa 2-3-4 – nazywane też (2,4) – są drzewami poszukiwań o
wielu drogach o następujących własnościach
–  własność ilości potomków: każdy węzeł wewnętrzny ma co
najwyżej 4 potomków
–  własność wysokości: wszystkie liście mają tę samą wysokość
Ø  W zależności od ilości potomków, wewnętrzne węzły będziemy
nazywać 2-węzłami, 3-węzłami i 4-węzłami
10 15 24
2 8
12
18
27
32
25
Wysokość w drzewach 2-3-4
Ø  Twierdzenie: Drzewo 2-3-4 przechowujące n elementów ma wysokość O(log n)
dowód:
–  niech h będzie wysokością drzewa 2-3-4 o n elementach
–  ponieważ mamy co najmniej 2i elementów na poziomie i = 0, … , h - 1 i nie ma
elementów ma poziomie h, więc
n ≥ 1 + 2 + 4 + … + 2h-1 = 2h - 1
–  stąd, h ≤ log (n + 1)
Ø  Wyszukiwanie w drzewie 2-3-4 o n elementach zajmuje czas O(log n)
poziom elementy
0
1
1
2
h-1
2h-1
h
0
26
Wstawianie
Ø  Nowy element (k, o) wstawiamy do węzła v – ostatniego wewnętrznego
węzła, przez który przechodziliśmy poszukując k
–  Nie psujemy własności wysokości drzewa
–  Możemy spowodować przepełnienie węzła (v może stać się 5-węzłem)
Ø  Przykład: wstawianie 30 powoduje przepełnienie
10 15 24
2 8
12
18
10 15 24
2 8
12
18
v
27 32 35
v
27 30 32 35
27
Przepełnienie i rozdzielanie węzła
Ø  Problem przepełnienia można rozwiązać przez podział węzła v:
–  niech v1 … v5 będą potomkami v i k1 … k4 będą kluczami w v
–  węzeł v zastępujemy 2 węzłami v' i v"
•  v' jest 3-węzłem o kluczach k1 k2 i potomkach v1 v2 v3
•  v" jest 2-węzłem o kluczach k4 i potomkach v4 v5
–  klucz k3 jest wstawiany do rodzica u węzła v (to może tworzyć nowy korzeń)
Ø  Przepełnienie może teraz nastąpić w węźle u
u
u
15 24 32
15 24
v
12
18
27 30 32 35
v1 v2 v3 v4 v5
v'
12
18
27 30
v1 v2 v3 v4
v"
35
v5
28
Analiza wstawiania
Algorytm insertItem(k, o)
1. Odszukujemy klucz k w celu
zlokalizowania węzła do
wstawienia wartości v
2. Dodajemy nowy element (k, o) w
węźle v
3. while overflow(v)
if isRoot(v)
twórz nowy pusty korzeń nad v
v ← split(v)
Ø  Niech T będzie drzewem 2-3-4 o n
elementach
–  T ma wysokość O(log n)
–  krok 1 zajmuje czas O(log n),
ponieważ odwiedzamy O(log n)
węzłów
–  krok 2 zajmuje czas O(1)
–  krok 3 zabiera O(log n) czasu,
ponieważ każde rozdzielanie
zabiera O(1) i możemy mieć
O(log n) takich operacji
Ø  Stąd wstawianie do drzewa 2-3-4
zajmuje czas O(log n)
29
Usuwanie
Ø  Rozważania na temat usuwania można sprowadzić tylko do przypadku
usuwania wartości z węzła nie posiadającego potomków
Ø  W przeciwnym razie zastępujemy element kolejnym w porządku inorder
Ø  Przykład: usuwanie 24 – zastępujemy 24 prze następnik w porządku
inorder - 27
10 15 24
2 8
12
18
27 32 35
10 15 27
2 8
12
18
32 35
30
Niedobór i łączenie
Ø  Usunięcie elementu z węzła v może spowodować niedobór - v może
stać się 1-węzłem (0 klucz, 1 potomek)
Ø  Dla obsługi tej sytuacji należy połączyć v z rodzicem u, rozpatrzmy
dwa przypadki
Ø  przypadek 1: sąsiedni brat v jest 2-węzłem
–  operacja łączenia: łączymy v z bratem w i przenosimy element z u do
połączonego węzła v'
–  po połączeniu, niedobór może nastąpić w węźle powyżej (u)
u
2 5 7
u
9 14
10
w
v
2 5 7
9
10 14
v'
31
Niedobór i łączenie
Ø  przypadek 2: sąsiedni brat w węzła v jest 3-węzłem lub 4-węzłem
–  przenosimy:
1. potomka w do v
2. element z u do v
3. element z w do u
–  po przeniesieniu nie występują przepełnienia
u
u
4 9
2
6 8
4 8
w
v
2
6
w
9
v
32
Analiza usuwania
Ø  Niech T będzie drzewem 2-3-4 o n elementach
–  wysokość T wynosi O(log n)
Ø  Operacja usuwania:
–  odwiedzamy O(log n) węzłów aby odszukać węzeł, z którego
usuwamy element
–  obsługa niedoborów może prowadzić do wykonania serii O(log n)
łączeń węzłów (przyp. 1) oraz jednego przesuwania (przyp. 2)
–  każde łączenie zajmuje O(1)
Ø  Stąd operacja usuwania w drzewie 2-3-4 zajmuje czas O(log n)
33

Podobne dokumenty