Académique Documents
Professionnel Documents
Culture Documents
Dominik Domjani
AVL STABLO
SEMINARSKI RAD
Varadin, 2012.
Dominik Domjani Redoviti student Broj indeksa: 39182 Smjer: Informacijski sustavi Preddiplomski studij
AVL STABLO
SEMINARSKI RAD
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?
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.
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
void drotacija(struct cvor **t){ struct cvor *poml, *pomd; pomd=*t; poml=pomd->lijevi; pomd->lijevi=poml->desni; poml->desni=pomd; *t=poml; }
inae ako je B bio lijevo dijete svog biveg roditelja A postaje lijevo dijete svog 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
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)
10
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
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