You are on page 1of 5

Fakultet elektrotehnike i računarstva

Zavod za primjenjeno računarstvo

Napredni algoritmi i strukture podataka

1. laboratorijska vježba

Dorotea Vidak 0036495766

Zagreb, 8.11.2019.
1. Zadatak

Zadatak iz 1.laboratorijske vježbe koji pripada skupini zadataka za 17 bodova.


Napisati program koji učitava niz prirodnih brojeva iz ASCII datoteke (po
pretpostavci, datoteka nije prazna) i upisuje ih u (inicijalno prazno) AVL stablo
istim redoslijedom kao u datoteci. Program može biti konzolni ili s grafičkim
sučeljem, po vlastitom izboru. Konzolni program naziv ulazne datoteke treba
primiti prilikom pokretanja kao (jedini) argument s komandne linije, a grafički iz
odgovarajućeg sučelja po pokretanju programa. Nakon upisa svih podataka,
ispisati izgrađeno stablo na standardni izlaz (monitor). Program zatim treba
omogućiti dodavanje novih čvorova te nakon svake promjene treba ponovo
ispisati stablo. Dodatno potrebno je dodati brisanje čvorova iz stabla.

2. Rješenje zadatka

2.1. Teorijski uvod

AVL stablo je uravnoteženo binarno stablo koje zadovoljava AVL definicijsko


pravilo. AVL definicijsko pravilo propisuje faktor ravnoteže kojeg moraju zadovoljiti
svi čvorovi u stablu. Faktor ravnoteže definiran je razlikom visine desnog i lijevog
podstabla te može biti -1, 0 i 1 što zapravo znači da se visine podstabla nekog
čvora smiju razlikovati maksimalno za 1. Isto tako moguće je faktor ravnoteže
definirati na obratan način, ali je ova definicija uobičajena. Složenost osnovnih
operacija kao što su umetanje, dodavanje, brisanje i pretraživanje su O(logn),a u
najgorem slučaju je to 44% sporije od pretraživanja savršenog stabla. Problemi
dodavanja čvora i brisanje čvora svode se na pronalaženje mjesta za dodavanje
čvora, odnosno brisanje čvora i uravnoteživanje stabla. Proces uravnoteživanja
stabla podrazumijeva promjenu strukture stabla i ažuriranja iznosa faktora
ravnoteže. [1]

2.2. Implementacija

Zadatak je riješen preko izrade jednostavne web aplikacije koja korisniku nudi
opcije brisanje i dodavanje čvorova. Inicijalno se iz datoteke čitaju elementi te se
stvara početno AVL stablo nad kojim su onda omogućene promjene. Algoritam je
napisan u JavaScriptu te su korišteni Node.js i React kako bi se što jednostavnije
prikazalo izgrađeno stablo. Kao radno okruženje korišten je Visual Studio Code.
2.2.1. Dodavanje čvora u AVL stablo

Dodavanje novog čvora u stablo izvršava se rekurzivnim pozivanjem


funkcije dodaj(čvor ,element). Čvor se postavlja na prvo slobodno mjestu u
stablu tako da ako je element veći od elementa trenutnog čvora ide desno,
inače ide lijevo. Nakon postavljanja čvora potrebno je ažurirati iznose faktora
ravnoteže od umetnutog čvora prema korijenu. Pri nailasku na prvi čvor čiji
faktor ravnoteže odstupa od AVL definicije, potrebno je učiniti rotacije lijevo ili
desno ovisno o iznosima faktoru ravnoteže i ažurirati strukturu stabla. Postoje
4 slučaju od kojih su 2 i 2 simetrična.

Ako cvor == null onda


Cvor = novi cvor(element)
Vrati Cvor
Ako element < cvor.element onda
cvor.postaviLijevo(dodaj(cvor.lijevo, element))
Inace
cvor.postaviDesno(dodaj(cvor.desno, element))
AžurirajVisinu()
FR = FR(cvor)
Ako FR < -1 I element < cvor.lijevo.element onda
Cvor = Rotiraj u desno(cvor)
Vrati Cvor
Ako FR > 1 I element > cvor.desno.element onda
Cvor = Rotiraj u lijevo(cvor)
Vrati Cvor
Ako FR < -1 I element > cvor.lijevo.element onda
cvor.postaviLijevo(Rotiraj u lijevo(cvor.lijevo))
Cvor = Rotiraj u desno(cvor)
Vrati Cvor
Ako FR > 1 I element < cvor.desno.element onda
cvor.postaviDesno(Rotiraj u desno(cvor.desno))
Cvor = Rotiraj u lijevo(cvor)
Vrati Cvor
Vrati cvor
KRAJ

2.2.2. Rotiraj u desno (cvor y)

Cvor x = y.lijevo
Cvor T2 = x.desno
x.postaviDesno(y)
y.postaviLijevo(T2)
AzurirajVisine()
vrati x
KRAJ

2.2.3. Rotiraj u lijevo (cvor x)


Cvor y = x.desno
Cvor T2 = y.lijevo
y.postaviLijevo(x)
x.postaviDesno(T2)
AzurirajVisine()
vrati y
KRAJ
2.2.4. Brisanje čvora AVL stabla

Brisanje čvora iz AVL stabla izvršava se rekurzivnim pozivom funkcije


obriši(čvor, element), pri čemu se pronađeni čvor izbacuje iz stabla i ažurira se
struktura stabla prema određenim kriterijima. Ako čvor ima dvoje djece
potrebno je pronaći čvor s najmanjim elementom u desnom podstablu Ako je
čvor imao dvoje djece potrebno je pronaći čvor s najmanjim elementom u
desnom podstablu i postaviti njega na mjesto obrisanog čvora. Ako čvor nije
imao djece jednostavno se vrati vrijednost null, a ako je imao jedno dijete to
dijete dolazi na mjesto obrisanog. Nakon promjene strukture potrebno je
ponovno provesti provjeru ravnoteže i ažurirati FR sve od roditelja obrisanog
čvora prema korijenu. Postoje 3 različita opća slučaju što je zapravo 6
specifičnih slučajeva pri kojima je potrebna intervencija. Razliku čine samo
simetrije te su u pseudokodu opisana 4 slučaja zbog toga.

Ako cvor == null onda


Vrati cvor
Ako element < cvor.element onda
cvor.postaviLijevo(obrisi(cvor.lijevo, element))
Inace Ako element > cvor.element onda
cvor.postaviDesno(obrisi(cvor.desno, element))
Inace
Ako pronađeni cvor ima jedno ili nijedno dijete onda
Ako nema djece onda
temp = cvor
cvor = null
Ako ima dijete onda
temp = cvor.dijete
cvor = temp
Inace
temp = najmanjiCvorUDesnomPodstablu(cvor)
cvor.element = temp.element
cvor.postaviDesno(obrisi(cvor.desno, temp.element))
Ako cvor == null onda
Vrati cvor
AžurirajVisinu()
FR = FR(cvor)
Ako je FR < -1 I FR(cvor.lijevo) <= 0 onda
cvor = Rotiraj u desno(cvor)
Vrati cvor
Ako je FR < -1 I FR(cvor.lijevo) > 0 onda
cvor.postaviLijevo(Rotiraj u lijevo(cvor.lijevo))
cvor = Rotiraj u desno(cvor)
Vrati cvor
Ako je FR > 1 I FR(cvor.desno) <= 0 onda
cvor = Rotiraj u lijevoj(cvor)
Vrati cvor
Ako je FR > 1 I FR(cvor.desno) > 0 onda
cvor.postaviDesno(Rotiraj u desno(cvor.desno))
cvor = Rotiraj u lijevo(cvor)
Vrati cvor
Vrati cvor
KRAJ
3. Zaključak

Izradom AVL stabla i njegovih potrebnih operacija uočila sam jednostavnost i


brzinu izvršavanja operacija. AVL stabla se često uspoređuju s crveno-crnim stablima
zbog jednake složenosti operacija. AVL stabla pružaju bržu pretragu jer su strože
uravnotežena tj. dopuštaju manju razliku u visini dok zbog istog tog razloga crveno
crna stabla omogućuju brže dodavanje i brisanje čvorova jer se vrši manje rotacija.
AVL stabla koriste se u bazama podataka u kojima je potrebno brže pretraživanje
dok se crveno-crna koriste u većini jezičnih biblioteka poput mape, multimap, multiset
u C++ i sl.

4. Literatura
[1] Predavanja iz kolegija „Napredni algoritmi i strukture podataka“
[2] https://en.wikipedia.org/wiki/AVL_tree

You might also like