Drzewa AVL — definicje

Transkrypt

Drzewa AVL — definicje
Drzewa AVL — definicje
1
Uporzadkowane
drzewo
binarne
jest
drzewem
AVL
, jeśli dla każdego
,
wezÃ
, la różnica wysokości dwóch jego poddrzew wynosi co najwyżej 1.
º·
M
PP
³³¹¸
PP
³³
PP
³
³
PP º·
³
º·
³
P
³
P
³
S
D
¹¸
Q
Q
Q º·
Q
Q
´¹¸
Q
´
Q º·
´
º·
Q
´
C
¹¸
F
K
¹¸ ¹¸
h
h
A
A
h
Z
H
¹¸
¶ S
¶
S
º·
º·
¶
S
h
¢ A
A
¢
h
h
A
A
h
¹¸
typowe” drzewo AVL
”
h
¢ A
A
¢
h
h
C
¤ A
CC ¤¤ A
hh h
A
minimalne” drzewa AVL
”
A
h
WÃlasności drzew AVL gwarantuja,, że nawet w najgorszym przypadku
wysokość drzewa wyniesie 1.44 × log(N + 2).
1
Drzewa te wprowadzili w 1962 roku dwaj rosyjscy matematycy: G.M.Adelson-Welskij i E.M.Landis, i od
ich nazwisk (w angielskojezycznej
transkrypcji) pochodzi nazwa AVL.
,
Drzewa AVL
1
Drzewa AVL — tworzenie
Procedura wstawiania elementu do drzewa AVL jest nastepuj
aca:
,
,
1. użyj standardowej procedury wstawiania elementu do uporzadkowanego
,
drzewa binarnego, oraz,
2. jeżeli drzewo utraciÃlo wÃlasność AVL, to przywróć ja, poprzez wykonanie
jednej z czterech rotacji omówionych poniżej.
Implementacja tego schematu wykorzystuje rekurencyjna, procedure,
dodawania elementu i dodatkowe trójwartościowe pole balans w każdym
weźle
drzewa.
,
TYPE DrzewoAVL = ^WezelAVL;
WezelAVL = RECORD
info: T_Element;
lewe, prawe: DrzewoAVL;
balans : -1..1; { 1 oznacza prawe poddrzewo wyzsze,
-1 ozn.wyzsze jest lewe poddrzewo,
END;
0 ozn.poddrzewa rownej wysokosci}
Drzewa AVL
2
Drzewa AVL — pojedyncza prawa rotacja
¿
B
ÁÀ
¡
A
¡
A
¿
ª
¡
A
A
AU
ÁÀ
¢
A
AAU
¢®¢
A
D1
D2
D3
¿
A
⇒
ÁÀ
¢
@
¢
@ ¿
R
@
¢
¢
®¢
D1
B
ÁÀ
¢
A
¢
AAU
¢®
D2
D3
h-1
h
zauważmy ciekawe wÃlasności rotacji:
• jeśli caÃle drzewo byÃlo uporzadkowane
przed dodaniem elementu, to jest
,
również uporzadkowane
po wykonaniu rotacji
,
• jeśli przed dodaniem elementu poddrzewa D1,D2,D3 miaÃly wÃlasność AVL
to caÃle drzewo ma te, wÃlasność po dodaniu elementu i wykonaniu rotacji
Drzewa AVL
3
Drzewa AVL — podwójna prawa rotacja
ciag
, dalszy wÃlasności rotacji:
• rotacja pozostawia drzewo o tej samej wysokości co przed dodaniem
elementu, zatem caÃla operacja nie narusza wÃlasności AVL z punktu
widzenia żadnego nadrzednego”
elementu drzewa (inaczej mówiac,
,
,
”
rotacja kasuje” naruszenie wÃlasności AVL, jeśli takie nastapiÃ
, lo)
”
¿
¿
C
B
ÁÀ
©ÁÀ
¿
©
¼©
A
ÁÀ
¢
¢
¢
¢
®¢
D1
B
B
B
B
A
B
A
¿
AU
BN
B
ÁÀ
¢
A
¢
AAU
¢®
D4
D2 D3
⇒
¡
@
¡
@
¿
¿
ª
¡
@
R
A
ÁÀ
B
£
B
£
BBN
£°£
D1
D2
C
ÁÀ
B
£
B
£
BBN
£°£
D3
D4
h-1
h
Drzewa AVL
4
Drzewa AVL — implementacja dodawania elementu
dodawanie elementu do drzewa można zrealizować zwykÃlym rekurencyjnym
algorytmem dodawania elementu do drzew uporzadkowanych,
jeśli
,
uwzgledni
sie,
,
, za pomoca, pola balans, możliwy wzrost wysokości drzewa i
konieczność wykonania rotacji (patrz funkcja DodajAVL):
poprzedni
balans
-1
-1
-1
0
0
0
1
1
1
Drzewa AVL
przyrost
lewego
poddrzewa
0
1(sk)/-1(we)
0
0
1(sk)/-1(we)
0
0
1(sk)/-1(we)
0
przyrost
prawego
poddrzewa
0
0
1(sk)/-1(we)
0
0
1(sk)/-1(we)
0
0
1(sk)/-1(we)
nowy
balans
przyrost
drzewa
b.z.
-2 → 0
0
b.z.
-1
1
b.z.
0
2→0
0
0
0
0
1
1
0
0
0
komentarz
drzewo bez zmian
prawa rotacja
poprawiÃlo sie,
drzewo bez zmian
dopuszcz.wzrost
dopuszcz.wzrost
drzewo bez zmian
poprawiÃlo sie,
lewa rotacja
5
FUNCTION DodajAVL(VAR korzen : DrzewoAVL;
element
: DrzewoAVL;
FUNCTION PorownajEl(e1, e2 : T_Element) : CHAR) : INTEGER;
{zwraca 0 gdy wysokosc drzewa nie wzrosla; -1/1 gdy wzrosla przez lewe/prawe poddrzewo}
VAR l_wzr, p_wzr : -1..1;
BEGIN
IF korzen=NIL THEN
BEGIN
korzen := Element;
korzen^.balans := 0;
DodajAVL := 1; {w tym przypadku wartosc 1 lub -1 nie ma znaczenia}
END
ELSE
BEGIN
l_wzr := 0;
{wartosc wzrostu lewego lub prawego poddrzewa potrzebna dla ...}
p_wzr := 0;
{wybrania rotacji: pojedynczej lub podwojnej, i prawej lub lewej}
CASE PorownajEl(element^.info, korzen^.info) OF
’<’ : l_wzr := DodajAVL(korzen^.lewe, element, PorownajEl);
’=’ : ; (* blad - element jest juz w/na drzewie *)
’>’ : p_wzr := DodajAVL(korzen^.prawe, element, PorownajEl);
END;
(**** teraz rozwaz mozliwe przypadki (patrz tabela):
- wykonaj odpowiednia rotacje jesli to konieczne,
- ustaw pole balans, i wylicz wlasciwa wartosc funkcji. *)
END;
END; {DodajAVL}
Drzewa AVL
6
Drzewa AVL — usuwanie elementu
Usuwanie elementu z drzewa AVL jest zrealizowane analogicznie: element
jest usuwany procedura, rekurencyjna,, i po powrocie z wywoÃlań
rekurencyjnych na kolejnych poziomach aktualizowane jest pole balans, a
w razie potrzeby wykonywana jest odpowiednia rotacja.
Jednak w przypadku usuwania wezÃ
, lów rotacja nie pozostawia drzewa o tej
samej wysokości, co przed usunieciem
wezÃ
,
, la, a o 1 niższe. Dlatego
jednorazowe wykonanie rotacji nie kasuje do końca zaburzenia, które
propaguje sie, dalej i na wyższych poziomach moga, być konieczne kolejne
rotacje.
Skrajnym przykÃladem takiej sytuacji jest ekstremalne” drzewo AVL, które
”
na każdym poziomie posiada maksymalne niezrównoważenie dopuszczalne
przez wÃlasność AVL. Usuniecie
w tym drzewie wezÃ
drzewa
,
, la z niższej gaÃlezi
,
powoduje kaskade, rotacji na wszystkich poziomach.
Drzewa AVL
7
Skrajny przykÃlad usuwania wezÃ
, la z drzewa AVL:
¾»
M
XX
»»
XXX
½¼
¾»»»»»
XXX
»
9»
»
z
X
P
³
PP
³ ½¼
¾»
PP ¾»
³³
³
)³
q
P
E
B
...
H
©½¼
HH ¾» ¾»
HH ¾»
¾»
©©½¼
©©
H
©
H
¼
©
j
H
©
¼
j
H
A
½¼
C
F
J
½¼
½¼
½¼
R
R
ª
R
@¾»
@¾» ¾»
¡
@¾»
D
G
I
K
½¼ ½¼ ½¼ ½¼
R
@¾»
L
½¼
Usuniecie
elementu A” powoduje naruszenie równowagi w weźle
B”. Aby
,
,
”
”
to skorygować należy wykonać lewa, rotacje, wynoszac
, a, element ”C” w góre,
,
a element B” w dóÃl, i zmniejszajac
, a, w efekcie wysokość drzewa ”B-C-D”.
”
To jednak powoduje naruszenie równowagi w weźle
E” i konieczność
,
”
ponownej lewej rotacji wynoszacej
do góry wezeÃ
,
, l ”H”. Wysokość tego
poddrzewa maleje, i może z kolei spowodować naruszenie równowagi w
weźle
M”, powodujac
, konieczność wykonania w tym punkcie rotacji, itd.
,
”
Drzewa AVL
8
B-drzewa — definicja i wÃlasności
B-drzewem2 nazywamy sortowane drzewo rzedu
2D + 1 (niebinarne), w
,
którym każdy wezeÃ
korzenia, zawiera od D do 2D
,
, l, z wyjatkiem
elementów (kluczy), a wszystkie ścieżki od korzenia do wszystkich liści
maja, te, sama, dÃlugość.
PrzykÃladowe B-drzewo rzedu
3 (liczba D = 1):
,
»»u
»
»»»
15
q
1
u
­
­
­
À
q
q
7
»
»»»
9»»
»
q
u
J
J
J
^
q
20 q 23
30 u80
40
q
q
35
u
­
­
­
À
q
q
u
XX
XXX
?
q
u
J
J
J
^
q
45 q 46
XXX
XXX
q
XX
z
q
90
u
­
­
­
À
q
q
87 89
q
u
J
J
^
J
q
91
q
q
Jak wynika z definicji, w B-drzewie liście wystepuj
a, tylko na najniższym
,
poziomie. Z konstrukcji drzewa rzedu
> 2 wynika, że każdy wezeÃ
,
, l drzewa,
który zawiera k kluczy, posiada dokÃladnie k + 1 poddrzew, przy czym w
B-drzewie wszystkie te poddrzewa musza, być niepuste, z wyjatkiem
liści.
,
2
B-drzewa zostaÃly wprowadzone w roku 1972 przez dwóch matematyków: Niemca Rudolfa Bayera i
Amerykanina Edwarda M. McCreighta. Nie wiadomo skad
, wzieli
, nazwe, B-drzewa.
B-drzewa
9
Zauważmy również, że korzeń B-drzewa jest jedynym wezÃ
, lem, który może
zawierać nieograniczona, liczbe, od 1 do 2D elementów.
Cześciowe
zrównoważenie B-drzew powoduje, że ich wysokość w
,
najgorszym przypadku jest również logarytmem (rzedu
D) liczby wezÃ
,
, lów.
Nadaja, sie, one zatem do przechowywania dużych ilości danych, w
szczególności w plikach dyskowych, zwÃlaszcza jeśli wartość D jest tak
duża, że wielkość wezÃ
dyskowej,
, la zajmuje caÃla, jednostke, alokacji pamieci
,
lub jej wielokrotność. Dlatego typowy rzad
, B-drzewa może wynosić nawet
kilkaset, i wtedy nawet bardzo duże drzewo może mieć tylko 3-4 poziomy.
B-drzewa — definicja typu danych
CONST BDrzewoMax = 500;
TYPE TypElementu = INTEGER;
BDrzewo = ^WezelB;
WezelB = RECORD
naddrzewo:BDrzewo;
elementy :ARRAY[1..BDrzewoMax] OF TypElementu;
poddrzewa:ARRAY[0..BDrzewoMax] OF BDrzewo;
liczba
:INTEGER;
END;
B-drzewa
10
B-drzewa — dodawanie kluczy
• proste dodawanie kluczy - zawsze do liścia
10 20 30
10 20 30 40
30
¡
¡
@
@
¡
@
¡
ª
@
R
10 20
40 50
• przelewanie” kluczy miedzy
sasiednimi
liściami
,
,
”
30
¡
¡
¡
¡
ª
10 20 25
B-drzewa
40
@
@
¡
¡
@
@
R
40 42 44 50
¡
¡
ª
10 20 25 30
@
@
@
@
R
41 42 44 50
11
B-drzewa — dodawanie kluczy (2)
• rozpoÃlawianie” wezÃ
, la z propagacja, klucza w góre,
”
40
40 43
¡
@
¡
@
¡
¡
ª
@
¡
@
R
10 20 25 30
41 42 44 50
¡
¡
¡
ª
41 42
©©
©
©©
@
@
©
©©
©
¼
@
R
10 20 25 30 34 40 41 42 44 50
10 15
»»
»
»
9
10 15
B-drzewa
»
»»»
25 30
¡
¡
@ HHH
@
HH
@
H
HH
@
R
H
j
34 40 41 42 44 50
XX
XXX
XXX
@
XXX
@
XXX
@
X
R
X
z
@
¡
¡
¡
¡
ª
20 32 43
¡
¡
ª
25 30
44 50
20 32 43 56 X
»»
»»
»»
»»»
@
R
?
10 20 25 30
@
?
@
¡
ª
32 43
¡
@
@
¡
¡
?
34 40 41 42
44 50
58 60
12
B-drzewa — usuwanie kluczy
• usuwanie kluczy z liści i zapadanie sie”
, drzewa
”
³
³³
³
³
³³
)
³
©
©©
©©
©©
30 38
PP
P
PP
P
³³
PP
P
P
q
HH
©©
©
©
HH
HH
H
j
?
32 34
³
³³
³
)
10 20 25
³³
32 34
HH
?
44 46
³
³³
¡
¡
¡
¡
ª
30 38 42 P
@
HH
HH
©
©
¼
40 41
³
³³
50 56
©
©©
³
B-drzewa
PP
P
³
³³
HH
©
©
¼
10 20 25
42
52 54
HH
j
H
58 60
PP
@
@
@
R
PP
P
40 41
PP
P
PP
P
q
P
44 50 56
13
B-drzewa — usuwanie kluczy (2)
• usuwanie kluczy z liści i Ãlaczenie
sasiednich
liści
,
,
30 38 42 P
³
³³
¡
¡
³
³
³
)
³³
³
³³
³³
10 20 25
¡
³
³
)
³
³³
³
³³
³³
)
³
PP
P
PP
P
@
@
R
PP
P
q
P
40 41
³
³³
B-drzewa
@
¡
44 50 56
PP
@
¡
¡
30 34
³
PP
P
q
P
25 38 42 P
¡
ª
³
³³
PP
P
40 41
³³
10 20
PP
P
@
@
R
¡
ª
³
10 20
@
32 34
³³
PP
@
³
³³
44 50 56
25 42 P
PP
P
PP
P
?
30 38 40 41
PP
P
PP
P
q
44 50 56
14
Operacje na poznanych typach drzew
Drzewa:
zrównoważone
niezrównoważone
drzewa AVL
B-drzewa
Wysokość drzewa w przypadku:
najgorszym
najlepszym
średnim
log2(N + 1)
N
1.44 × log2(N )
log2(N + 1)
log2(N + 1)
log2(N + 1)
log2(N + 1)
1.39 × log2(N )
log2(N ) + 0.25
logD+1( N2+1 ) + 1
log2D+1(N + 1)
N
log1.38D+1( D+1
)+1
ZÃlożoność obliczeniowa operacji:
Drzewa:
nieuporzadkowane
,
uporzadkowane
,
zrównoważone
drzewa AVL
B-drzewa
wyszukiwania
elementu
dodawania
elementu
usuwania
elementu
przegladania
,
uporzadkowanego
,
O(N)
O(N)
O(log N)
O(log N)
O(log N)
O(1)
O(N)
O(log N)
O(log N)
O(log N)
O(1)
O(N)
O(log N)
O(log N)
O(log N)
O(N log N)
O(N)
O(N)
O(N)
O(N)
Drzewa zrównoważone — podsumowanie
15

Podobne dokumenty