Vous êtes sur la page 1sur 20

SVEUILITE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE VARADIN

Dominik Domjani

AVL STABLO
SEMINARSKI RAD

Varadin, 2012.

SVEUILITE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE VARADIN

Dominik Domjani Redoviti student Broj indeksa: 39182 Smjer: Informacijski sustavi Preddiplomski studij

AVL STABLO
SEMINARSKI RAD

Mentor: Prof. dr. sc. Mirko ubrilo, redoviti profesor

Varadin, sijeanj 2011.

Sadraj

1. UVOD ....................................................................................................................................................................... 1 2. STABLA I BINARNA STABLA ............................................................................................................................ 3 2.1. DEFINICIJA STABLA ............................................................................................................................................ 3 2.3. DEFINICIJA BINARNOG STABLA........................................................................................................................... 4 3. SAMO BALANSIRAJUA BINARNA STABLA ............................................................................................ 5 4. ROTACIJE .............................................................................................................................................................. 6 5. AVL STABLO ......................................................................................................................................................... 9 5.1. SVOJSTVA AVL STABLA .................................................................................................................................... 9 5.2. PRETRAIVANJE AVL STABLA ......................................................................................................................... 10 5.3. UBACIVANJE U AVL STABLO .......................................................................................................................... 11 5.4. BRISANJE IZ AVL STABLA ............................................................................................................................... 12 5.5. IMPLEMENTACIJA AVL STABLA ....................................................................................................................... 13 6. ZAKLJUAK ....................................................................................................................................................... 16 LITERATURA .......................................................................................................................................................... 17

1. Uvod
Danas se raunala koriste za apsolutno sve: poevi od vojnih simulacija, preko fizikalnih i astronomskih simulacija pa sve do komunikacije, medija i astrologije. Pred svega nekoliko desetaka godina, takva iroka upotreba raunala bila je nezamisliva. Osim to danas svi imamo raunala, bilo stolno bilo prijenosno, ona su nam poela preuzimati i depove moderni mobiteli u biti su umanjena raunala koja se svojom snagom mogu mjeriti sa raunalima iz prolog desetljea. Prema Mooreovom se zakonu svake dvije godine broj operacija koje raunalo moe izvriti u sekundi udvostrui. Zbog toga se programi koji ve postoje izvravaju sve bre i bre bez ikakve izmjene njihovog koda. Ipak, ta ubrzanja su samo konstantna i odnose se na sve programe. Pretpostavimo da se bavimo programiranjem. Ako elimo da upravo na program bude najbri, neemo se oslanjati na sirovu raunalnu snagu nego emo koristiti bre algoritme i strukture podataka. Vanost dobrog odabira algoritma opisat emo na primjeru sortiranja. Ako nekim jednostavnim algoritmom (recimo bubble sortom ili selection sortom) pokuamo sortirati veliku koliinu podataka, recimo njih 10,000,000, program e se izvravati otprilike 4.5 sata. Nasuprot tome, koristimo li neto sloeniji, ali bri algoritam (kao, na primjer, quick sort ili merge sort), isti ulazni podaci bit e sortirani za svega nekoliko sekundi! Odabir odgovarajue strukture podataka takoer je vaan. Ako je bitno da moemo pristupiti bilo kojem elementu polja, neemo koristiti listu, nego obino polje, jer emo, u suprotnom, pristup elementima na kraju liste jako skupo plaati. U bazama podataka strukture su takoer bitne. U manjim bazama podataka, za to se koriste binarna stabla. No, u najveim bazama podataka, ne moemo uitati sve podatke, pa onda koristimo posebno dizajnirane strukture, takozvana B stabla. Ipak, ponekad doista nije potrebno muiti se i kodirati najbolji mogui algoritam i najbolju strukturu podataka. Ono to je najbitnije u programiranju jest sposobnost ocjenjivanja

potrebne efikasnosti. Ukoliko shvatimo da je dovoljna i jednostavna alternativa, emu se muiti i pisati neto to jest moda bre, ali i trai puno vie vremena za samo pisanje i dizajniranje te je jo k tome podlonije pogrekama?

2. Stabla i binarna stabla


2.1. Definicija stabla
Stablo je u raunarstvu nain predstavljanja hijerarhije. To je struktura podataka koja vue analogije s rodoslovnim stablima. Prema definicijama teorije grafova, stablo je acikliki povezani graf u kojem svaki vor ima nula ili vie djece. vor je najmanja jedinica grae stabla. Na donjim slikama vorovi su kuice i ono to pie u njima. Crte koje povezuju dva vora zovu se veze. Djeca nekog vora su svi vorovi koji se nalaze ispod tog vora a izravno su povezani s njime. Roditelj nekog vora je vor kojemu je dani vor dijete. vor bez djece zove se list. vor bez roditelja nazivamo korijenom.

Slika 2.1. Primjer stabla

2.3. Definicija binarnog stabla


Binarno stablo je struktura podataka koja se predstavlja kao stablo u kojem niti jedan vor nema vie od dvoje djece. Takoer, korijen stabla je samo jedan, tj. na vrhu smije biti samo jedan element.

Slika 2.2. Primjer binarnog stabla

U binarnom stablu svaki vor ima tono jednog roditelja, s izuzeem korijena stabla, koji nema roditelja. Nadalje, svaki vor ima navie dvoje djece vorova kojima je on roditelj.

3. Samo balansirajua binarna stabla


Samo-balansirajua binarna stabla su binarna stabla koja nam garantiraju sloenost u najgorim sluajevima. Kako smo ve vidjeli na primjeru binarnog stabla, mogue je da se dogodi da nam ono nudi linearnu sloenost koju smo na poetku i eljeli izbjei. Stoga, jo od samog poetka raunalne znanosti, razmatrali su se naini kako osigurati da se sve operacije izvedu u nekom vremenu koje je bolje od linearnog. Prvu takvu ideju imali su Gregorij Adelson-Velskij i Evgenij Landis. Oni su 1962. kreirali stablo koje se balansira po dubini podstabla te je to stablo po njima nazvano AVL stablom. Kako je to obiaj u svim znanostima, nije se stalo na tom otkriu, nego se dalje nastavilo sa radom te su ve nakon desetak godina razvijene razne sline strukture podataka. Danas, upravo zahvaljujui radu tih pionira raunalne znanosti, postoji cijeli niz samo-balansirajuih binarnih stabala. Uz gore spomenuto AVL stablo, meu jednostavnija samo-balansirajua binarna stabla ubrajamo crveno-crna stabla i rairena stabla te razne njihove modifikacije. Ovo podruje se i danas razvija. Najbolji primjer za to su lijevo-naginjua crveno-crna stabla. Njih je konstruirao Robert Sedgewick prije manje od dvije godine (jo nije objavio rad!), a ona programeru daju crveno-crno stablo koje ne mora biti preslika 2-3-4 stabla, nego moe biti i preslika 2-3 stabla. U ovom radu, donosimo kratak pregled odreenih varijanti AVL stabala. Za njih je karakteristino da su operacije traenja i sortiranja identine onima u binarnom stablu. Stoga je vrlo korisno imati sline objektno-orijentirane implementacije za sva stabla jer je tada vrlo jednostavno promijeniti strukturu podatka koju koristimo te se time bolje prilagoditi potrebi.

4. Rotacije
Osnova svih balansirajuih stabala su rotacije. Za rotacije je karakteristino da ne kvare svojstva binarnog stabla, to jest u stablu i nakon rotacije vrijedi da su svi manji elementi u lijevom podstablu, a svi vei u desnom. Postoji samo jedan tip rotacije koji koriste sva balansirajua binarna stabla, a to je rotacija veze roditelja i djeteta. Moe se manifestirati na dva naina: rotacija udesno rotira se lijevo dijete (A) roditelja (B)

Slika 4.1. Rotacija udesno Slika 3 Rotacija udesno novi roditelj od A je roditelj od B novi roditelj od B je A ako je B korijen A postaje korijen

inae ako je B bio lijevo dijete svog biveg roditelja A postaje lijevo dijete svog novog roditelja inae A postaje desno dijete svojeg novog roditelja novo lijevo dijete od B je desno dijete od A ako postoji lijevo dijete od B, njegov novi roditelj postaje B novo desno dijete od A postaje B

Funkcija koja bi izvrila desnu rotaciju u voru t mogla bi izgledati ovako:

void drotacija(struct cvor **t){ struct cvor *poml, *pomd; pomd=*t; poml=pomd->lijevi; pomd->lijevi=poml->desni; poml->desni=pomd; *t=poml; }

rotacija ulijevo rotira se desno dijete (A) roditelja (B)

Slika 4.2. Rotacija ulijevo

novi roditelj od A je roditelj od B novi roditelj od B je A ako je B korijen A postaje korijen

inae ako je B bio lijevo dijete svog biveg roditelja A postaje lijevo dijete svog novog roditelja

inae A postaje desno dijete svojeg novog roditelja

novo desno dijete od B je lijevo dijete od A ako postoji desno dijete od B, njegov novi roditelj postaje B novo lijevo dijete od A postaje B Funkcija koja bi izvrila lijevu rotaciju u voru t mogla bi izgledati ovako: void lrotacija(struct cvor **t){ struct cvor *poml, *pomd; poml=*t; pomd=poml->desni; poml->desni=pomd->lijevi; pomd->lijevi=poml; *t=pomd; }

5. AVL stablo

5.1. Svojstva AVL stabla


AVL stablo konstruirali su Gregorij Adelson-Velskij i Evgenij Landis 1962. u radu Algoritam za organizaciju podataka. AVL stabla ispravljaju nedostatke proizvoljnih binarnih stabala,a taj nedostatak je da umetanja i brisanja vorova mogu dovesti do debalansiranosti stabla, ime se smanjuje efikasnost osnovnih operacija nad stablom (pretraga, umetanje, brisanje). Da bi bilo mogue efikasno realizirati koncept AVL stabla, neopohodno je da u svakom voru postoji i informacija o razlici dubina njegovih podstabala. Struktura koja predstavlja vor stabla mogla bi izgledato ovako: struct cvor{ int podatak; int balans; struct cvor *lijevi, *desni: } Pri emu balans predstavlja razliku dubina desnog i lijevog stabla, odnosno balans =Dubina(desni) Dubina(lijevi) AVL stablo ima sljedea svojstva: 1. Strukturirano je kao binarno stablo 2. Svaki vor u sebi sadri i podatak o balansiranosti (tzv. balance factor) Pojam balansiranosti predstavlja odnos visine potomaka vora sa lijeve i visine potomaka vora sa desne strane. To je u biti razlika izmeu visina dva podstabla 3. Svi podaci o balansiranosti moraju biti izmeu -1 i 1; ako nisu vre se modifikacije Dozvoljena visinska razlika u koristi lijeve ili desne strane je 1. Ako je razlika vea od jedan onda se mora raditi rebalans stabla. Rebalans se izvodi sa operacijom koja se zove rotacija. Dozvoljene rotacije su rotacija u lijevo ili rotacija u desno oko vora.

Bitno je da se prilikom bilo dodavanja novih bilo brisanja postojeih elemenata treba zadrati rastui poredak za preorder nain obilaska stabla, a pri tim operacijama moe se naruiti visinski balans. Tada se po potrebi, ako se narui visinski balans vora (kojeg tada nazivamo kritini vor), moe primjeniti lijeva ili desna rotacije oko vora kojem je naruen visinski balans.

Mane AVL stabla: zahtijeva dodatni prostor za podatak o balansiranosti (2 bita) relativno komplicirana implementacija

AVL stablo, kao i sva ostala samo-balansirajua binarna stabla nam osigurava brzo izvravanje jednostavnih operacija. Tablica 2.1. Karakteristike AVL stabla Tip analize Prosjean sluaj Najgori sluaj O(lgN) O(lgN) O(lgN) O(N) O(lgN) Ubacivanje O(lgN) Traenje O(lgN) Brisanje O(lgN) Sortiranje O(N) Traenje k-tog O(lgN)

5.2. Pretraivanje AVL stabla


Pretraivanje u AVL stablu se izvodi isto kao i kod binarnog stabla traenja. Zbog toga to je stablo samo-balansirajue operacija pretraivanja se izvodi vrlo brzo, tj. O(lgN) vremena. Prilikom pretraivanja nije potrebno poduzimati nikakve posebne korake te sama struktura AVL stabla ostaje ista. Sama operacija pretraivanja u AVL stablu se vri tako da vrijednost koju pretraujemo najprije usporeujemo sa korijenom stabla. Ako je traena vrijednost jednaka vrijednosti u korijenu tada je pretraga gotova. Ako to nije sluaj tada usporeujemo traenu vrijednost sa korijenom i ako je traena vrijednost vea od korijena tada idemo na desni vor korijena, a ako je manja na lijevi vor. Tom formulom se dalje kreemo po stablu po stablu tako dugo dok ne naemo traenu vrijednost. Naiemo li prilikom traenja na list stabla ili je traena vrijednost manja od vrijednosti vora, a vor nema desno dijete i obrnuto tada vrijednosti nema u stablu.

10

5.3. Ubacivanje u AVL stablo


U AVL stablo ubacuje se jednako kao i u binarno stablo, samo to se na kraju rekurzije jo pozove funkcija popravi. Ta funkcija popravlja stablo tako da vrijedi 3. svojstvo AVL stabala. Kako bismo si olakali posao, napravit emo funkciju osvjei vor koja e za dani vor ponovo izraunati visinu podstabla i podatak o balansiranosti. Nju moramo pozvati i na kraju svake rotacije. Funkcija popravi prima vor te prvo osvjei podatke u njemu. Nakon toga, ako je podatak o balansiranosti vei od 1 po apsolutnoj vrijednosti, stablo nije balansirano pa ga treba popraviti. Imamo stoga 2 (u biti 4) sluaja: 1. Podatak je jednak -2. To znai da je lijevo podstablo vie od desnog. Tu opet imamo dva sluaja: a. Podatak u lijevom podstablu je jednak -1. To znai da je lijevo podstablo lijevog djeteta vee od desnog podstabla lijevog djeteta. Ovakvu situaciju emo rijeiti desnom rotacijom veze izmeu trenutnog vora i njegovog lijevog djeteta. b. U suprotnom, znamo da je desno podstablo lijevog djeteta vee od lijevog. Ovakvu situaciju rjeavamo prvo rotacijom veze izmeu lijevog djeteta i njegovog desnog te trenutnog vora i njegovog (novog) lijevog djeteta.

Primjer
vor se ubacuje u podstablo A AVL svojstvo vie ne vrijedi u voru x

Slika 5.1. Sluaj umetanja kada je lijevo podstablo vie od desnog rjeenje: jednostruka rotacija s lijevim djetetom

11

2. Podatak je jednak 2. To znai da je desno podstablo vie od lijevog. Sluaj je potpuno simetrian prvome, pa tako imamo dva simetrina sluaja: a. Podatak u desnom podstablu je jednak -1. To znai da je desno podstablo desnog djeteta vee od desnog podstabla lijevog djeteta. Ovakvu situaciju emo rijeiti lijevom rotacijom veze izmeu trenutnog vora i njegovog desnog djeteta. b. U suprotnom, situaciju rjeavamo rotacijom veze izmeu desnog djeteta i njegovog lijevog te trenutnog vora i njegovog (novog) lijevog djeteta.

Primjer
vor se ubacuje u podstablo c AVL svojstvo vie ne vrijedi u voru x

Slika 5.2. Sluaj umetanje kada je desno podstablo vie od lijevog rjeenje: jednostruka rotacija s desnim djetetom

12

5.4. Brisanje iz AVL stabla


Brisanje je kompliciranije jer ne znamo koje faktore balansa korigiramo. Krecemo od roditelja obrisanog cvora do vrha. Svaki cvor moda moramo balansirati i moe nam trebati O(log N) rotacija poslije brisanja. Brisanje iz AVL stabla je unato tome takoer dosta jednostavna i brza operacija sloenosti O(lgN). Najprije naemo vor koji elimo obrisati pa zatim obavljamo operacije brisanja. Ako je vor koji elimo obrisati list tada se on samo obrie i brisanje je gotovo. Ako vor koji elimo obrisati ima samo jedno dijete tada se vor obrie a dijete dolazi na njegovo mjesto. Ako pak vor ima dvoje djece tada eljeni vor obriemo, a na njegovo mjesto dolazi vor najvee vrijednosti u lijevom podstablu vora kojeg elimo obrisati ili vor najmanje vrijednosti u desnom podstablu vora kojeg elimo obrisati.. Nakon to obavimo brisanje i premjestimo vor najvee ili najmanje vrijednosti, kreemo se natrag po stablu prema korijenu te provjeravamo podatke o balansiranosti.Ako podaci nisu izmeu -1 i 1 tada vrimo rotaciju tako da natrag dobijemo balansirano AVL stablo.

5.5. Implementacija AVL stabla


Implementacija AVL stabla u programskom jeziku Java izgleda ovako:

public class AVLItem extends Item { int height; AVLItem(Object k, Object e, int h) { super(k, e); height = h;} public int height () { return height;} public int setHeight(int h) { int oldHeight = height; height = h; return oldHeight;} } public class SimpleAVLTree

13

extends SimpleBinarySearchTree implements Dictionary { public SimpleAVLTree(Comparator c) { super(c); T = new RestructurableNodeBinaryTree();} private int height(Position p) { if (T .isExternal(p)) return 0; else return ((AVLItem) p.element()). height(); } private void setHeight(Position p) { ((AVLItem) p. element()). setHeight (1+Math.max(height(T .leftChild(p)), height(T .rightChild(p)))); } private boolean isBalanced(Position p) { // testira da li je podatak o balansiranosti u voru p izmeu 1 i -1 int bf = height(T.leftChild(p)) - height(T.rightChild(p)); return ((-1 <= bf) && (bf <= 1));} private Position tallerChild(Position p) { // vraa a dijete vora p ija je visina vea od drugog djeteta if(height(T.leftChild(p)) >= height(T.rightChild(p)); else return T.leftChild(p);} private void rebalance(Position zPos) { //vraanje od vora p do korijena i provjeravanje podataka o balansiranosti, te izvoenje rotacija ako su potrebne while (! T.isRoot(zPos)) { zPos = T.parent(zPos); setHeight(zPos); if (!isBalanced(zPos)) { // izvoenje rotacije Position xPos = tallerChild(tallerChild(zPos)); zPos = ((RestructurableNodeBinaryTree)T) .restructure(xPos); setHeight(T.leftChild(zPos)); return T.leftChild(p);

14

setHeight(T.rightChild(zPos)); setHeight(zPos); }}} public void insertItem(Object key, Object element) throws InvalidKeyException { super.insertItem(key, element); Position zPos = actionPos; // poinje od pozicije za umetanje T.replace(zPos, new AVLItem(key, element, 1)); rebalance(zPos);} public Object remove(Object key) throws InvalidKeyException { Object toReturn = super.remove(key); if (toReturn != NO_SUCH_KEY) { Position zPos = actionPos; // poinje od pozicije za brisanje rebalance(zPos);} return toReturn; }}

15

6. Zakljuak
Operacije balansiranja kod AVL stabla su mnogo jednostavnije nego kod odravanja optimalno balansiranog stabla i zahtjevaju najvie jednu dvostruku rotaciju kod umetanja, dok se kod brisanja moe zahtjevati jedna jednostruka ili dvostruka rotacija po nivou. Neki eksperimentalni podaci pokazuju da se u prosjeku rotacija zahtjeva u 46.5% umetanja, pri emu su jednostruka i dvostruka rotacija jednako vjerovatne. Kod brisanja je rotacija jo rjea, pa se u prosjeku deava 0.214 jednostrukih ili dvostrukih rotacija po brisanju. Interesantno je da je prilikom pretraivanja stabla i dalje vremenska sloenost O(log n), ak i u najgorem sluaju. S obzirom da je raunalna znanost novo podruje, moemo rei da ono jo ne preuzima sve uloge za koje je sposobno. To se odnosi na sve njene grane, pa tako i na podruje struktura podataka u obliku binarnih stabala. Ipak, njihovu primjenu moemo nai u bazama podataka kad je podatke mogue uitati u radnu memoriju. Na kraju moemo rei da AVL stabla odravaju binarno stablo pretraivanja u ravnotei prilikom njegovog stvaranja kada se vorovi ubacuju. Postoji i alternativan pristup (neemo ga vidjeti u ovim predavanjima) u kojemu se stabla rebalansiraju ne prilikom ubacivanja elemenata ve prilikom pristupanja istim (splay trees).

16

Literatura
Brad Appleton, AVL Trees: Tutorial and C++ Implementation, [www.oopweb.com] Donald Knuth. The Art of Computer Programming, Volume 3: Sorting and Searching, Second Edition. Addison-Wesley, 1998. ISBN 0-201-89685-0. Section 6.2.3: Balanced Trees http://strukturepodataka.blogger.ba/arhiva/2009/07/06/2236076 http://www.johns-company.com/index.php?lang=hr&cat=141&month=2009-06&id=51730 www.riteh.uniri.hr/.../04%20-%20Stabla%20II.pdf www.link-elearning.com/.../AVLStabla.pdf http://en.wikipedia.org/wiki/AVL_tree http://en.wikipedia.org/wiki/Binary_tree

17

Vous aimerez peut-être aussi