180 likes | 356 Views
Dvojiška in iskalna drevesa. Programiranje 1 Univerza v Ljubljani , FMF, 2013. Dvojiško drevo. Sestavljeno iz vozlišč , vsako vozlišče ima lahko vsebino , levega in/ ali desnega sina ( t.j. določen vrstni red sinov ! ) Dvojiško drevo je: p razno , ali
E N D
Dvojiška in iskalnadrevesa Programiranje 1 Univerza v Ljubljani, FMF, 2013
Dvojiškodrevo • Sestavljenoizvozlišč, vsakovozliščeimalahkovsebino, levega in/alidesnegasina(t.j.določenvrstni red sinov!) • Dvojiškodrevo je: • prazno, ali • sestavljenoizvozlišča (korena) z nekovsebino, pričemerstalevi in desni sin spetdvojiškidrevesi (poddrevesi). • Pazi: rekurzivnadefinicijapodatkovnestrukture!
Primeri Opomba: praznihnavideznihvozlišč ne bomorisali 2 3 1 5 1 8 6 5 7 1 2 3 4
Iskalnodvojiškodrevo • Dvojiškodrevo z dodatnostrukturo • Vozliščavsebujejopodatkeizlinearnourejenemnožice (npr. celaštevila) • Iskalnodvojiškodrevo je: • prazno, ali • sestavljenoizvozlišča (korena), kivsebujenekpodatekxter: • levo in desnopoddrevostaiskalnidvojiškidrevesi, • vsipodatki v vozliščihlevegapoddrevesa so manjšialienakix in • vsipodatki v vozliščihdesnegapoddrevesa so večji od x.
Primeri 1 2 2 1 3 6 5 8 2 10 1 3 6 12
Iskanjeelementa x • Rekurzivno: išči(koren, x): • vrnevozlišče (enoizmed) s podatkomx v drevesu s korenomkoren, sicervrneNone • če je drevoprazno -> vrniNone • sicer, če je x v korenu -> vrnikoren • sicer, če je xmanjšialienak od korena -> išči(koren.levi, x) • sicer -> išči(koren.desni, x) • Premisliiterativnorazličico z zanko! • Časovnazahtevnost – O(globina)
Primeri Iščimo: 3, 4 4 ≤ 5 3 ≤ 5 5 5 4 > 2 3 > 2 2 2 10 10 3 = 3 4 > 3 6 12 6 12 3 3 1 1 Praznovozlišče – elementani v iskalnemdrevesu
Vstavljanjepodatkov • Rekurzivno • Podobnokotiskanje – konaletimona (navidezno) praznovozlišče, dodamo novo vozlišče • Časovnazahtevnost – O(globina)
Primer Vstavimo: 7, 6, 20 6 > 5 7 > 5 20 > 5 5 5 5 6 ≤ 10 7 ≤ 10 20 > 10 2 10 2 10 2 10 6 ≤ 6 7 > 6 20 > 12 6 12 3 1 6 12 3 1 6 12 3 1 6 7 7 6 7 20
Odstranjevanjepodatkov • Odstranimoenopojavitevvozlišča s podatkomx v drevesu • Najdemovozliščevs podatkomx (čeobstaja, sicerkončamo) – algoritemzaiskanje • Če je vozliščev list (ima le praznesinove), gaodstranimo (nadomestimo s praznimdrevesom) • Čeimavozliščeveneganepraznegasinas, potemočetavozliščavprevežemonasinas. • Sicerimavozliščevdvanepraznasinova. Najbo u najboljdesnovozlišče v levempoddrevesu s korenomv. Vozliščeunimadesnegasina. Podatek v vozliščuuvpišemo v vozliščev in vozliščeuzbrišemo. • Časovnazahtevnost – O(globina)
Primer Brišimo: 3, 12, 10, 5 10 imaobasinova. Najboljdesni sin levegadrevesa je 7. Prestavimo 7 v 10 in “prevežemo” list 7 (navirtualnopraznovozlišče), t.j.zbrišemo list. 12 imaenegasina - prevežemo 3 je list - brišemo 10 > 5 12 > 5 3 ≤ 5 5 5 5 3 > 2 10 = 10 12 > 10 2 2 2 10 10 10 3 = 3 12 = 10 6 6 12 6 12 20 1 3 1 1 6 7 6 7 20 6 7 20 5 imaobasinova. Najboljdesni sin levegapoddrevesa je 2. Prestavimo 2 v 5 in prevežemo 2. 5= 5 5= 5 5 2 2 7 1 7 6 20 1 6 20 6 6
Kolikšna je lahkoglobinaiskalnihdreves? • Najbonšteviloelementov v drevesu • V najslabšemprimeru O(n) – npr. vstavljanjeelementovpovrsti (nekakšenseznam) • V najboljšemprimeruimamoporavnanodrevo, globina O(log n) • Kakoohranitičimboljporavnano/uravnoteženodrevoprioperacijahvstavi in odstrani, ki pa ne smejopostatiprezahtevne?
AVL drevo • Iskalnodvojiškodrevo, kistremi k uravnoteženimlevim in desnimpoddrevesom • AVL kraticedvehsovietskihavtorjev: G.M. Adelson-Velskii in E. M. Landis • Vsakovozliščepolegvsebinevsebuješefaktorravnotežja: f(v) = globina(l.levi) – globina(l.desni) • Zavsakovozlišče v v AVL drevesumoraveljati |f(v)| < 2
AVL - vstavljanje • Izvedemoklasičnovstavljanjekotpriiskalnemdrevesu • Izračunamofaktorjeravnotežja, ki se spremenijopopoti od korena do lista, kamorvstavimo • Ob predpostavki, da gledamonajglobljepoddrevo, kjer se porušifaktorravnotežja, se zgodijonatanko 4 možnosti • Z enimpopravkomv času O(1) v najglobljempoddrevesu s porušenimfaktorjemravnotežjadosežemo, da drevo z vstavljenimelementompostane AVL drevo • Kotpopravkeuporabljamorotacije LL, LD, DD, DL (L-levo, D-desno)
Rotacija LL (DD simetrično) A B • Predpostavka: A je najglobljevozlišče, prikaterem se porušifaktorravnotežja (postanepo abs. vrednostivečji od 1) • Premislimo: zgoditise moranatankotakšnasituacija, kot je nalevemdeluslike • rdečkvadratek je dodanovozlišče, kipovečaglobinopoddrevesa B za1 • globinipoddreves D in E predvstavljanjemstaenaki in zaenavečji od globine C (sicer bi prišli v protislovje s predpostavko *) • Vstavljanje je biloizvedeno v drevo D, ki je levo-levo (LL) gledena A • Izvedemoprevezavokotnadesnemdeluslike(rotacija LL), kirazrešisituacijo in novo dobljenodrevoje enakoglobokokotprejšnje in je iskalnodrevo B D C A E C D E 1 2 3
Rotacija LD (DL simetrično) A E B B C A • Predpostavka: A je najglobljevozlišče, prikaterem se porušifaktorravnotežja (postanepo abs. vrednostivečji od 1)* • Zgoditi se moranatankotakšnasituacija, kot je nalevi, pričemerstadveizključujoči se možnosti: ali je prišlo do vstavljanja v poddrevo F (rdečkvadratek) ali v poddrevo G (zelenkvadratek). Dodanovozliščepovečaglobinopoddrevesa B za 1. • Globinipoddreves F in G predvstavljanjemstaenaki, najglobjielementi v poddrevesu D pa so naistiglobinikotnajglobljielementi v F in G (sicerkonflikt s predpostavko) • Vstavljanje je biloizvedeno v poddrevo F ali G, v obehprimerih je to levo-desno (LD) gledenaA, torej v poddrevo E. • Izvedemoprevezavonadesni (rotacija LD), kirazrešisituacijo in novo dobljenopoddrevopostaneenakoglobokokotprej. E F C D D G F G 1 2 3
Analiza • Izslikprimerov, lahkonatančnodoločimoprevezave in novefaktorjeravnotežja! • Rotacijese izvedejo v O(1) časa • Dovolj je enarotacija (v najglobljempoddrevesu s porušenimfaktorjemravnotežja) • Vstavljanje se izvede v O(globina) • Odstranjevanje: • začetek: enakkotpriiskalnemdrevesu; • čeje hglobinaelementa, kigabrišemo, potem se da pokazati, da je poterebnoizvestikvečjemohrotacijpopoti od korena do odstranjenegaelementa • Torej: preostanenam, da dokažemo, da je globina AVL drevesa z nvozlišči O(log n)
Globina AVL drevesa Nh – minimalno število vozlišč v AVL drevesu globine h Nh> Nh-1 + Nh-2 + 1 > 2Nh-2 + 1 >> 1 + 2(1 + 2Nh-4) = 1 + 2 + 22N h-4 > 1 + 2 + 22 + 23N h-2*3 ... > 1 + 2 + 22 + 23 + ... + 2h/2 N h-2*h/2 = 2h/2 - 1 Torej: 2h/2 - 1 < n h/2 < log(n + 1) h < 2 log(n + 1)