Você está na página 1de 19

Strukture podataka: AVL stablo

Nedostatak proizvoljnih binarnih stabala: umetanja i brisanja vorova mogu dovesti do debalansiranosti stabla, ime se smanjuje efikasnost osnovnih operacija nad stablom (pretraga, umetanje, brisanje) => visnski balansirano, AVL stablo (1962) Podseanje: e-skriptarnica studenata Mate ati!ko" #akulteta AVL$ eorg! "a#imovich Adelson-Velsk! (1922%&) ' $evgeni! "ikhailovich Landis (1921&199() AVL stablo je binarno stablo pretrage kod koga je za svaki vor apsolutna vrednost razlike visina levog i desnog podstabla manja ili jednaka od jedan% Visina stabla je visina njegovog korena, tj% maksimalno rastojanje od korena do nekog vora%% Visina !)ora x je rastojanje od x do najdaljeg potomka%

&peracije pretrage, umetanja, brisanja nekog elementa obavljaju se za &(log n) vremena 'rimer (: Na slici je prikazano binarno stablo pretrage koje je balansirano prema (visinskom) )*+

kriterijumu , ali nije balansirano prema op,tem kriterijumu (razlika broja vorova u levom i desnom podstablu svakog vora mo-e biti najvi,e ()

*ebalansiranje stabla nakon u etanja lista


'otreba za rebalansiranjem )*+ stabla se javlja kod umetanja lista, kada je neki njegov predak ve. nagnut (kriti!an !)or) i nakon umetanja nagnu.e prelazi dozvoljenu granicu % 'ostoje dva karakteristina sluaja: a) kritini vor i njegov sin na strani umetanja se naginju na istu stranu b) kritini vor i njegov sin na strani umetanja se naginju na suprotnu stranu /e,enje: /otacije (jednostuke ili dvostruke) oko kritinog vora ispravljaju balans i odr-avaju inorder poredak

Primer rebalansiranja umetanjem vora 50 na slici u primeru 1: Nakon umetanja lista, sin kritinog vora naginje na istu stranu kao i kritini vor (potrebna rotacija ulevo ili udesno)

)lgoritam +0*0 /&1)2340

+0516/&1)13&N(x) y = right(x) temp = left(y) left(y) = x right(x) = temp


0

35
0

-1

3
0 0

43
0

15

50

Primer rebalansiranja umetanjem vora 10 na slici u primeru 1: Nakon umetanja lista, sin kritinog vora naginje na suprotnu stranu od kritinog vora (potrebna dvostruka rotacija, u razliitim smerovima)

*otacije

'ri umetanju vorova u )*+ stablo, najpre se pronalazi mesto voru tako da bude ouvano svojstvo stabala binarne pretrage o ure7enosti kljueva, a potom se u stablo dodaje novi list sa kljuem jednakim kljuu novog vora% 'ri tom mo-e da se desi da stablo postane neuravnote-eno, te se primenjuje rotacija% /otacija je lokalna operacija i zahteva konstantno vreme izvr,avanja% /azlikuju se (% (6struka rotacija (npr% koren levog podstabla podi-e se i postaje koren novog stabla, a ostatak stabla se preure7uje tako da stablo ostane 89' stablo, npr% slika ++) ++=left rotation, //= right rotation :% :6struka rotacija i +eva(+) i ;esna(/): +/, /+
++ ako je levo podst% imalo ve.e h od desno g

i vor je umetnut u levo podst% levog podstabla

// ako je desno podst% imalo ve.e h od levog i vor je umetnut u desno podst% desnog podstabla +/ ako je levo podst% imalo ve.e h od desno g

i vor je umetnut u desno podst% levog podstabla /+ ako je desno podst% imalo ve.e h od levog

i vor je umetnut u levo podst% desnog podstabla

++ < +/ ++

1% =oja stabla na slede.im slikama N39> )*+ stabla? @a,to?

2% &drediti najmanji i najve.i broj elemenata koje mo-e imati )*+ stablo visine h% *+,+-.+: P*V/ 0+1 2A0A34A je odre7ivanje najve.eg broja vorova za )*+ stablo visine h% Neka je h oznaka za najve.i broj vorova stabla visine h% *a-i (samo koren ini )*+ stablo visine A), (=B (koren i levo i desno dete ine )*+ stablo visine (), :=C (koren, levo i desno dete, levi i desni unuk kao deca levog deteta, levi i desni unuk kao deca desnog deteta ine stablo visine :) i va-i
hD(= hD hD( h= h6(D h6(D( A=(

&davde sledi : hD( 6 B hD :

6 h6(=A
hD(

=:

D(6:

h6(

6(

=arakteristina jednacina ove rekurentne veze je: t:6BtD:=A odnosno (t6()(t6:)=A odakle sledi t(=(, t:=:% ;akle, va-i: h= 2( D 2:E :h =ako je: (= 2( D2: B= 2( D:E 2: /e,enja ovog sistema su 2( = 6( i 2: = :% 5ormula za odre7ivanje najve.eg broja cvorova koje moze da ima )*+ stablo visine h je:
h=

6( D :hD(

0*56/ 0+1 2A0A34A: Neka je 8h oznaka za )*+ stablo visine h sa najmanjim brojem vorova sa i neka je -7 oznaka za broj vorova stabla 8h % 8h ima 8)/ 40;N& podstablo visine h6( ( stablo 8h6(), a zbog svojstva da 8h je )*+ stablo sa najmanjim brojem vorova, njegovo drugo podstablo je 8h6:, te va-i: Nh=Nh6(DNh6:D( NhD(=NhDNh6(D(

NhD(6 Nh = Nh DNh6(D(6 Nh6(6 Nh6:6( NhD( 6 :Nh D Nh6:=A =arakteristina jednaina ove rekurentne veze je tB6:t:D(=A odnosno (t6()(t:6t6()=A odnosno njeni koreni su t(=(, t:= ( F , tB= ( F : : @ato je opsti lan niza Nh jednak N h = 2 ( D 2 : E ( ( F )h D 2 B E ( ( F )h : : @bog NA=(, N(=:, N:=G dobija se sistem: (=2( D 2: D 2B ( F D 2 E ( F B : : G= 2( D 2: E ( ( F ): D 2B E (( ( F ): : : := 2( D 2: E /e,enja sistema su: 2( = 6 ( 2: = 2B = : F F F : F

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Vana posledica II dela zadatka: uoite da smo broj vorova u )*+ stablu 8h ()*+ stablo visine h sa najmanjim brojem vorova) opisali kao: Nh=Nh6(DNh6:D( HD(

tj% NhD(=(Nh6(D()D(Nh6:D() tj% 8rojevi NhD( zadovoljavaju istu rekrentnu jednainu kao i lanovi 5ibonaijevog niza% 3ndukcijom se mo-e pokazati da va-i NhD(=5hD: ;akle, za broj n unutra,njih vorova )*+ stabla visine h va-i nejednakost n>=5hD:6( )li, kako va-i da nD: > => , gde va-i da i kako va-i da NhD(=5hD:, onda va-i da

1datle i a o )a8an re9ultat teore e :%1 i9 ud8benika Algoritmika da 7;1%<< lo"2 (n=2) ->%:2? tj% 7@1(lo" n) tj% )isina AVL stabla je 1(lo" n) :% &drediti izgled )*+ stabla dobijenog umetanjem redom brojeva B, (F, GB, :, BF, BB, I, J, (B, F *+,+-.+:

INS. 3
3

INS. 15
3 15
3

INS. 43
15 43

INS. 2
15 3 43
2

INS. 35
15 3 43

35

INS. 33
15 3 2 35 33
2 3

INS. 8
15 35
2 3

INS. 6
15 35 8 6 33

INS. 13
15 3
43

35 8 33 13

43

33

43

43

<% &drediti izgled )*+ stabla dobijenog umetanjem redom brojeva (,:,B,G,F,J,C,I 'odse.anje: =ako bi izgledalo binarno stablo pretrage za ovaj ulazni skup podataka? *+,+-.+:

A% on!atenacija je operacija nad dva skupa koji zadovoljavaju uslov da su svi kljuevi u jednom skupu manji od svih kljueva u drugom skupuK rezultat konkatenacije je unija skupova% =onstruisati algoritam za konkatenaciju dva )*+ stabla u jedno% 9lo-enost algoritma u najgorem sluaju treba da bude &(h), gde je h ve.a od visina dva )*+ stabla% *+,+-.+:

Neka su zadata dva )*+ stabla 1, , tako da svi kljuevi stabla

su ve.i od svih kljueva stabla 1%

>z vorove stabla 1 i uva.e se i informacija o visini, jer je to svojstvo znaajano za )*+ stabla, kao tip balansiranih stabala i neka je, na primer, visina h: stabla sada manja ili jednaka od visine h( stabla 1% ;rugi sluaj re,ava se analogno%

(% 5kloniti naj)ei !)or i9 stabla 3' na pri er !)or r i on .e biti koren stabla preko kog se stablo privezuje za 1% 0vo kako% :% 9pu,taju.i se u stablu 1 samo desnim granama, nai !)or v visine h: ili h:6( (a to je mogu.e jer h(>=h:)% Neka otac !)ora v jeste !)or p" #" 'ostaviti da desni sin !)ora p ne bude vor v, ve. vor r iz koraka (% (,to je odr-ava poredak, jer vor r je sa najve.im kljuem, te mo-e biti desni sin vora p) G% 'ostaviti da le)i sin !)ora r bude vor v sa s)oji 1o je u redu sa stanovista 89' svojstva% podstablo i9 3, a desni sin je koren stabla 6%

&8/)@+&L0N40: r je najve.i vor u 1, te klju vora v nije ve.i od njega i mo-e vor v biti levi sin, a kako svaki vor stabla , te i koren je ve.i od najve.eg kljua iz 1, onda koren iz mo-e biti desni sin sa ciljem da i novoformirano stablo bude binarno stablo pretrage (89')%

F% > koracima B i G formirano je stablo koje ima 89' svojstva, ali mo-da nije uravnote-eno, tj% visina vora r mo-e da postane ve.a za ( od visine vora v koji je bio na tom mestu, te je nu-no obaviti eventualno uravnote-enje pomo.u rotacije% 9ve operacije traju M=&(h() koraka zbog svojstva )*+ stabla%

6% /9)rBiti konkatenaciju stabala sa slike%

(% &pisati realizaciju apstraktnog tipa podataka koji podr-ava slede.e operacije: 5 etni (C) umetanje kljua x u strukturu podataka (ako ve. ne postoji) 1brisi (C) brisanje kljua x iz strukture podataka (ako postoji u strukturi) -aredni (C) pronala-enje najmanjeg kljua u strukturi podataka koji je ve.i od x 3zvr,avanje svake od ovih operacija treba da ima vremensku slo-enost $%log n& u najgorem sluaju, gde je n broj elemenata u strukturi podataka% *eBenje: @a realizaciju navedenih operacija, pogodna struktura podataka je AVL stablo u kome se umetanje i brisanje izvr,ava za $%log n& koraka% @a izvo7enje operacije -aredni (C) koristi se

najpre algoritam pronalaska kljua x (&(log n)) poto se kao u )e raDeno 9adatku i9 binarni7 stabala pretra"e (9adatak 9)' pronala9i sledbenik u stablu (1(lo" n))%

I% &pisati realizaciju apstraktnog tipa podataka koji podr-ava slede.e operacije: 5 etni (C) umetanje kljua x u strukturu podataka (ako ve. ne postoji) 1brisi (C) brisanje kljua x iz strukture podataka (ako postoji u strukturi) -aredni pronala-enje najmanjeg k6tog kljua u strukturi podataka me7u (C'k) onim koji su ve.i od x 3zvr,avanje svake od ovih operacija treba da ima vremensku slo-enost $%log n& u najgorem sluaju,

gde je n broj elemenata u strukturi podataka% *eBenje: 'ogodna struktura podataka za re,avanje ovog problema je )*+ stablo, jer je za njega slo-enost opercija umetanja i brisanja $%log n& /deja je da s)ako !)oru v doda o no)o polje v.D koje e sadr8ati broj poto aka !)ora v ra!unajui i sa !)or v% &znaimo sa /ang(v) broj elemenata stabla iji je klju manji ili jednak od v%=ljuc Na osnovu polja ; mo-e se odrediti /ang(v) u toku tra-enja vora v na slede.i nain (indukcijom): baza: )ko koren ima levog sina, onda je njegov rang za ( ve.i od vrednosti ; njegovog levog sina, u protivnom je rang korena ( 3N: pretpostavimo da znamo rangove svih vorova na putu od korena do nekog vora ' Neka je O+ levi sin vora O Neka je O; desni sin vora O Neka je O+; desni sin vora O+ Neka je O;+ levi sin vora O; *a-i da /ang(O+)=/ang(O)6(6O+;%; /ang(O;)=/ang(O)D(DO;+%; Ako neki od sino)a ne postoji' u9i a se da je od"o)arajuca )rednost polja 0 jednaka >% ;a bi se izvr,ila operacija Naredni(#,k) treba prvo prona.i vor v takav da je v%=ljuc=#% )ko takav vor ne postoji, pretraga je neuspe,na 'otom se tra-i vor sa rangom /ang(v)Dk% 1ra-enje prema rangu iste je slo-enosti kao i tra-enje prema klju.evima% /angovi se raunaju usput, a redosled u stablu im je isti kao redosled kljueva% &staje nam da (po,to smo uveli novo polje ;) posle svake operacije(umetanje, brisanje) a-uriramo vrednost polja ;% @a,to je uvedeno polje ; umesto polja /ang? @ato ,to umetanjeHbrisanjeu najgorem sluaju menja rangove &(n) elemenata (ako bri,emo najmanji element) 9% ;emonstrirati brisanje vora G iz datog )*+ stabla%

*eBenje:

>klanjanje elementa iz )*+ stabla je komplikovanije neko kod binarnog stabla pretrage, jer je potrebno vi,e rotacija% Na primer, da bi se uravnote-ilo 5ibonaijevo (potpuno) )*+ stablo posle uklanjanja PpogodnoP izabranog vora, nu-no je izvr,iti h6: rotacije, gde h je visina stabla%
>kloni G

debalans sa B, ++ rotacija sa :

deabalans sa F, // rotacija sa I

1>% Neka su data dva )*+ stabla na slici% 9matrati da vor binarnog stabla je E-AVL !)or ako nije list i ako razlika visina njegovog levog i desnog podstabla je jednaka A% 'rona7i: a) sve 96)*+ vorove na stablu b) sve 96)*+ vorove iji niti jedan potomak nije 96)*+ vor

11% =onstruisati algoritam ija vremenska slo-enost je linearna po broju vorova binarnog stabla i koji u stablu markira (oznaava) sve 96)*+ vorove iji niti jedan potomak nije 96)*+ vor% Al"orita EAVL (stablo C) ulaz: stablo # izlaz: dubina stabla kao oznacen broj HE 23+4: ako algoritam vrati dubinu MA, to znai da se u stablu kao potomak pojavljuje 9)*+ cvor ako algoritam vrati dubinu A, to znai da stablo je prazno algoritam vrati dubinu >A, to znai da 9)*+ vor jos nije na7en 3;04): (% )ko su dubine levog i desnog podstabla jednake i ako ni u levom ni u desnom podstablu se ne nalazi 9)*+ vor (jer je vracena dubina >A), tada se taj vor markira, jer je 9)*+ vor (npr% sa #6>oznaka=(K)% > tom slucaju vra.a se negativna dubina stabla% :% )ko nisu dubine levog i desnog podstabla jednake ili ako se u levom ili u desnom podstablu nalazi neki 9)*+ vor (jer je vracena dubina MA), tada se vra.a dubina drveta sa predznakom, zavisno od toga da li je na7en 9)*+ vor ili ne% F i# (C$$-5LL) return >G else F le)o$EAVL(C-Hle)o)G desno$EAVL(C-Hdesno)G i# (le)o H> II desno H>) i# (le)o$$desno) JKsituacija 1KJ F C-Ho9naka$1G return -(le)o=1)GL else return aC(le)o' desno) =1G else return -( 1= aC (abs(le)o)' aC(abs(desno))G L

9lo-enost algoritma: 9vako vor se jednom obra7uje u const vremenu, te va-i: za n=(, 1(n) =c( (const za obradu stabla sa jednim vorom) za n>(, 1(n)=nEc(Ec: (c: je cena vremena koje obuhvata rekurzivni poziv 9)*+ algoritma i povratka) => 1(n)=&(n) Q%e%d% 12% Napisati funkciju koja za dato binarno stablo pretrage proverava da li je )*+%

Napisati potom i program koji testira ovu funkciju%


#include<stdio.h> #include<stdlib.h> typedef struct cvor{ int vrednost; struct cvor *levi; struct cvor *desni; } Cvor; /* pratece funkcije a rad da binarni! stablo!. "jih vec i!a!o */

Cvor *napravi#cvor$int broj%{ Cvor *novi&!alloc$si eof$Cvor%%; if$novi&&"'((%{ printf$)*reska pri alokaciji+n)%; e,it$-%; } novi.>vrednost&broj; novi.>levi&"'((; novi.>desni&"'((; return novi; } Cvor *dodaj#u#stablo$Cvor *koren/ int broj%{ if$koren&&"'((% return napravi#cvor$broj%; if$broj<koren.>vrednost% koren.>levi&dodaj#u#stablo$koren.>levi/ broj%; else if$broj>koren.>vrednost% koren.>desni&dodaj#u#stablo$koren.>desni/ broj%; return koren; } Cvor *pretra i#stablo$Cvor *koren/ int broj%{ if$koren&&"'((% return "'((; if$broj<koren.>vrednost% return pretra i#stablo$koren.>levi/ broj%; else if$broj>koren.>vrednost% return pretra i#stablo$koren.>desni/ broj%; return koren;

void prika i#stablo$Cvor *koren%{ if$koren&&"'((% return; prika i#stablo$koren.>levi%; printf$)0d )/ koren.>vrednost%; prika i#stablo$koren.>desni%; } void oslobodi#stablo$Cvor *koren%{ if$koren&&"'((% return; oslobodi#stablo$koren.>levi%; oslobodi#stablo$koren.>desni%; free$koren%;

/* po!ocna funkcija/ vec s!o je ranije pisali */ /* visina stabla */ int visina$Cvor *koren%{ int l/ d; if$koren&&"'((% return .-; l&visina$koren.>levi%; d&visina$koren.>desni%; return $l>d%1 l2-3 d2-; } void koeficijenti#ravnote e$Cvor *koren%{ if$koren&&"'((% return; koeficijenti#ravnote e$koren.>levi%; printf$)Cvor 0d/ koeficijent#ravnote e3 0d+n)/ koren.>vrednost/ visina$koren.>levi%.visina$koren.>desni%%; koeficijenti#ravnote e$koren.>desni%; } /* 45678"6 9'":C;<6 */ /* 6=( stablo3 svaki cvor i!a koef. ravnote e -/ > ili .- */ int 6=($Cvor *koren%{ int d; if$koren&&"'((% return -; d&visina$koren.>levi%.visina$koren.>desni%; return $d&&> ?? d&&- ?? d&&.-% @@ 6=($koren.>levi% @@ 6=($koren.>desni%; }

int !ain$%{ Cvor *koren&"'((; int broj; Cvor *sledb; printf$)'nesite sledeci broj $Ctrl2A a kraj%+n)%; Bhile$scanf$)0d)/ @broj%&&-%{ koren&dodaj#u#stablo$koren/ broj%; printf$)'nesite sledeci broj $Ctrl2A a kraj%+n)%; } printf$)'neto je stablo3 )%; prika i#stablo$koren%; printf$)+n)%; koeficijenti#ravnote e$koren%; if$6=($koren%% printf$)<8C48 6=(+n)%; else printf$)nije 6=(+n)%; oslobodi#stablo$koren%; return >; }

(B% 'odvucite tane iskaze: a) *remenska slo-enost pretra-ivanja u )*+ stablu sa n vorova je &(log N) po,to su )*+ stabla uvek visinski balansirana% b) *remenska slo-enost umetanja i brisanja u )*+ stabu stablu sa n vorova je uvek &(logn)% c) "ana )*+ stabla je da uvanje faktora ravnote-e zahteva dodatan memorijski prostor% d) )*+ stabla jesu asimptotski br-a od binarnih stabla pretrage, ali po,to rebalansiranje zahteva dodatno vreme, onda se u sistemima za upravljanjem bazama podataka koriste druge strukture (npr% 86 stabla) podataka, jer se obimna pretra-ivanja uglavnom rade na disku% e) *remenska slo-enost rotacije )*+ stabla u najboljem sluaju je &(log N)% (G% a) =reirajte binarno stablo pretrage umetanjem brojeva (A, I, GG, G, :(, JI, :, (:, BA, CF, :J, GA, ::% b) ;a li je dobijeno stablo visinski balansirano? c) 8alansirajte binarno stabla pretrage dobijeno pod a) primenom metoda za balansiranje )*+ stabla d) =reirajte )*+ stablo umetanjem brojeva (A, I, GG, G, :(, JI, :, (:, BA, CF, :J, GA, ::% e) >poredite rezultat dobijen pod c), d)%

Você também pode gostar