2015-03-19 17_09-iva-seminarski

42
SVEUČILIŠTE/UNIVERZITET „VITEZ“ TRAVNIK FAKULTET POSLOVNE INFORMATIKE STUDIJ I CIKLUS; GODINA STUDIJA: I CIKLUS; I GODINA SMIJER: INFORMACIONE TEHNOLOGIJE BINARNO STABLO (STRUKTURA, UMETANJE, PRETRAŽIVANJE I BRISANJE ELEMENATA) I NJIHOVA IMPLEMENTACIJA U ODABRANOM PROGRAMSKOM JEZIKU SEMINARSKI RAD

Upload: ivabrkovic

Post on 12-Jan-2016

228 views

Category:

Documents


0 download

DESCRIPTION

tnhnh

TRANSCRIPT

Page 1: 2015-03-19 17_09-iva-seminarski

SVEUČILIŠTE/UNIVERZITET „VITEZ“ TRAVNIK

FAKULTET POSLOVNE INFORMATIKE

STUDIJ I CIKLUS; GODINA STUDIJA: I CIKLUS; I GODINA

SMIJER: INFORMACIONE TEHNOLOGIJE

BINARNO STABLO (STRUKTURA, UMETANJE,

PRETRAŽIVANJE I BRISANJE ELEMENATA) I NJIHOVA

IMPLEMENTACIJA U ODABRANOM PROGRAMSKOM

JEZIKU

SEMINARSKI RAD

Travnik, ožujak 2015. godine

Page 2: 2015-03-19 17_09-iva-seminarski

SVEUČILIŠTE/UNIVERZITET „VITEZ“ TRAVNIK

FAKULTET POSLOVNE INFORMATIKE

STUDIJ I CIKLUS; GODINA STUDIJA: I CIKLUS; I GODINA

SMIJER: INFORMACIONE TEHNOLOGIJE

BINARNO STABLO (STRUKTURA, UMETANJE, PRETRAŽIVANJE I

BRISANJE ELEMENATA) I NJIHOVA IMPLEMENTACIJA U

ODABRANOM PROGRAMSKOM JEZIKU

SEMINARSKI RAD

IZJAVA: Ja, Iva Brković , student Sveučilišta/Univerziteta „Vitez“ Travnik, Indeks broj:

0306-14/RIT , odgovorno i uz moralnu i akademsku odgovornost izjavljujem da sam ovaj rad

izradila potpuno samostalno uz korištenje citirane literature i pomoć profesora, odnosno

asistenta.

Potpis studenta: _Iva Brković

Student: Iva Brković

Predmet: Struktura podataka i algoritmi

Profesor: dr. Lazo Roljić

Asistent: mr.sc. Dragan Mlakić

Travnik, mart, 2015 godine

2

Page 3: 2015-03-19 17_09-iva-seminarski

S A D R Ž A J

Strana

1. UVOD......................................................................................................................................1

2. BINARNA STABLA..............................................................................................................2

3. STABLA BINARNOG PRETRAŽIVANJA.......................................................................4

4. PRETRAŽIVANJE, UMETANJE I BRISANJE IZ B-STABLA.....................................9

4.1. Pretraživanje B-Stabla......................................................................................................9

4.2. Umetanje ključa u B-Stablo............................................................................................12

4.3. Brisanje iz B-Stabla........................................................................................................19

5. VISINSKI BALANSIRANO STABLO – AVL.................................................................21

6. ZAKLJUČAK......................................................................................................................25

LITERATURA.........................................................................................................................26

II

Page 4: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

1. UVOD

Vektori i povezane liste su jednodimenzionalne strukture podataka koje odražavaju

samo redoslijed elemenata. Ponekad je međutim potrebno predstaviti i složenije odnose

između elemenata. Stablo (drvo) je hijerarhijska struktura, ali se može koristiti i za izvođenje

nekih operacija nad linearnim strukturama. Na ovom mjestu bavit ćemo se samo

hijerarhijskim ili korjenskim stablom. Korjensko stablo čini skup čvorova i grana, koje

povezuju čvorove na specijalan način.

Jedan čvor je izdvojen, predstavlja vrh hijerarhije i zove se korijen stabla. Čvorovi

vezani sa korijenom čine nivo 1 hijerarhije; (novi) čvorovi vezani sa čvorovima nivoa 1 (osim

korijena) čine nivo 2 hijerarhije, itd. Svaka grana u stablu povezuje neki čvor sa njegovim

(jedinstvenim) prethodnikom (ocem); jedino korijen nema oca. Osnovna karakteristika stabla

je da nema ciklusa (zatvorenih puteva), zbog čega između 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 korijena kaže se da je predak čvora u. U tom slučaju je čvor u potomak

čvora v. Maksimalni broj sinova čvora u grafu zove se stepen stabla. Obično je za sinove

svakog čvora definiran redoslijed, tako da se sinovi mogu identificirati svojim rednim brojem.

Stablo stepena dva zove se binarno stablo. Čvor u binarnom stablu može da ima najviše dva

sina, lijevog i desnog. Čvor bez djece zove se list, a čvor koji nije list zove se unutrašnji čvor.

Visina stabla je najveći nivo hijerarhije u njemu, tj. maksimalno rastojanje od korijena do

nekog čvora. Čvor ima ključ iz nekog potpuno uređenog skupa (npr. cijeli ili realni broj).

Svaki čvor može imati polje za podatak – što zavisi od primjene.

U nastavku će biti riječi o binarnom stablu pretrage.

1

Page 5: 2015-03-19 17_09-iva-seminarski

A

B C

HE J

K L

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

2. BINARNA STABLA1

Binarno stablo se rekurzivno definira kao konačan skup elemenata koji je ili prazan ili

se sastoji od korijena i dva binarna podstabla koja se ne preklapaju (tzv. lijevo i desno

podstablo).

Striktno binarno stablo je binarno stablo kod koga svaki čvor nema nijedno podstablo

ima točno 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, gdje je h visina stabla.

A

B C

HE JG

O PK L M N RQ

Skoro kompletno binarno stablo je binarno stablo za koga važi da su svi nivoi u stablu

popunjeni, osim eventualno zadnjeg i to tako da se popunjavanje vrši s lijeva u desno. Tri su

standardna načina kako se mogu obići čvorovi datog stabla, a da se pri tome posjete točno

jednom:

prefiks prolaz,

infiks prolaz,

postfiks (sufiks) prolaz.

Prefiks prolaz (K-L-D)

Prvo se posjeti korijen, zatim prefiks prolazom svi čvorovi lijevog podstabla, a zatim

svi čvorovi desnog podstabla, A, B, G, E, C, H, K, L, J.

Infiks prolaz (L-K-D)

1

2

Page 6: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Prvo se posjete infiks prolazom svi čvorovi lijevog podstabla, zatim se posjeti

korijen, a zatim svi čvorovi desnog podstabla, G, B, E, A, K, H, L, C, J.

Postfiks prolaz (L-D-K)

Prvo se posjete postfiks prolazom svi čvorovi lijevog podstabla, zatim svi čvorovi

desnog podstabla, a zatim se posjeti korijen, G, E, B, K, L, H, J, C, A

Matematički izrazi sa binarnim operatorima se mogu predstaviti preko striktnog

binarnog stabla:

listovi su operandi,

unutrašnji čvorovi su binarni operatori (operacije).

Definicija stabla kao ATP

Binarna stabla se mogu implementirati na dva načina:

preko dinamički spregnute strukture,

preko niza.

Dinamička implementacija je vrlo fleksibilna implementacija, lako se vrši dodavanje i

izbacivanje, nema ograničenja na broj čvorova i broj nivoa stabla, moguća je primjena za sve

slučajeve i oblike binarnih stabala.

Implementacija preko niza je efikasna implementacija moguća samo za specijalni

slučaj – skoro kompletno binarno stablo i broj čvorova i nivo stabla ograničeni su dimenzijom

niza.

Efikasna implementacija preko niza moguća samo za skoro kompletno binarno stablo

(SKBS). Kod SKBS je moguće numerisati čvorove da odgovaraju indeksima u nizu i to tako

da za svaki čvor važi:

indeks lijevog djeteta = Indeks * 2

indeks desnog djeteta = Indeks * 2 + 1

indeks roditelja = Indeks / 2

Knutova transformacija transformira šumu stabala u jedno binarno stablo. Koraci koji

se primjenjuju su sljedeći:

1. povežu se korjeni svih stabala,

2. prekinu se sve veze između roditelja i djece osim krajnje lijeve veze,

3. povežu se sva djeca istog roditelja,

4. dobijena slika se rotira za 45 stupnjeva udesno.

3

Page 7: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Rekonstrukcija originalnog stabla:

pokazivač nalijevo je pokazivač na prvo dijete,

pokazivač na desno je pokazivač na brata.

Transformiše bilo koje stablo u striktno binarno stablo tako što se prekinu sve veze

između roditelja i djece osim krajnje lijeve veze, povežu se sva djeca istih roditelja i dobijena

slika se zarotira za 45 stupnjeva udesno.

3. STABLA BINARNOG PRETRAŽIVANJA2

Kod običnog binarnog stabla pretraživanje se zasniva na nekom od prolaza i ima O(n)

efikasnost. BST se zasniva se na ideji da se binarno stablo organizira tako da omogući

pretraživanje slično binarnom pretraživanju niza. BST je binarno stablo kod koga za svaki

čvor važe sljedeća 2 uslova:

1. svi čvorovi u lijevom podstablu imaju sadržaj koji je manji ili jednak sadžaju datog

čvora,

2. svi čvorovi u desnom podstablu imaju sadržaj koji je veći ili jednak sadžaju datog

čvora.

50

20 90

6030 95

55 80

Postupak pretraživanja BST:

ako je sadžaj korijena veći od traženog ključa onda se pretražuje lijevo podstablo

rekurzivno,

ako je sadžaj korijena manji od traženog ključa onda se pretražuje desno podstablo

rekurzivno,

ako je jednak po sadržaju onda je korijen traženi čvor.

2

4

50

20 90

6030 95

55 80

80

50

20 90

6030 95

55 80

8050

20 90

6030 95

55 80

80

50

20 90

6030 95

55 80

80

Page 8: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Nalaženje ključa je operacija po kojoj je struktura podataka binarno stablo pretrage

dobila ime. Potrebno je pronaći u stablu element sa zadatim ključem x. Broj x upoređuje se sa

ključem r korijena BSP. Ako je r = x onda je traženje završeno. Ako je pak x < r (odnosno x >

r) onda se traženje rekurzivno nastavlja u lijevom (odnosno desnom) podstablu.

Algoritam Nađi u BSP(Korijen; x);

Ulaz: Korijen (pokazivač na korijen BSP), x (broj).

Izlaz: Čvor (pokazivač na čvor koji sadrži ključ x, ili nil ako takvog čvora nema).

begin

if Korijen = nil or Korijen^.Ključ = x then Cvor := Korijen

{Koijren^ je slog čiju adresu sadrži pokazivač Korijen}

else

if x < Korijen^.Ključ then Nadji_u_BSP(Korijen^.Lijevi, x)

else Nadji_u_BSP(Korijen^.Desni, x)

end

Postupak ubacivanja u BST:

prvo se pretraži BST,

ubaci se novi čvor na mjesto nula pokazivača gdje se pretraživanje završilo.

Algoritam Umetni_u_BSP(Korijen, x);

5

50

20 90

6030 95

55 80

85

50

20 90

6030 95

55 80

85

50

20 90

6030 95

55 8085

50

20 90

6030 95

55 80

85

Page 9: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Ulaz: Korijen (pokazivač na korijen BSP), x (broj).

Izlaz: U BSP se umeće čvor sa ključem x na koga pokazuje pokazivač Sin;

ako već postoji čvor sa ključem x, onda Sin = nil.

begin

if Korijen = nil then

kreiraj novi čvor na koga pokazuje Sin;

Korijen: = Sin;

Korijen^.Ključ = x; Korijen^.lijevi := nil; Korijen^.Desni := nil;

else

Čvor := Korijen; {tekući čvor u stablu}

Sin := Korijen; {postavlja se na vrijednost različitu 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^.Lijevi

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^.Lijevi = nil; Sin^.Desni = nil;

if x < Otac^.Ključ then Otac^.Lijevi := Sin

else Otac^.Desni := Sin

end

Postupak izbacivanja iz BST:

Prvo se pretraži BST da bi se našao traženi čvor za izabacivanje zatim se nađeni čvor

izbucuje na način koji zavisi od njegove pozicije.

Moguće su tri situacije gde se nalazi čvor:

čvor je list,

čvor je polu-list (Ima samo jedno dijete),

čvor je unutrašnji (Ima oba djeteta).

6

Page 10: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Situacija 1: Čvor je list – prosto se izbaci čvor iz stabla i ažurira pokazivač njegovog

roditelja da sadrži null vrijednost.

Primjer: izbaciti 30

Situacija 2: Čvor je polu-list – izbaci čvor iz stabla, a pokazivač njegovog roditelja se

ažurira da sadrži pokazivač na dijete čvora koji se izbacuje.

Primjer: izbaciti 20

Situacija 3: Čvor je unutrašnji

Pronađe se njegov prvi sljedbenik (ili prethodnik) koji mora biti na krajnjoj lijevoj (tj.

desnoj) poziciji u desnom (tj. lijevom) podstablu. Sljedbenik (tj. prethodnik) mora biti

ili list ili polu-list.

Zamijeni se sadržaj sljedbenik (tj. prethodnik) sa sadržajem traženog čvora.

Izbacuje se čvor sa pozicije sljedbenika (tj. prethodnika). Ovo se svodi na slučajeve 1. i

2. izbacivanja.

Primjer: Izbaciti 90

7

50

20 90

6030 95

55 80

30

50

20 90

6030 95

55 80

50

20 90

60 95

55 80

50

20 90

6030 95

55 80

20

30 35

50

20 90

6030 95

55 8030 35

50

30 90

60 95

55 80

30 35

50

20 90

6030 95

55 80

90

50

20 90

6030 95

55 80

90

prethodnik

50

20 80

6030 95

55 90

Page 11: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Algoritam Ukloni iz BSP(Korijen; x);

Ulaz: Korijen (pokazivač na korijen BSP), x (broj).

Izlaz: Iz BSP se uklanja čvor sa ključem x, ako takav postoji.

{Pretpostavka je da se korijen nikad ne briše i da su svi ključevi različiti}

begin

{prva faza: traženje čvora sa ključem x}

Čvor := Korijen;

while Čvor ≠ nil and Čvor^.Ključ ≠ x do

Otac := Čvor;

if x <· Čvor^.Ključ then Čvor := Čvor^.Lijevi

else Čvor := Čvor^.Desni;

if Čvor = nil then print("x nije u BSP"); halt;

{brisanje nađenog čvora Čvor, ili njegovog prethodnika}

if Čvor ≠ Korijen then

if Čvor^.Lijevi = nil then

if x ≤ Otac^.Ključ then

Otac^.Lijevi := Čvor^.Desni

else Otac^.Desni := Čvor^.Desni

else if Čvor^.Desni = nil then

if x ≤ Otac^.Ključ then

Otac^.Lijevi := Čvor^.Lijevi

else Otac^.Desni := Čvor^.Lijevi

else {slučaj sa dva sina}

Čvor1 := Čvor^.Lijevi;

8

Page 12: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Otac1 := Čvor;

while Čvor1^.Desni i≠ nil do

Otac1 := Čvor1;

Čvor1 := Čvor1^.Desni;

{a sada brisanje; Čvor1 je prethodnik čvora Čvor}

Čvor^.Ključ:= Čvor1^.Ključ

if Otac1 = Čvor then {}

Otac1^.Lijevi := Čvor1^:Lijevi; {Čvor1 je lijevi sin čvora

Otac1}

else

Otac1^.Desni := Čvor1^:Lijevi; {Čvor1 je desni sin čvora

Otac1}

end

Efikasnost pretraživanja BST:

Ako je stablo dobro balansirano efikasnost je O(log n), a ako stablo nije balansirano,

tada je efikasnost lošija. Najgori slučaj je O(n) kada se ubacuje sortirani niz brojeva, BST se

degeneriše u listu.

4. PRETRAŽIVANJE, UMETANJE I BRISANJE IZ B-STABLA3

Traženje, umetanje i brisanje ključeva iz B-stabla ćemo prezentirati na primjeru

stabla koje sadrži slova engleske abecede kao ključeve i ima maksimalno tri ključa po čvoru.

U primjeru vršni čvor (root node) sadrži samo dva ključa (D i H) i ima troje djece. Dijete od D

sadrži ključeve koji su sortirani manji od D. Srednje dijete sadrži ključeve koji su između D i

H te desno dijete sadrži ključeve veće od H.

Slika 1 – B-stablo s maksimalno tri ključa po čvoru

3

9

Page 13: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

4.1. Pretraživanje B-Stabla4

Pretraživanje B-Stabla je slično pretraživanju bilo kojeg drugog stabla. Kreće se od

početnog čvora (root). Jedina razlika je u tome što algoritam mora izabrati između više djece

dok kod binarnog stabla se biralo između najviše dva djeteta.

Primjer: Pretraživanje stabla radi pronalaska ključa G.

Slika 2

Kreće se od početnog čvora (root node) te se slovo G upoređuje sa slovom D. Zbog

toga što je stablo sortirano uzlaznim redoslijedom slovo G je po vrijednosti veće od slova D,

pretraživanje nastavlja upoređivanjem sa sljedećim ključem a to je H.

Slika 3

Slovo G je vrijednosno manje od slova H stoga pretraživanje se nastavlja

upoređivanjem sa ključevima srednjeg djeteta, koji također sadrži tri ključa.

Slika 4

4

10

Page 14: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Zbog toga što je G > D i G < H ključ kojeg tražimo se nalazi u srednjem djetetu te

upoređivanjem slova G sa ključevima srednjeg djeteta nailazimo na ključ G. Tada

pretreživanje staje.

Slika 5

Iako smo prilikom pretraživanja imali 5 upoređivanja samo 2 čvora je trebalo prebaciti

u memoriju. Slično binarnom stablu broj prebacivanja je povezan sa visinom stabla. Međutim

zbog toga što B-Stablo može imati više od dva djeteta visina stabla je manja te samim time

imamo manje prebacivanja u primarnu memoriju te manje I/O operacija diska.

Pretraživanje B-Stabla je slično pretraživanju binarnog stabla dok je jedina razlika u

tome što je više djece pa moramo odlučiti gdje se granati. Na svakom unutrašnjem čvoru u

slučaju da čvor ima x djece imamo x + 1 odluka gdje se granati.

B-Tree metoda pretraživanja kao parametar uzima pokazivač na vršni čvor (root node)

podstabla i vrijednost koja se traži. Ako se tražena vrijednost nalazi u stablu tj. podstablu tada

metoda vraća par (y,i) gdje je y čvor te i je indeks na kojem se nalazi tražena vrijednost inače

vraća se NULL.

Metoda za pretraživanje B-Stabla:

B_tree_pretrazi(x, k)

{

i = 1;

while( i <= n[x] && k > keyi[x] )

{

i++;

if( i <= n[x] && k = keyi[x] )

return (x, i);

if ( leaf[x] )

return NULL;

11

Page 15: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

else

READ-DISK (ci[x]);

return B_tree_pretrazi( ci[x], k);

}

}

Kod pretraživanja B-Stabla broj stranica tj. sektora kojima se pristupa zavisi od visine

stabla h tj. složenost je O(h) = O(logt n). Broj n je broj ključeva u B-Stablu. Petlja se vrti u

zavisnosti koliko ključeva ima u čvoru te je procesorsko ukupno vrijeme O(th) = O(t logt n).

Pseudo kod pretraživanja B-Stabla:

Trenutni_cvor = root(T)

While Trenutni_cvor ! = NULL

Pretrazi kljuceve u Trenutni_cvor dok

1. pronađen k

2. Pronaden prvi kljuc (ki) veci od k ili

3. Dosegnut zadnji kljuc u Trenutni_cvor

Case 1.

return vrati pokazivac na Trenutni_cvor

Case 2.

Trenutni_cvor = i-ti kljuc u Trenutni_cvor

Case 3. Trenutni_cvor = zadnji kljuc od Trenutni_cvor

End While

return NULL

4.2. Umetanje ključa u B-Stablo5

Umetanje ključa u B-stablo također započinje početnim čvorom te pretražujemo stablo

dok ne nađemo određeni list. Kad ga pronađemo uvedemo novu vrijednost u sortiranom

redoslijedu.

5

12

Page 16: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Slika 6 – Umetanje slova L u stablo

Možemo primjetiti da nakon što umetnemo slovo L u stablo da desno dijete ima

ključeva više nego je dozvoljeno tj. posjeduje 4 ključa, a dozvoljeno je 3 ključa po čvoru.

Kada se to dogodi čvor se razbija na dva čvora te svaki od njih posjeduje polovinu ključeva.

Slika 7 – Razbijanje originalnog čvora na dva

Nakon što se navedeni čvor razbije na dva podjednako velika čvora srednji ključ iz

orginalnog se povlači na višu razinu i uspostavlja reference prema ostalim čvorovima u

sortiranom redoslijedu. U našem slučaju ključ J se povlači na višu razinu i uspostavlja

reference prema čvoru koji posjeduje K i L ključeve.

Slika 8 – Nakon povlačenja i uspostavljanja referenci

Na ovaj način je osigurano da stablo ne povećava visinu već da se širi. Naime stablo će

tek kada vršni čvor (root node) postane pun i bude potreba za razbijanjem vršnog čvora

povećati visinu za jedan.

13

Page 17: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Slika 9 – Stablo nakon što su slova M i N umetnuta

Slika 9 prikazuje stablo nakon što su slova M i N umetnuta. Prije slova N umetnuto je

slovo M. S obzirom da je stablo sortirano i krajnje desni čvor nije imao nego dva ključa slovo

M nije uzrokovalo razbijanje stabla tj. čvora. Nakon što se slovo N umetnulo iza M čvor je

tada imao nedozvoljen broj ključeva (4) te se navedeni čvor morao razbiti. Razbijanje čvora

(KLMN) se sprovelo tako da je slovo L koje je središnji ključ čvora popelo razinu više te

uzrokovalo da je sada vršni čvor nedozvoljene veličine. Vršni čvor se morao razbiti pa se

središnji ključ H popeo razinu više i postao vršni čvor (root node). Do sljededeg razbijanja

vršnog čvora potrebno je prebacivanje tri čvora u primarnu memoriju da bi se pronašao

odgovarajući ključ.

Umetanje (insert) ključeva u B-Stablo je mnogo komplikovanije od umetanja u binarno

stablo. Kod B-Stabla ne možemo jednostavno dodati novi list i umetnuti ga u stablo. Kod B-

Stabla (B-Trees) uvedemo novi ključ u postojeći list stabla. U slučaju da je list pun tj. da je

dosegnuta granica broja djece jednog čvora moramo pozvati metodu koja će prepoloviti

navedeni list te središnji ključ izvući u roditelja čvora. U slučaju da je i roditelj pun, poziva se

ista metoda nad tim roditeljem. Ako je stablo popunjeno poziva se metoda dok se ne dosegne

vršni čvor.

Split metoda B-Stabla kao argumente prima „nepuni“ unutrašnji čvor x, indeks i i čvor

y koji je popunjen. Metoda prepolovi dijete na dva dijela te organizira čvor x tako da ima još

jedno dijete. Da bismo prepolovili čvor moramo prije toga napraviti jedan prazan čvor u kojeg

ćemo smjestiti novo dijete. Pozivajući ovu metodu visina stabla se svakim pozivom povećava

za jedan.

Implementacija metode koja prepolovi dijete Y u dva dijela Y i Z te središnji ključ

izvuče u roditelja čije je dijete Y.

14

Page 18: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

B_tree_prepolovi_dijete(x, i, y)

{

z = allocate_node();

leaf[z] = leaf[y];

n[z] = t -1;

for( j = 1; j < t; j++)

{

keyj[z] = keyj+t[y];

if( !leaf[y] )

{

for( j = 1; j < t; j++)

{

Cj[z] = Cj+t[y];

}

n[y] = t – 1;

for ( j = n[x]; j > 0; j--)

{

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 dijete Y na indeksu i. Y sadrži 2t-1

djece tj. ključeva te se podijeli na dva dijela koja imaju po t-1 djece. Novo alociranom čvoru

(node) Z se dodjeli t-1 djece koji su po vrijednosti veći od djece Y-na. Z postaje novo djete

čvora X i pozicionira se po vrijednosti iza čvora Y. Središnje dijete čvora Y postaje novi ključ

15

Page 19: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

čvora X i služi da bi se odvojili Y i Z. Na kraju kad se izmjene čvorovi (nodes) X, Y i Z

navedeni se zapišu natrag na disk.

Metoda za umetanje ključa 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. Također metoda

koristi metodu B_tree_prepolovi_dijete(x, i, y) da bi se garantovalo da se rekurzija nikad ne

spusti do punog čvora.

Pseudo kod metode B_tree_prepolovi_dijete(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 unutrasnji

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 dijete Z u cvor X.

umetni orginalni sredisnji kljuc iz cvora Y u cvor X u odgovarajucem redoslijedu

uvecaj broj kljuceva u cvoru X za jedan.

spremi promjene 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_dijete (s, 1, r);

B_tree_insert_nonfull (s, k);

}

else

16

Page 20: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

{

B_tree_insert_nonfull (r, k);

}

}

U slučaju da je čvor r pun vršni čvor se podjeli na dva dijela te novi čvor s postaje

vršni čvor. Visina stabla se povećava za jedan. Metoda završava kad se pozove metoda za

umetanje ključa k u dijete čiji vršni čvor (root node) nije pun. Upravo zbog toga što se prvo

ispita da li vršni čvor sadrži onoliko djece koliko je dozvoljeno osigurano je da se uvijek novi

ključ unese.

Metoda B_tree_insert zapravo provjerava da li je vršni čvor pun te ako je napravi

mjesto za novi ključ dok metoda B_tree_insert_nonfull zapravo umeće novi ključ te se

pretpostavlja da ako je došlo do poziva ove metode vršni čvor nije pun.

B_tree_insert_nonfull(x, k)

{

i = n[x];

if ( leaf[x] )

{

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 ;

17

Page 21: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

}

i = i + 1;

READ_DISK(Ci[x]);

if ( n[Ci[x] == 2t – 1)

{

B_tree_prepolovi_dijete(x, i, Ci[x]);

if ( k > keyi[x] )

i = i + 1;

}

B_tree_insert_nonfull( Ci[x], k);

}

}

Prvi dio metode u slučaju da je x list stabla (leaf node) umeće ključ k u čvor x, ako x

nije list stabla tada se ključ k umeće u odgovarajući čvor u podstablu čvora x. Rekurzivno se

spuštamo do čvora gdje bi trebalo umetnuti ključ. Ako je odgovarajući čvor pun onda se

poziva metoda prepolovi dijete te se na odgovarajuće mjesto umeće ključ k.

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 između poziva

B_tree_insert_nonfull. Ukupno vrijeme procesora korišteno je O(t*logt n). Metoda

B_tree_insert_nofull je u primjeru napisana tako da se odvija rekurzija međutim moguće 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 ključa k u stablo T: B_tree_insert(T, k)

r = root[T]

Ako je vrsni čvor pun onda

Alociraj prostor za novi vor 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 dijete od s da pokazuje na r.

pozovi B_tree_prepolovi_dijete(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.

18

Page 22: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

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 dijete koje je vrsni

cvor podstabla u koje kljuc k treba umetnuti

Ako dijete je puno onda pozovi B_tree_prepolovi_dijete(x, i, Ci[x]) postavi i = indeks

djeteta od x koje je vrsni cvor podstabla u koje treba umetnuti k.

pozovi B_tree_insert_nonfull(ci[x], k) //rekurzivni poziv

end if

4.3. Brisanje iz B-Stabla6

Brisanje iz B-Stabla je komplikovanije nego pretraživanje ili umetanje jer uključuje

spajanje čvorova. Uzmimo primjer stabla sa prethodne slike te u slučaju da izbrišemo ključ K

iz njega stablo bi izgledalo ovako:

Slika 10 – Nakon brisanja ključa K iz stabla sa slike 8

Ovo stablo više nije valjano B-stablo jer nema srednjeg člana između ključeva J i L.

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

19

Page 23: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Da bismo popravili strukturu stabla potrebno je redistribuirati neke od ključeva. U ovom

slučaju ključ J se spušta u čvor koji sadrži ključ I tj. desno od ključa I jer se sortira po abecedi.

Slika 11 – Nakon popravljanja stabla

Ovo je bio jednostavan primjer, međutim šta se događa ako se izbrišu ključevi I i J?

Tada bi stablo izgledalo ovako:

Slika 12 – Nakon brisanja ključeva I i J iz stabla na prethodnoj slici

Ponovno je potrebno redistribuirati stablo. Vršni čvor H će se morati spustiti za razinu

niže što rezultira smanjivanjem visine stabla za jedan.

Brisanje ključeva iz B-Stabla je malo komplikovaanije nego umetanje jer ključ može

biti izbrisan iz bilo kog čvora u stablu te se djeca čvora moraju reorganizovati. Također se

mora voditi računa da nakon brisanja stablo ostane strukture kakva treba biti, moramo

osigurati provjeru da čvor nakon brisanja ključa ne ostane premalen tj. da ima manje od

minimuma zadanog broja ključeva (t – 1 ključ). Metoda kao argumente prima ključ kog treba

izbrisati iz podstabla čiji vršni čvor je x. Mora se osigurati reorganizacija stabla u slučaju da

čvor x nakon brisanja ima manje od t ključeva.

Pseudo kod metode B_tree_delete:

Ako je x list onda

Ako je k u x onda

20

Page 24: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

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

Z = X dijete koje sledi k

Ako Z ima najmanje t kljuceva

K' = k nasljednik

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

Zamjeni k1 u x sa k2 iz z

Pomakni zadnje/prvo dijete podstabla od z da bude prvo/zadnje dijete od c

Inace

21

Page 25: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

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 – AVL7

BST stablo kod koga za svaki čvor važi da se visina njegovog lijevog i desnog

podstabla ne razlikuje za više od 1 se naziva visinski balansirano stablo ili AVL stablo. AVL

stablo je dobilo ime po imenima naučnika Addison, Velsky i Landin koji su predložili ovakvo

stablo. Ovo stablo rješava problem najgoreg slučaja kod BST, pretraživanje 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 lijevo i na desno.

Rotacije na desno:

50

20 90

6030 95

A

B C

D 15 E F G

50

20

90

60

30

95

A

B

C

D 15

E

F G

Rotacije na lijevo:

50

20 90

6030 95

A

B C

D 15 E F G

50

20

90

60

30

95A

B

C

D 15 E

F

G

Balansiranje stabla:

Rotacije mijenjaju visinski balans stabla

Rotacija na desno povećava debalans u korist desnog podstabla

7

22

Page 26: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

Rotacija na lijevo povećava debalans u korist lijevog podstabla

Ovo se koristi kod algoritama za ubacivanje i izbacivanje

Kada operacija naruši visinski balans, tj. stvori se debalans na jednoj strani, primenjuje

se odgovarajuća rotacija da koriguje debalans

Rotacija je uvijek suprotna debalansu kako bi izjednačila balans.

Npr, ako je debalans na desno, koristi se lijeva rotacija i obrnuto

Ubacivanje u AVL stablo

1. Ubacuje se čvor na isti način kao u slučaju BST,

2. Provjeri se za svaki čvor u stablu njegov debalans, tj. razlika visina između lijevog i

desnog podstabla,

3. Ako postoji debalns, onda se vrši odgovarjuća rotacija oko čvora k koji je najbliži

mestu ubacivanja,

4. Ako je oznaka debalansa djeteta čvora k suprotna, onda se pre rotacije iz koraka 3, vrši

suprotna rotacija oko tog djeteta čvora k.

U ovom slučaju su potrebne dvije rotacije.

Ubacuje se broj 40:

50

20 90

3040

50

20 90

30

400

Debalans = Visina Levo – Visina Desno

-1

-20

-2

Potrebna jedna rotacija u levo oko 20

50

20 90

30 40

0

0

0

-1

0

Rezultat nakon rotacije

Ubacuje se broj 60:

50

20 90

30 4060

50

20 90

30 40 60

-1

00

0

0

0

Nema debalansa, nisu potrebne rotacije

Ubacuje se broj 70:

23

Page 27: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

50

20 90

30 40 60

-1

00

0

0

0

70

50

20 90

30 40 60

+2

00

0

-1

-1

Postoji debalans, suprotni znaci, potrebne 2 rotacije

700

2. rot

1. rot

• Nakon 1. rotacije

50

20 90

30 40

60

70

2. rot

• Nakon 2. rotacije

50

20

9030 40 60

70

Izbacivanje iz AVL stabla

Izbacivanje iz AVL stabla se vrši na sljedeći način:

1. Izbaci se čvor na isti način kao kod BST,

Postoje tri slučaja:

Čvor list – samo se izbaci

Čvor polu-list – preveže se dijete na roditelja

Čvor unutrašnji – vrši se zamjena sa prethodnikom (sljedbenikom) i svodi se na

prva dva slučaja

2. Provjeri se debalans i vrše potrebne (jedna ili dvije) rotacije kao i kod ubacivanja.

Izbacuje se broj 50

50

20 90

30 40 sledbenik

90

20 50

30 40 Izbacuje se kao list

24

Page 28: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

• Nakon izbacivanja 50

90

20

30 40

+2

0

0 0

Postoji debalans, potrebna 1 rotacija

90

20

30

40

+10

0

-1

• Nakon rotacije

25

Page 29: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

6. ZAKLJUČAK

Binarno stablo traženja (BST) o kome je govoreno u prethodnom dijelu rada se može

iskoristiti za implementaciju datoteke sa vrlo efikasnim pretraživanjem. Kao što smo vidjeli,

najefikasnije pretraživanje je onda kada je BST balansirano (svi listovi na istoj visini) tj.

jednako je visini stabla. Međutim problem nastaje zbog ubacivanja novih čvorova jer mogu

pokvariti balansiranost stabla što opet pogoršava efikasnost pretraživanja. Problem je rješen sa

AVL stablima koja odgovarajućim rotacijama balansiraju stablo.

B-Trees ili B-Stabla su algoritmi dizajnirani za manipulaciju podacima koji se nalaze

na diskovnim jedinicama, najčešće tvrdim diskovima. Jedina, a ujedno i najveća, prednost im

je što roditelj može imati više djece. Broj djece je ograničen samo karakteristikama diska tj.

veličinom sektora na disku. Ta zavisnost je proporcionalna tj. što je veći sektor roditelj može

posjedovati više djece te je obrnuto proporcionalno visini stabla. Naime što je veći broj djece

koja se mogu dodjeliti određenom roditelju manja je vjerovatnoća da će dolaziti do djeljenja

djeteta i povećanja visine stabla za jedan.

B-Trees algoritmi se najviše koriste kod baza podataka, prilikom kreiranja indeksa nad

tablicama. Pretraživanje je puno brže jer je potrebno u najgorem slučaju h čitanja s diska gdje

je veličina 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 pretraživanje podataka.

BST stablo kod koga za svaki čvor važi da se visina njegovog lijevog i desnog

podstabla ne razlikuje za više od 1 se naziva visinski balansirano stablo ili AVL stablo. AVL

stablo je dobilo ime po imenima naučnika Addison, Velsky i Landin koji su predložili ovakvo

stablo. Ovo stablo rješava problem najgoreg slučaja kod BST, pretraživanje 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 lijevo i na desno.

26

Page 30: 2015-03-19 17_09-iva-seminarski

Stabla binarnog pretraživanjaStabla binarnog pretraživanja

LITERATURA

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

2. www.etfbl.net/dokument.php/12314/1/B-stabla.ppt

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

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

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

27