You are on page 1of 37

Algorytmy i struktury danych

Temat: Metody równoważenia drzew BST


Techniki równoważenia drzew BST

B
a) K b) B c)
D

B P K
K

D M R D P M

M R P

Różne drzewa BST zawierające te same dane R

Algorytmy i struktury danych 2


Techniki równoważenia drzew BST
Ile maksymalnie węzłów może mieć drzewo binarne w
zależności od wysokości h?
Wysokość Węzłów na Węzłów
poziom w drzewie
1 20=1 1= 21-1
2 21=2 3= 22-1
3 22=4 7= 23-1
4 23=8 15= 24-1
... ... ...
dla np. n=10 000
11 210=1024 2047= 211-
1
h =  log2 (n + 1) = ...
14 213=8192 16383=
=  log2 10001  =  13,3 = 14 ... ... 214
...-1
h 2h-1 n= 2h-1
... ... ...
Algorytmy i struktury danych 3
Techniki równoważenia drzew BST

Sposoby równoważenia drzewa BST:


1. Uporządkowanie danych przed tworzeniem
drzewa (wybór na korzeń elementu ze środka
listy danych)
2. Stałe poprawianie drzewa w miarę wstawiania
węzłów
(np. z wykorzystaniem rotacji; przykład:
drzewa AVL)

Algorytmy i struktury danych 4


Techniki równoważenia drzew BST

Tworzenie drzewa po uprzednim posortowaniu


jego elementów:
 przed utworzeniem drzewa dane porządkowane są
w tablicy;
 na korzeń drzewa wybierany jest element bliski
wartości środkowej; element ten wyznacza podział
tablicy na lewą
i prawą podtablicę;
 lewy następnik korzenia: środek lewej podtablicy;
prawy następnik korzenia: środek prawej podtablicy;
 otrzymane drzewo jest dobrze zrównoważone
( liczba elementów na drodze od korzenia do dowolnego

liścia jest rzędu log2 n );


Algorytmy i struktury danych 5
Techniki równoważenia drzew BST

Tworzenie drzewa po uprzednim


posortowaniu jego elementów (idea
algorytmu):

void balance(T data[ ], int first, int last) {


if (first<=last) {
int middle=(first+last)/2;
insert(data[middle]);
balance(data, first, middle-1);
balance(data, middle+1, last);
}
}

Algorytmy i struktury danych 6


Techniki równoważenia drzew BST

Przykład użycia funkcji balance


Strumień danych 5 1 9 8 7 0 2 3 4 6
Strumień
uporządkowany 0 1 2 3 4 5 6 7 8 9

0 1 2 3 4 5 6 7 8 9
4
0 1 2 3 4 5 6 7 8 9

1 7
0 1 2 3 4 5 6 7 8 9

0 2 5 8

3 6 9
0 1 2 3 4 5
6 7 8 9
Algorytmy i struktury danych 7
Techniki równoważenia drzew BST

Metoda poprawiania struktury drzewa:

 zasadnicza wada poprzedniej metody: przed


utworzeniem drzewa dane należało posortować;
 inny sposób (bez sortowania): rozłożyć
niezrównoważone drzewo i złożyć je ponownie;
 stosunkowo efektywny może okazać się algorytm DSW
(C.Day, Q.Stout, B.Warren):
 przekształcenie drzewa w winorośl;
 przekształcenie winorośli w drzewo zrównoważone
(z wykorzystaniem rotacji).

Algorytmy i struktury danych 8


Techniki równoważenia drzew BST

Przekształcenie drzewa w winorośl:

UtwórzWinorośl (root, n ) {
tmp=root;
while ( tmp != 0 )
if ( tmp ma lewy następnik) {
obróć następnik w prawo wokół tmp;
ustaw tmp na następnik, który stał się
poprzednikiem;
}
else
ustaw tmp na jego prawy następnik;
}

Algorytmy i struktury danych 9


Techniki równoważenia drzew BST

Przykład przekształcenia drzewa w winorośl


5
5 5 5 5
10
10 10 10 10
tmp 15
15
20 15 15
20
20 20
15 30 20
23
tmp 25 23
25 40 tmp 30
25
23 30 25
23 28 25 40 28
28 40 tmp 30
30
23 28
28 40 tmp 40
Algorytmy i struktury danych 10
Techniki równoważenia drzew BST

Złożoność tworzenia winorośli


 Przypadek optymistyczny (drzewo jest już
winoroślą):
pętla while wykonuje się n razy, nie są wykonywane
żadne rotacje (tylko n instrukcji podstawienia);
zatem T(n)=O(n)
 Przypadek pesymistyczny (korzeń nie ma prawego
dziecka):
pętla while wykonuje się 2n – 1 razy, w tym
wykonywanych jest n-1 rotacji; zatem: T(n)=O(n)

Algorytmy i struktury danych 11


Techniki równoważenia drzew BST

Tworzenie drzewa zrównoważonego


m = 2  log2 ( n +1 ) − 1;
UtwórzDrzewoZrównoważone( n )
{
wykonaj n-m rotacji w lewo, zaczynając od korzenia winorośli;
while (m>1) {
m=m/2;
wykonaj m rotacji w lewo, zaczynając od korzenia
winorośli;
}
}

Algorytmy i struktury danych 12


Techniki równoważenia drzew BST

Przykład tworzenia drzewa zrównoważonego


5
10
10 20

15 5 20 10 25
25
20 23 5 15 23 30
15
25
20 30
23 28 40
28 10 23 28 40
25
30 5 15
28
winorośl: n=9 drzewo zrównoważone
m=23-1=7 30 40
n-m=9-7=2
40
Algorytmy i struktury danych 13
Techniki równoważenia drzew BST

Złożoność przekształcania winorośli w drzewo


zrównoważone
 liczba rotacji w ramach pętli while:

( 2  log2 ( n +1 )  −1 − 1 ) + ... + 15 + 7 + 3 + 1 =
 log 2 ( n +1 )  −1
q n −1
= ∑( 2
i =1
i
− 1 ) = n −  log 2 ( n + 1 ) Sn = a1
q −1

 łączna liczba rotacji:


n − m + ( n −  log 2 ( n + 1 ) ) =
T(n)=O(n)
= 2 n − m −  log 2 ( n + 1 )

Algorytmy i struktury danych 14


Techniki równoważenia drzew BST

Złożoność równoważenia drzewa

• Przekształcenie drzewa niezrównoważonego w winorośl:


O(n)
• Przekształcenie winorośli w drzewo zrównoważone: O(n)

T(n) = max { O(n), O(n) } = O(n)

Algorytmy i struktury danych 15


Techniki równoważenia drzew BST

Metoda poprawiania drzewa w miarę


wstawiania węzłów

Idea: elementy (dane), które wykorzystywane są


najczęściej przesuwane są w górę drzewa
(blisko korzenia)

• Drzewa samonaprawiające się


• Ukosowanie (ang. splaying) drzewa

Algorytmy i struktury danych 16


Techniki równoważenia drzew BST

Drzewa samonaprawiające się

Idea:
Przy sięganiu do elementu następuje korekta
struktury drzewa poprzez:
a) pojedynczą rotację (wokół poprzednika)
b) przesunięcie elementu do korzenia

Algorytmy i struktury danych 17


Rotacja
◆ Lewa rotacja (lub „rotacja w lewo”) węzła y wokół
węzła x
✦ Polega na obrocie węzła y wokół wyróżnionego węzła x
przeciwnie do ruchu wskazówek zegara;
✦ W wyniku rotacji węzeł y staje się nowym korzeniem
poddrzewa, węzeł x zostaje jego lewym synem, a lewy
syn węzła y zostaje prawym synem węzła x;
✦ Można ją wykonać, jeżeli prawy syn węzła y nie jest
NULL;
x y

α y x γ

γ β
β α
Algorytmy i struktury danych 18
Rotacja
◆ Prawa rotacja (lub „rotacja w prawo”) węzła x wokół
węzła y:
✦ Polega na obrocie węzła x wokół wyróżnionego węzła y
zgodnie z ruchem wskazówek zegara;
✦ W wyniku rotacji węzeł x staje się nowym korzeniem
poddrzewa, węzeł y zostaje jego prawym synem, a
prawy syn węzła x zostaje lewym synem węzła y;
✦ Można ją wykonać, jeżeli lewy syn węzła x nie jest
NULL;
y x

x γ α y

β γ
α β
Algorytmy i struktury danych 19
Techniki równoważenia drzew BST

Ilustracja idei: sięgnięcie do węzła D

P P

F Q D Q

D H A F

A E E H

a) rotacja w prawo węzła R

Algorytmy i struktury danych 20


Techniki równoważenia drzew BST

Ilustracja idei: sięgnięcie do węzła R

P P D

F Q D Q A P

D H A F F Q

A E E H E H

a) przesunięcie węzła R do korzenia


(metodą podwójnej rotacji w prawo)
Algorytmy i struktury danych 21
Techniki równoważenia drzew BST

Ukosowanie (1985)
 Jest to modyfikacja strategii naprawiania drzewa poprzez
przenoszenie do korzenia.
 Korekta struktury drzewa następuje poprzez stosowanie
pojedynczych rotacji parami, w kolejności zależnej od
powiązania dziecka, rodzica i rodzica rodzica.
 Wyróżnia się trzy przypadki (dostęp do węzła R, którego
rodzicem jest Q, którego z kolei rodzicem jest P:
• Rodzic Q węzła R jest korzeniem.
• Układ jednorodny: węzeł R jest lewym dzieckiem
Q, zaś Q jest lewym dzieckiem P (lub kiedy w obu
relacjach chodzi o prawe dziecko).
• Układ niejednorodny: węzeł R jest lewym
dzieckiem Q, zaś Q jest prawym dzieckiem P (lub
kiedy R jest prawym dzieckiem, natomiast Q
lewym).
Algorytmy i struktury danych 22
Techniki równoważenia drzew BST

Ukosowanie – przykład (po sięgnięciu do


węzła B)
Q B

B R A Q

A C C R

Przypadek 1. Rodzic węzła R jest korzeniem


(rotacja w prawo węzła R)

Algorytmy i struktury danych 23


Techniki równoważenia drzew BST

Ukosowanie – przykład (po sięgnięciu do


węzła F)
P K F

K Q F P A K

F L A G L Q G P

A G L Q

Przypadek 2. Układ jednorodny


(rotacja w prawo węzła K oraz rotacja w prawo węzła F)

Algorytmy i struktury danych 24


Techniki równoważenia drzew BST

Ukosowanie – przykład (po sięgnięciu do


węzła N)
P P N

K Q N Q K P

A N K O A M O Q

M O A M

Przypadek 2. Układ niejednorodny


(rotacja w lewo węzła N oraz rotacja w prawo węzła N)

Algorytmy i struktury danych 25


Techniki równoważenia drzew BST

Idea algorytmu ukosowania


(przenoszenia węzła do korzenia)
Ukosowanie ( P, Q, R ) {
while (R nie jest korzeniem)
if (rodzic R jest korzeniem)
wykonaj pojedyncze ukosowanie: rotację R wokół
jego rodzica;
else
if (R jest ze swoimi przodkami w układzie
jednorodnym)
wykonaj ukosowanie jednorodne: najpierw rotuj
Q wokół P, potem R wokół Q;
else // R jest ze swoimi przodkami w układzie
niejednorodnym
wykonaj ukosowanie niejednorodne: najpierw
rotuj R wokół Q, potem R wokół P;
}
Algorytmy i struktury danych 26
Techniki równoważenia drzew BST
Przykład ukosowania (po dostępie do węzła E)
P P E

N Q N Q A N

K O E O I P

I L A I F K O Q

E J F K J L

Stan po drugiej parze rotacji


A F J L
Stan po pierwszej parze rotacji
Algorytmy i struktury danych 27
Techniki równoważenia drzew BST

Przykład ukosowania c.d. (dostęp do węzła K)

E K

A N E N

I P
A I L P

F K O Q
F J O Q

J L

Algorytmy i struktury danych 28


Algorytmy i struktury danych
Temat: Zastosowania drzew binarnych
 Drzewa wyrażeń arytmetycznych
Binarne drzewa wyrażeń

 Jednym z zastosowań drzew binarnych jest


jednoznaczny zapis wyrażeń arytmetycznych lub
logicznych (bez używania nawiasów);
 Drzewa wyrażeń konstruuje się, wykorzystując
następujące założenia:
◆ każdy liść zawiera operand (argument) wyrażenia;
◆ każdy węzeł wewnętrzny zawiera operator np.: *, /,
+, - itp.;
◆ wyrażenie powstaje w wyniku realizacji procedury
przechodzenia drzewa jedną z trzech metod:
✦ bezpośredniej (inorder),
✦ z wyprzedzeniem (preorder),
✦ z opóźnieniem (postorder).

Algorytmy i struktury danych 30


Binarne drzewa wyrażeń

Przykład drzewa wyrażeń

Wynik przejścia drzewa


+
metodą:
✦bezpośrednią (inorder):
= -5
– 5 2–3*4+5
✦z wyprzedzeniem
= -5
2 * (preorder):
+–2*34= 5 -5
✦z opóźnieniem
3 4 (postorder):
234*–5+

Algorytmy i struktury danych 31


Binarne drzewa wyrażeń
Mnemotechniczna metoda przechodzenia drzewa:
 wyruszamy z korzenia, okrążając drzewo w kierunku
przeciwnym do ruchu wskazówek zegara;
 staramy się być jak najbliżej mijanych węzłów (niektóre węzły
odwiedzamy wielokrotnie);
 chcą otrzymać listę węzłów odpowiadającą kolejności:
 preorder, należy wypisywać każdy węzeł przy pierwszym
jego odwiedzeniu;
 postorder, należy wypisywać każdy węzeł przy ostatnim jego
odwiedzeniu;
 inorder, należy wypisywać każdy węzeł przy pierwszym jego
odwiedzeniu jeżeli jest liściem, natomiast przy drugim
odwiedzeniu, jeżeli jest węzłem wewnętrznym.
Algorytmy i struktury danych 32
Binarne drzewa wyrażeń
Mnemotechniczna metoda przechodzenia drzewa:

Wynik przejścia drzewa:


+
+ – 2 – * 3 * 4 * – + 5 +
– 5
 Kolejność preorder: + – 2 * 3 4 5
2 *  Kolejność postorder: 2 3 4 * – 5 +

 Kolejność inorder: 2–3 *4 + 5


3 4

UWAGA
Niezależnie od metody każdy liść odwiedzany jest dokładnie jeden raz
(i w tej samej kolejności)
Algorytmy i struktury danych 33
Binarne drzewa wyrażeń

Z uwagi na sposób przechodzenia drzewa wyróżniamy notację wyrażeń:


 przedrostkową (prefiksową), np. + – 2 * 3 4 5
 wzrostkową (infiksową), np. 2 – 3 * 4 + 5
 przyrostkową (postfiksową), znanej jako notacja polska odwrotna,
np. 2 3 4 * – 5 +

Algorytmy i struktury danych 34


Binarne drzewa wyrażeń

Przykłady drzew wyrażeń


Zapis wyrażenia metodą:
✦wzrostkową (inorder):
*
2 – 3 * 4 + 5 = -9
– + ✦przedrostkową

(preorder):
* – 2 3 + 4 5 = -9
2 3 4 5
✦przyrostkową

(postorder):
2 3 – 4 5 + * = -9

Algorytmy i struktury danych 35


Binarne drzewa wyrażeń

Przykłady drzew wyrażeń


Zapis wyrażenia metodą:
✦wzrostkową (inorder):

2 – 3 * 4 + 5 =
-15
2 + ✦przedrostkową

(preorder):
– 2 + * 3 4 5 =
* 5 -15
✦przyrostkową

(postorder):
3 4 2 3 4 * 5 + – =
-15

Algorytmy i struktury danych 36


Algorytmy i struktury danych 37

You might also like