2015-03-19 17_09-iva-seminarski
DESCRIPTION
tnhnhTRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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