Stabla binarnog pretrazivanja

Embed Size (px)

Citation preview

SADRAJ

Strana 1. UVOD...........................................................................................................................................1 2. BINARNA STABLA...................................................................................................................2 3. STABLA BINARNOG PRETRAIVANJA...............................................................................5 4. PRETRAIVANJE, UMETANJE I BRISANJE IZ B-STABLA.............................................10 4.1. Pretraivanje B-Stabla ........................................................................................................10 4.2. Umetanje kljua u B-Stablo ...............................................................................................13 4.3. Brisanje iz B-Stabla ............................................................................................................20 5. VISINSKI BALANSIRANO STABLO AVL........................................................................22 6. ZAKLJUAK.............................................................................................................................26 LITERATURA...............................................................................................................................27

1. UVODVektori i povezane liste su jednodimenzionalne strukture podataka koje odraavaju samo redosled elemenata. Ponekad je meutim potrebno predstaviti i sloenije odnose izmeu II

Stabla binarnog pretraivanja elemenata. Stablo (drvo) je hijerarhijska struktura, ali se moe koristiti i za izvoenje nekih operacija nad linearnim strukturama. Na ovom mestu baviemo se samo hijerarhijskim ili korenskim stablom. Korensko stablo ini skup vorova i grana, koje povezuju vorove na specijalan nain.1 2 4 5 6 7 3 8

9

10 11 12 13

14

15

16

17

Jedan vor je izdvojen, predstavlja vrh hijerarhije i zove se koren stabla. vorovi vezani sa korenom ine nivo 1 hijerarhije; (novi) vorovi vezani sa vorovima nivoa 1 (sem korena) ine nivo 2 hijerarhije, itd. Svaka grana u stablu povezuje neki vor sa njegovim (jedinstvenim) prethodnikom (ocem); jedino koren nema oca. Osnovna karakteristika stabla je da nema ciklusa (zatvorenih puteva), zbog ega izmeu svaka dva njegova vora postoji jedinstveni put. vor u stablu vezan je sa ocem i nekoliko sinova. Za vor v koji se nalazi na putu od vora u do korena kae se da je predak vora u; u tom sluaju je vor u potomak vora v. Maksimalni broj sinova vora u grafu zove se stepen stabla. Obino je za sinove svakog vora definisan redosled, tako da se sinovi mogu identifikovati svojim rednim brojem. Stablo stepena dva zove se binarno stablo. vor u binarnom stablu moe da ima najvie dva sina, levog i desnog. vor bez dece zove se list, a vor koji nije list zove se unutranji vor. Visina stabla je najvei nivo hijerarhije u njemu, tj. maksimalno rastojanje od korena do nekog vora. vor ima klju iz nekog potpuno ureenog skupa (npr. celi ili realni broj). Svaki vor moe da ima polje za podatak to zavisi od primene. U nastavku e biti rei o binarnom stablu pretrage.

2. BINARNA STABLA1

1

www.studenti.math.hr/~filipo/Binarno_stablo.htm

2

Stabla binarnog pretraivanja Binarno stablo se rekurzivno definie kao konaan skup elemenata koji je ili prazan ili se sastoji od korena i dva binarna podstabla koja se ne preklapaju (tzv. levo i desno podstablo).A

B

C

E

H

J

K

L

Striktno binarno stablo je binarno stablo kod koga svaki vor nema nijedno podstablo ima tano dva. Kompletno binarno stablo je striktno binarno stablo kod koga su svi listovi na istom nivou. Broj vorova u kompletnom stablu je: n = 2h-1, gde je h visina stabla.A B C

G

E

H N O P Q

J R

K

L

M

Skoro kompletno binarno stablo je binarno stablo za koga vai da su svi nivoi u stablu popunjeni, osim eventualno zadnjeg, i to tako da se popunjavanje vri s leva u desno. Tri su standardna naina kako se mogu obii vorovi datog stabla a da se pri tome posete tano jednom: Prefiks prolaz, Infiks prolaz, Postfiks (sufiks) prolaz. Prefiks prolaz (K-L-D) Prvo se poseti koren, zatim prefiks prolazom svi vorovi levog podstabla, a zatim svi vorovi desnog podstabla, A, B, G, E, C, H, K, L, J. Infiks prolaz (L-K-D) Prvo se posete infiks prolazom svi vorovi levog podstabla, zatim se poseti koren, a zatim svi vorovi desnog podstabla, G, B, E, A, K, H, L, C, J. Postfiks prolaz (L-D-K)

3

Stabla binarnog pretraivanja Prvo se posete postfiks prolazom svi vorovi levog podstabla, zatim svi vorovi desnog podstabla, a zatim se poseti koren, G, E, B, K, L, H, J, C, A Matematiki izrazi sa binarnim operatorima se mogu predstaviti preko striktnog binarnog stabla: Listovi su operandi, Unutranji vorovi su binarni operatori (operacije). Definicija stabla kao ATP: Binarna stablo se mogu implementirati na dva naina: Preko dinamiki spregnute strukture, Preko niza. Dinamika implementacija je vrlo fleksibilna implementacija, lako se vri dodavanje i izbacivanje; nema ogranienja na broj vorova i broj nivoa stabla; mogua je primena za sve sluajeve i oblike binarnih stabala Implementacija preko niza je efikasna implementacija mogua samo za specijalni sluaj skoro kompletno binarno stablo, i broj vorova i nivo stabla ogranieni su dimenzijom niza. Efikasna implementacija preko niza mogua samo za skoro kompletno binarno stablo (SKBS). Kod SKBS je mogue numerisati vorove da odgovaraju indeksima u nizu i to tako da za svaki vor vai: Indeks levog deteta = Indeks * 2 Indeks desnog deteta = Indeks * 2 + 1 Indeks roditelja = Indeks / 2 Knutova transformacija transformie umu stabala u jedno binarno stablo. Koraci koji se primenjuju su sledei: 1. 2. 3. 4. Poveu se koreni svih stabala, Prekinu se sve veze izmeu roditelja i dece izuzev krajnje leve veze, Poveu se sva deca istog roditelja, Dobijena slika se rotira za 45 stepeni udesno.

Rekonstrukcija stabla originalnog stabla: pokaziva nalevo je pokaziva na prvo dete, pokaziva na desno je pokaziva na brata.

4

Stabla binarnog pretraivanja Transformie bilo koje stablo u striktno binarno stablo tako to se prekinu sve veze izmeu roditelja i dece izuzev krajnje leve veze, poveu se sva deca istih roditelja i dobijena slika se zarotira za 45 stepeni udesno.

3. STABLA BINARNOG PRETRAIVANJA2Kod obinog binarnog stabla pretraivanje se zasniva na nekom od prolaza i ima O(n) efikasnost. BST se zasniva se na ideji da se binarno stablo organizuje tako da omogui pretraivanje slino binarnom pretraivanju niza .BST je binarno stablo kod koga za svaki vor vae sledea 2 uslova: 1. Svi vorovi u levom podstablu imaju sadraj koji je manji ili jednak sadaju datog vora, 2. Svi vorovi u desnom podstablu imaju sadraj koji je vei ili jednak sadaju datog vora.50

20

90

30

60

95

55

80

Postupak pretraivanja BST: Ako je sadaj korena vei od traenog kljua onda se pretrauje levo podstablo rekurzivno, Ako je sadaj korena manji od traenog kljua onda se pretrauje desno podstablo rekurzivno, Ako je jednak po sadraju onda je koren traeni vor.8050

50

809020

50

50

20

90

20

90

20

90

8030 60 95

30

60

95

30

60

95

30

60

95

8055 80

552

80

55

80

55

80

www.fonforum.org/download/druga/.../Sredjena_predavanja-drugi_kol.do

5

Stabla binarnog pretraivanja

Nalaenje kljua je operacija po kojoj je struktura podataka binarno stablo pretrage dobila ime. Potrebno je pronai u stablu elemenat sa zadatim kljuem x. Broj x uporeuje se sa kljuem r korena BSP. Ako je r = x onda je traenje zavreno. Ako je pak x < r (odnosno x > r) onda se traenje rekurzivno nastavlja u levom (odnosno desnom) podstablu. Algoritam Nai u BSP(Koren; x); Ulaz: Koren (pokaziva na koren BSP), x (broj). Izlaz: vor (pokaziva na vor koji sadri klju x, ili nil ako takvog vora nema). begin if Koren = nil or Koren^.Klju = x then Cvor := Koren {Koren^ je slog iju adresu sadri pokaziva Koren} else if x < Koren^.Klju then Nadji_u_BSP(Koren^.Levi, x) else Nadji_u_BSP(Koren^.Desni, x) end Postupak ubacivanja u BST: Prvo se pretrai BST, Ubaci se novi vor na mesto nula pokazivaa gde se pretraivanje zavrilo.8550 50 20 20 90 20 90 30 30 60 95 30 60 95 60 95 30 60 95 90 20 90 50 50

8555 80 55 80

55

80

55

80 85

85

Algoritam Umetni_u_BSP(Koren, x); Ulaz: Koren (pokaziva na koren BSP), x (broj). Izlaz: U BSP se umee vor sa kljuem x na koga pokazuje pokaziva Sin; ako ve postoji vor sa kljuem x, onda Sin = nil. begin

6

Stabla binarnog pretraivanja if Koren = nil then kreiraj novi vor na koga pokazuje Sin; Koren: = Sin; Koren^.Klju = x; Koren^.levi := nil; Koren^.Desni := nil; else vor := Koren; {tekui vor u stablu} Sin := Koren; {postavlja se na vrednost razliitu od nil} while vor nil and Sin nil do if vor^.Klju = x then Sin := nil else {silazak niz stablo za jedan nivo} Otac := vor; if x < Cvor^.Klju then vor := vor^.Levi else vor := vor^.Desni; if Sin nil then {novi vor je sin vora} Otac kreiraj novi vor na koga pokazuje Sin; Sin^.Klju := x; Sin^.Levi = nil; Sin^.Desni = nil; if x < Otac^.Klju then Otac^.Levi := Sin else Otac^.Desni := Sin end Postupak izbacivanja iz BST: Prvo se pretrai BST da bi se naao traeni vor za izabacivanje zatim se naeni vor izbucuje na nai koji zavisi od njegove pozicije. Mogue su tri situacije gde se nalazi vor: vor je list, vor je polu-list (Ima samo jedno dete), vor je unutranji (Ima oba deteta). Situacija 1: vor je list prosto se izbaci vor iz stabla i aurira pokaziva njegovog roditelja da sadri null vrednost. Primer: izbaciti 3050 20 90 20 50 50 20 90 60 60 95 55 55 80 55 80 80 95 90

3030 60 95 30

7

Stabla binarnog pretraivanja

Situacija 2: vor je polu-list izbaci vor iz stabla, a pokaziva njegovog roditelja se aurira da sadri pokaziva na dete vora koji se izbacuje. Primer: izbaciti 2050

2020 90 20

50

50

90

30

90

30

60

95

30

60

95

30

35

60

95

30

35

55

80

30

35

55

80

55

80

Situacija 3: vor je unutranji Pronae se njegov prvi sledbenik (ili prethodnik) koji mora biti na krajnjoj levoj (tj. desnoj) poziciji u desnom (tj. levom) podstablu. Sledbenik (tj. prethodnik) mora biti ili list ili polu-list, Zameni se sadraj sledbenik (tj. prethodnik) sa sadrajem traenog vora, Izbacuje se vor sa pozicije sledbenika (tj. prethodnika). Ovo se svodi na sluajeve 1. i 2. izbacivanja.

Primer: Izbaciti 9050 50

9090 20

9090 20

50

20

80

30

60

95

30

60

95prethodnik

30

60

95

55

80

55

80

55

90

8

Stabla binarnog pretraivanja

Algoritam Ukloni iz BSP(Koren; x); Ulaz: Koren (pokaziva na koren BSP), x (broj). Izlaz: Iz BSP se uklanja vor sa kljuem x, ako takav postoji. {Pretpostavka je da se koren nikad ne brie, i da su svi kljuevi razliiti} begin {prva faza: traenje vora sa kljuem x} vor := Koren; while vor nil and vor^.Klju x do Otac := vor; if x D i G < H klju kojeg traimo se nalazi u srednjem detetu te uporeivanjem slova G sa kljuevima srednjeg deteta nailazimo na klju G. Tada pretreivanje staje.

Slika 5

11

Stabla binarnog pretraivanja

Iako smo prilikom pretraivanja imali 5 uporeivanja samo 2 vora je trebalo prebaciti u memoriju. Slino binarnom stablu broj prebacivanja je povezan sa visinom stabla. Meutim zbog toga to B-Stablo moe imati vie od dva deteta visina stabla je manja te samim time imamo manje prebacivanja u primarnu memoriju te manje I/O operacija diska. Pretraivanje B-Stabla je slino pretraivanju binarnog stabla dok je jedina razlika u tome to je vie dece pa moramo odluiti gde se granati. Na svakom unutranjem voru u sluaju da vor ima x dece imamo x + 1 odluka gde se granati. B-Tree metoda pretraivanja kao parametar uzima pokaziva na vrni vor (root node) podstabla i vrednost koja se trai. Ako se traena vrednost nalazi u stablu tj. podstablu tada metoda vraa par (y,i) gde je y vor te i je indeks na kojem se nalazi traena vrednost inae vraa se NULL. Metoda za pretraivanje B-Stabla: B_tree_pretrazi(x, k) { i = 1; while( i keyi[x] ) { i++; if( i 0; j--)

15

Stabla binarnog pretraivanja { Keyj+1[x] = keyj[x]; } Keyi[x] = keyt[y]; n[x] = n[x] + 1; WRITE_DISK(y); WRITE_DISK(z); WRITE_DISK(x); } } } Metoda uzima kao parametre X-roditelj koji ima dete Y na indeksu i. Y sadri 2t-1 dece tj. kljueva te se podeli na dva dela koja imaju po t-1 dece. Novo alociranom voru (node) Z se dodeli t-1 dece koji su po vrednosti vei od dece Y-na. Z postaje novo dete vora X i pozicionira se po vrednosti iza vora Y. Sredinje dete vora Y postaje novi klju vora X i slui da bi se odvojili Y i Z. Na kraju kad se izmene vorovi (nodes) X, Y i Z navedeni se zapiu natrag na disk. Metoda za umetanje kljua u stablo kao argumente uzima klju k i stablo u koje treba umetnuti klju. Zavisno od visine stabla potrebno je O(h) puta itati s diska. Takoe metoda koristi metodu B_tree_prepolovi_djete(x, i, y) da bi se garantovalo da se rekurzija nikad ne spusti do punog vora. Pseudo kod metode B_tree_prepolovi_dete(x, i, y): Alociraj prostor za novi cvor i nazovi ga Z. Ako je Y list onda oznaci Z kao list inace oznaci Z kao unutranji postavi broj kljuceva u cvoru Z na t-1 kopiraj zadnjih t-1 kljuceva iz Y u Z cvor Ako Z nije list onda kopiraj zadnjih t pokazivaca iz Y u Z. postavi broj kljuceva u Y na t - 1 umetni pokazivac na dete Z u cvor X. umetni orginalni sredisnji kljuc iz cvora Y u cvor X u odgovarajucem redosledu uvecaj broj kljuceva u cvoru X za jedan.

16

Stabla binarnog pretraivanja spremi promene X, Y i Z na disk. B_tree_insert(T, k) { r = root[T]; if( n[r] == 2t -1) { s = allocate_node(); root[T] = s; leaf[s] = false; n[s] = 0; C1[s] = r; B_tree_prepolovi_djete (s, 1, r); B_tree_insert_nonfull (s, k); } else { B_tree_insert_nonfull (r, k); } } U sluaju da je vor r pun vrni vor se podeli na dva dela te novi vor s postaje vrni vor. Visina stabla se poveava za jedan. Metoda zavrava kad se pozove metoda za umetanje kljua k u dete iji vrni vor (root node) nije pun. Upravo zbog toga to se prvo ispita da li vrni vor sadri onoliko dece koliko je dozvoljeno osigurano je da se uvek novi klju unese. Metoda B_tree_insert zapravo proverava da li je vrni vor pun te ako je napravi mesto za novi klju dok metoda B_tree_insert_nonfull zapravo umee novi klju te se pretpostavlja da ako je dolo do poziva ove metode vrni vor nije pun. B_tree_insert_nonfull(x, k) { i = n[x]; if ( leaf[x] ) {

17

Stabla binarnog pretraivanja While ( i >= 1 && k < keyi[x] ) { keyi+1[x] = keyi[x]; i = i-1; } keyi+1[x] = k; n[x] = n[x] + 1; WRITE_DISK(x); } else { While ( i >= 1 && k < keyi[x] ) { i = i -1 ; } i = i + 1; READ_DISK(Ci[x]); if ( n[Ci[x] == 2t 1) { B_tree_prepolovi_djete(x, i, Ci[x]); if ( k > keyi[x] ) i = i + 1; } B_tree_insert_nonfull( Ci[x], k); } } Prvi deo metode u sluaju da je x list stabla (leaf node) umee klju k u vor x, ako x nije list stabla tada se klju k umee u odgovarajui vor u podstablu vora x. Rekurzivno se sputamo do vora gde bi trebalo umetnuti klju. Ako je odgovarajui vor pun onda se poziva metoda prepolovi_dete te se na odgovarajue mesto umee klju k.

18

Stabla binarnog pretraivanja Prilikom umetanja u B-Stablo potrebno je disku pristupiti O(h) puta ako je visina stabla h. S obzirom da je samo jedno itanje i pisanje po disku potrebno izmeu poziva B_tree_insert_nonfull. Ukupno vreme procesora korieno je O(t*logt n). Metoda B_tree_insert_nofull je u primeru napisana tako da se odvija rekurzija meutim mogue ju je napisati tako da radi s petljom to rezultira tim da je potrebno imati samo jednu stranicu tj. sektor diska u u primarnoj memoriji tj. RAM-u. Pseudo kod metode za umetanje kljua k u stablo T: B_tree_insert(T, k) r = root[T] Ako vrsni cvor je pun onda Alociraj prostor za novi cvor i nazovi ga s. root[T] = s //make s the root. r still points to original root. postavi broj cvorova u s na 0. postavi jedini pokazivac na dete od s da pokazuje na r. pozovi B_tree_prepolovi_djete(s, 1, r) da prepolovis r i njegov sredisni kljuc pomaknes u s. pozovi B_tree_insert_nonfull(s, k) da umetnes kljuc k u stablo sa vrsnim cvorom s. else //vrsni cvor nije pun pozovi B_tree_insert_nonfull(s, k) da umetnes kljuc k u stablo sa vrsnim cvorom r. end if B_tree_insert_nonfull(x, k) i = broj kljuceva u x Ako x je list onda Zbog toga sto x nije pun umetni kljuc k na odgovarajuce mjesto u x Dodaj jedan na broj kljuceva u x i spremi novu vrijednost x na disk. else //x nije list Pretrazi unatrag od zadnjeg kljuca iz x dok ne nades pokazivac na dete koje je vrsni cvor podstabla u koje kljuc k treba umetnuti Ako dete je puno onda pozovi B_tree_prepolovi_dete(x, i, Ci[x]) postavi i = indeks deteta od x koje je vrsni cvor podstabla u koje treba umetnuti k. pozovi B_tree_insert_nonfull(ci[x], k) //rekurzivni poziv end if 19

Stabla binarnog pretraivanja

4.3. Brisanje iz B-Stabla6Brisanje iz B-Stabla je komplikovanije nego pretraivanje ili umetanje jer ukljuuje spajanje vorova. Uzmimo primer stabla sa prethodne slike te u sluaju da izbriemo klju K iz njega stablo bi izgledalo ovako:

Slika 10 Nakon brisanja kljua K iz stabla sa slike 8 Ovo stablo vie nije valjano B-stablo jer nema srednjeg lana izmeu kljueva J i L. Da bismo popravili strukturu stabla potrebno je redistribuirati neke od kljueva. U ovom sluaju klju J se sputa u vor koji sadri klju I tj. desno od kljua I jer se sortira po abecedi.

Slika 11 Nakon popravljanja stabla Ovo je bio jednostavan primer, meutim ta se dogaa ako se izbriu kljuevi I i J? Tada bi stablo izgledalo ovako:

6

www.developerszone.net/Dokumenti/B-Trees.pdf

20

Stabla binarnog pretraivanja

Slika 12 Nakon brisanja kljueva I i J iz stabla na prethodnoj slici Ponovno je potrebno redistribuirati stablo. Vrni vor H e se morati spustiti za razinu nie to rezultira smanjivanjem visine stabla za jedan. Brisanje kljueva iz B-Stabla je malo komplikovaanije nego umetanje jer klju moe biti izbrisan iz bilo kog vora u stablu te se deca vora moraju reorganizovati. Takoe se mora voditi rauna da nakon brisanja stablo ostane strukture kakva treba biti, moramo osigurati proveru da vor nakon brisanja kljua ne ostane premalen tj. da ima manje od minimuma zadanog broja kljueva (t 1 klju). Metoda kao argumente prima klju kog treba izbrisati iz podstabla iji vrni vor je x. Mora se osigurati reorganizacija stabla u sluaju da vor x nakon brisanja ima manje od t kljueva. Pseudo kod metode B_tree_delete: Ako je x list onda Ako je k u x onda Izbrisi k u x i vrati true inace Vrati false inace Ako je k u x onda Y = X dete koje prethodi k Ako Y ima bar t kljuceva onda K' = k prethodnik Kopiraj K' preko k B_tree_brisi(y, k') Inace

21

Stabla binarnog pretraivanja Z = X dijete koje sledi k Ako Z ima najmanje t kljuceva K' = k naslednik Kopiraj k' preko k B_tree_brisi(z, k') Inace Spoji k i sve z na y // y sad ima 2t 1 kljuc // k i pokazivac na z ce se izbrisati iz x B_tree_brisi(y, k) // rekurzivni poziv Inace //k nije unutarnji cvor od x Ci[x] pokazuje na vrsni cvor c cije podstablo moze sadrzavati k Ako c ima t -1 kljuc onda Ako c je levi / desni polubrat, Z, koji ima t ili vise kljuceva Neka k1 bude kljuc u x koji prethodi /slijedi c Pomakni k1 u C kao prvi/zadnji kljuc Neka k2 bude kljuc prvi /zadnji kljuc u z Zameni k1 u x sa k2 iz z Pomakni zadnje/prvo dete podstabla od z da bude prvo/zadnje diete od c Inace Spoji c sa jednim od njegove blize polubrace i spoji odgovarajuci kljuc od x da bude sredisnji kljuc cvora c B_tree_brisi (c, k)

5. VISINSKI BALANSIRANO STABLO AVL7BST stablo kod koga za svaki vor vai da se visina njegovog levog i desnog podstabla ne razlikuje za vie od 1 se naziva visinski balansirano stablo ili AVL stablo. AVL stablo je dobilo ime po imenima naunika Addison, Velsky i Landin koji su predloili ovakvo stablo. Ovo stablo reava problem najgoreg sluaja kod BST, pretraivanje garantovano ima efikasnost7

www.strukturepodataka.blogger.ba/arhiva/2009/07/06/2236076

22

Stabla binarnog pretraivanja O(log n). U odnosu na BST ima modifikovane algoritme za ubacivanje i izbacivanje. Ovo stablo se zasniva na rotacijama i rotacije mogu biti na levo i na desno. Rotacije na desno:B A 50 D B 20 C 90 E D 15 E 30 F 60 G 95 30 F 60 90 G C 95 15 50 A 20

Rotacije na levo:

C A 50 A C 90 50 F 60

90 G 95

B

20

B

20

D

15

E

30

F

60

G 95

D

15

E

30

Balansiranje stabla: Rotacije menjaju visinski balans stabla Rotacija na desno poveava debalans u korist desnog podstabla Rotacija na levo poveava debalans u korist levog podstabla Ovo se koristi kod algoritama za ubacivanje i izbacivanje Kada operacija narui visinski balans, tj. stvori se debalans na jednoj strani, primenjuje se odgovarajua rotacija da koriguje debalans Rotacije je uvek suprotna debalansu kako bi izjednaila balans. Npr, ako je debalans na desno, koristi se leva rotacija i obrnuto Ubacivanje u AVL stablo

23

Stabla binarnog pretraivanja 1. Ubacuje se vor na isti nain kao u sluaju BST, 2. Proveri se za svaki vor u stablu njegov debalans, tj. razlika visina izmeu levog i desnog podstabla, 3. Ako postoji debalns, onda se vri odgovarjua rotacija oko vora k koji je najblii mestu ubacivanja, 4. Ako je oznaka debalansa deteta vora k suprotna, onda se pre rotacije iz koraka 3, vri suprotna rotacija oko tog deteta vora k. U ovom sluaju su potrebne dve rotacije. Ubacuje se broj 40:Debalans = Visina Levo Visina Desno

50 20 30 20 -2 90 30

50

-2 0 90 50 20 0 0 30 0 -1 90 0

-1 0

40 40

40

Potrebna jedna rotacija u levo oko 20

Rezultat nakon rotacije

Ubacuje se broj 60:50 20 90 0 20 0 30 0 0 50 -1 90

30

40

60

40

60

0

Nema debalansa , nisu potrebne rotacije

Ubacuje se broj 70:0 0 20 0 30 0 50 -1 90

-1 0 20 0 30 0

50

2. rot

40

60

0

40

+2 90 1. rot -1

60

0

70

70Postoji debalans , suprotni znaci, potrebne 2 rotacije

24

Stabla binarnog pretraivanja Nakon 1. rotacije50 20 2. rot 90

Nakon 2. rotacije50 20

70 40 60

30

40 60

7030

90

Izbacivanje iz AVL stabla Izbacivanje iz AVL stabla se vri na sledei nain: 1. Izbaci se vor na isti nain kao kod BST, Postoje tri sluaja: vor list samo se izbaci vor polu-list prevee se dete na roditelja vor unutranji vri se zamena sa prethodnikom (sledbenikom) i svodi se na

prva dva sluaja 2. Proveri se debalans i vre potrebne (jedna ili dve) rotacije kao i kod ubacivanja. Izbacuje se broj 5050 20 90

90 20 50

30

40

sledbenik

30

40

Izbacuje se kao list

Nakon izbacivanja 50+2 0 0 30 20 0 90

Nakon rotacije20 0 30 -1 +1

90

40

40 0

Postoji debalans , potrebna 1 rotacija

25

Stabla binarnog pretraivanja

6. ZAKLJUAKBinarno stablo traenja (BST) o kome je govoreno u prethodnom delu rada se moe iskoristiti za implementaciju datoteke sa vrlo efikasnim pretraivanjem. Kao to smo videli, najefikasnije pretraivanje je onda kada je BST balansirano (svi listovi na istoj visini) tj. jednako je visini stabla. Meutim problem nastaje zbog ubacivanja novih vorova jer mogu pokvariti balansiranost stabla to opet pogorava efikasnost pretraivanja. Problem je reen sa AVL stablima koja odgovarajuim rotacijama balansiraju stablo. B-Trees ili B-Stabla su algoritmi dizajnirani za manipulaciju podacima koji se nalaze na diskovnim jedinicama, najee tvrdim diskovima. Jedina, a ujedno i najvea, prednost im je to

26

Stabla binarnog pretraivanja roditelj moe imati vie dece. Broj dece je ogranien samo karakteristikama diska tj. veliinom sektora na disku. Ta zavisnost je proporcionalna tj. to je vei sektor roditelj moe posedovati vie dece te je obrnuto proporcionalno visini stabla. Naime to je vei broj dece koja se mogu dodeliti odreenom roditelju manja je verovatnoa da e dolaziti do deljenja deteta i poveanja visine stabla za jedan. B-Trees algoritmi se najvie koriste kod baza podataka, prilikom kreiranja indeksa nad tablicama. Pretraivanje je puno bre jer je potrebno u najgorem sluaju h itanja s diska gde je veliina h zapravo visina stabla. itanje i pisanje po disku su same po sebi skupe operacije pa time B-Trees algoritmi postaju najoptimalniji za spremanje i pretraivanje podataka. BST stablo kod koga za svaki vor vai da se visina njegovog levog i desnog podstabla ne razlikuje za vie od 1 se naziva visinski balansirano stablo ili AVL stablo. AVL stablo je dobilo ime po imenima naunika Addison, Velsky i Landin koji su predloili ovakvo stablo. Ovo stablo reava problem najgoreg sluaja kod BST, pretraivanje garantovano ima efikasnost O(log n). U odnosu na BST ima modifikovane algoritme za ubacivanje i izbacivanje. Ovo stablo se zasniva na rotacijama i rotacije mogu biti na levo i na desno.

LITERATURA

1. 2. 3. 4. 5.

www.developerszone.net/Dokumenti/B-Trees.pdf www.etfbl.net/dokument.php/12314/1/B-stabla.ppt www.fonforum.org/download/druga/.../Sredjena_predavanja-drugi_kol.do www.strukturepodataka.blogger.ba/arhiva/2009/07/06/2236076 www.studenti.math.hr/~filipo/Binarno_stablo.htm

27