You are on page 1of 21

Tijana Tali Algoritmi I strukture podataka - vjebe

Algoritmi i strukture podataka

Vjebe 1

Algoritam je tano definisana raunarska procedura koja pretpostavlja neke vrijednosti kao ulaz i
proizvodi neke vrijednosti kao izlaz.

Slijedi nekoliko osnovnih algoritama:

1. Zamjena vrijednosti dvije promjenljive

Ako su date dvije promjenljive, zamijeniti njihove vrijednosti tako da nova vrijednost svake
promjenljive bude stara vrijednost druge promjenljive.
Potrebna nam je pomodna promjenljiva koja de uvati staru vrijednost jedne od promjenljivih
prije nego to u tu promjenljivu upiemo vrijednost druge promjenljive.

Swap(x, y)
z=x;
x=y;
y=z;
return x, y;

2. Maksimalni element niza

Neka je dat niz od n elemenata: A = A(1), A(2), ..., A(n). Potrebno je nadi najvedi element u
tom nizu. Prvo pretpostavimo da je prvi element najvedi, a zatim provjeravamo sve ostale
elemente tako to ispitujemo da li je aktuelni element vedi od dosada pronaenog najvedeg
elementa. Ako jeste, taj element postaje najvedi element.

FindMax(A)
m = A(1);
j=1;
i=2;
while i<=n do
if m <A(i) then
m = A(i);
j = i;
i = i + 1;
return j;

1
Tijana Tali Algoritmi I strukture podataka - vjebe

3. Sortiranje niza

Navodimo nekoliko algoritam koji nam pokazuju kako da sortiramo niz od n elemenata u
neopadajudi poredak.

Bubble sort (sortiranje zamjenjivanjem)

Zamislimo da je dati niz postavljen vertikalno. Ideja algoritma se sastoji u tome da elementi
niza sa malim vrijednostima, tj. elementi koji su laki po teini isplivaju na vrh.
Prema ovom algoritmu, prolazimo vie puta kroz niz od dna ka vrhu. Ako dva susjedna
elementa nisu u dobrom poretku , tj. ako je element sa manjom vrijednodu ispod
zamjenjujemo im mjesta. Cilj algoritma je da se u prvom prolazu element koji ima najmanju
vrijednost penje na vrh. U drugom prolazu, drugi najmanji element se penje na drugo mjesto
itd.

Primjer:
i=1 i=2 i=3 i=4 i=5
15 6 6 6 6
13 15 8 8 8
25 13 15 12 12
8 25 13 15 13
12 8 25 13 15
6 12 12 25 25

Napomena: Crvenom bojom su oznaeni oni elementi niza koji su ved sortirani, dok su utom
bojom osijeneni elementi niza koji isplovljavaju navie.

Algoritam za Bubblessort na pseudo jeziku je:

BubbleSort (A)
for i = 1 to n-1 do
for j = n downto i + 1 do
if A(j) < A(j -1) then
Swap(A(j), A(j 1));
return A;

2
Tijana Tali Algoritmi I strukture podataka - vjebe

Sortiranje umetanjem (insertion sort)

Rad ovog algoritma se sastoji u tome da je poetni dio niza ved sortiran . U jednom prolasku
algoritam uzima prvi element iz nesortiranog dijela i umetne ga na pravo mjesto u
sortiranom dijelu pri emu dolazi do pomjeranja nekih elemenata za jedno mjesto., a duina
nesortiranog dijela se smanjuje za jedan.

Primjer:
Poetni niz: 20 5 17 4 3 35 22 37 39
Nakon 1. prolaska: 5 20 17 4 3 35 22 37 39
Nakon 2. prolaska: 5 17 20 4 3 35 22 37 39
Nakon 3. prolaska: 4 5 17 20 3 35 22 37 39
Nakon 4. prolaska: 3 4 5 17 20 35 22 37 39
Nakon 5. prolaska: 3 4 5 17 20 35 22 37 39
Nakon 6. prolaska: 3 4 5 17 20 22 35 37 39
Nakon 7. prolaska: 3 4 5 17 20 22 35 37 39

Napomena: utom bojom je oznaen prvi element iz nesortiranog dijela niza.

Algoritam za Insertion sort na pseudo jeziku je:

InsertSort(A)
A(0)=-
for i = 2 to n do
j = i;
while A(j) < A(j 1) do
Swap(A(j), A(j 1));
j = j 1;
return A;

Sortiranje izborom najmanjeg elementa (selection sort)

Algoritam radi tako to prolazi kroz niz i trai najmanji element. Kada nae najmanji element
zamijeni taj element sa poetnim. Dalje se posmatra ostatak niza bez poetnog elementa i
ponavlja se isti postupak.

Poetni niz: 25 15 4 30 2 12 34
Nakon 1. prolaska: 2 15 4 30 25 12 34
Nakon 2. prolasaka: 2 4 15 30 25 12 34
Nakon 3. prolaska: 2 4 12 30 25 15 34
Nakon 4. prolaska: 2 4 12 15 25 30 34
3
Tijana Tali Algoritmi I strukture podataka - vjebe

Nakon 5. prolaska: 2 4 12 15 25 30 34
Nakon 6. prolaska: 2 4 12 15 25 30 34

Napomena: Crvenom bojom je obiljeen sortirani dio niza u svakom prolasku, dok je utom
bojom oznaen najmanji element iz nesortiranog dijela niza.

Select-Sort(A)
for i = 1 to n-1 do
j = FindMin(A, i, n);
Swap(A(i), A(j));
return A;

4. Pretraga sortiranog niza

Sekvencijalna pretraga

Neka je dat niz od n elemenata u rastudem redoslijedu. Problem pretrage se sastoji u tome
da ispitamoo da li se vrijednost x koju traimo nalazi u datom nizu.

Algoritam sekvencijalne pretrage se sastoji u tome da se redom provjerava svaki element


niza A sve dok se ne doe do kraja niza ili se ne doe do elementa ija je vrijednost jednaka x.

SeqSearch(A,x)
j = 0;
i = 1;
while (i n) ( j 0) do
if A(i) = x then j = i;
i = i + 1;
return j;

4
Tijana Tali Algoritmi I strukture podataka - vjebe

Vjebe 2

Jednostruko povezane liste

Povezana lista pored svojstava da se lista moe dinamiki povedavati ili smanjivati, njenim
elementima se moe pristupiti ili joj se elementi mogu dodati ili ukloniti na svakom mjestu u listi.
Za razliku od niza kod koga je linearan poredak odreen na osnovu indeksa niza, poredak u listi je
odreen pokazivaem u svakom elementu. Pokazivaka promjenljiva pokazuje na memorijsku
lokaciju u kojoj se nalazi vrijednost objekta. Vrijednost pokazivake promjenljive je adresa
memorijske lokacije na kojoj je rezervisan prostor za smjetanje vrijednost dinamikog objekta.
Pri radu sa listama, pretpostavljamo postojanje pokazivaa NIL, koji ne pokazuje ni na jedan element.
Za broj elemenata n liste kaemo da je to veliina liste. Ako je n = 0 tada kaemo da je lista prazna.
Za i = 1, 2,...,n 1 kaemo da je xi prethodnik elementa xi+1 , a xi+1 je sljedbenik elementa xi. Prvi
element ili glava liste nema prethodnika, a posljednji element ili rep liste nema sljedbenika.
Svaki element liste predstavljamo jednim objektom koji sadri polje kljua key i pokazivako polje
next
Na primjer, key(x) i next(x) oznaavaju polja key i next onog elementa na koji pokazuje x i funkcije
koje kao rezultat daju vrijednosti kljua i pokazivaa koje se nalaze u poljima elementa na koji
pokazuje x.
Umjesto fraze pokaziva x koji pokazuje na neki element koristidemo frazu element x, znajudi da
je x pokaziva na neki element.

Slika1: Jednostruko povezana lista

1. Inicijalizacija povezane liste

Sljededi algoritam pravi praznu listu L.

ListMake(L)
head(L) = NIL;
return L;

5
Tijana Tali Algoritmi I strukture podataka - vjebe

2. Dodavanje elementa u povezanu listu

Ako je dat pokaziva na element x i pokaziva na element p liste L, sljededi algoritam dodaje
novi element x u L iza elementa p.

Slika 2: Dodavanje elementa u listu

Vidimo da element koji je bio sljedbenik elementa p postaje sljedbenik elementa x, a element
x postaje novi sljedbenik elementa p(Slika 2).

ListInsert(L,x,p)
next(x) = next(p);
next(p) = x;
return;

Sljededi algoritam dodaje neki element na poetak liste:

ListHeadInsert(L, x)
next(x) = head(L);
head(L) = x;
return;

3. Uklanjanje elementa iz liste

Sljededa dva algoritma pokazuju kako se brie element x liste L koji se nalazi iza elementa p i
kako se brie poetni element liste.

Uklanjanjem elementa x, element koji je bio sljedbenik elementa x postaje novi sljedbenik
elemnta p (Slika3). Procedura za uklanjanje elemnta iz liste vrada pokaziva na uklonjeni
element kako bi se oslobodili resursi koje taj elemnt zauzima.

6
Tijana Tali Algoritmi I strukture podataka - vjebe

Slika 3: Uklanjanje elementa iz liste

ListDelete(L,p)
x = next(p)
next(p) = next(x)
return x;

ListHeadDelete(L)
x = head(L);
head(L) = next(x);
return x;

4. Pretraga jednostruko povezane liste

Algoritam za pretragu jednostruko povezane liste pronalazi prvi element sa kljuem k u listi i
vrada pokaziva na taj element. Ako nije pronaen element sa kljuem k u listi vrada se
pokaziva NIL.

ListSearch(L, k)
x = head(L);
while ( x NIL) (key( x) k ) do
x=next(x);
return x;

7
Tijana Tali Algoritmi I strukture podataka - vjebe

Vjebe 3

Dvostruko povezana lista

Kod jednostruko povezanih listi, listu smo prelazili u jednom smjeru slijeva na desno. Dvostruko
povezanu listu prelazimo u oba smjera. U dvostruko povezanoj listi svaki element ima ima polje
kljua key i dva pokazivaka polja prev i next. Za element x prev(x) pokazuje na njegovog
prethodnika, a next(x) na njegovog sljedbenika. Ako je prev(x)=NIL, x nema prethodnika i to je prvi
element liste. Ako je L dvostruko povezana lista head(L) pokazuje na glavu liste.

1. Dodavanje elmenta u listu

Za razliku od jednostruko povezane liste u kojoj smo novi element x mogli dodti samo iza
elementa p, u dvostruko povezanoj listi novi element x moemo dodati i iza i ispred elementa
p.

Dodavanje elementa x iza elementa p u listu L

ListInsertAfter(L,p,x)
prew(x) = p;
next(x) = next(p);
if next(p)=NIL then
Last(L) = x
else
prev(next(p)) = x;

8
Tijana Tali Algoritmi I strukture podataka - vjebe

next(p) = x;
return;

Dodavanje elementa x ispred elementa p u listu L

ListInsertBefore(L, x, p)
prev(x) = prev(p);
next(x) = p;
if prev(p) = NIL then
head(L) = x
else
next(prev(p))=x;
prev(p) = x;
return;

Dodavanje elementa na poetak liste prethodno provjeravajudi da li je lista prazna

ListInsertBeginning(L, x)
if head(L) = NIL
head(L) = x
last(L) = x
prev(x) = NIL
next(x) = NIL
else
ListInsertBefore(L, head(L), x);
return;

9
Tijana Tali Algoritmi I strukture podataka - vjebe

2. ListDelete(L ,x)
if prev(x) = NIL
head(L) = next(x)
else
next(prev(x))=next(x);
if next(x) = NIL
last(L) = prev(x)
else
prev(next(x))=prev(x)

Stack

Stack je specijalna vrsta liste kod koje se dodavanje i uklanjanje elemenata vre na jednom kraju koje
se naziva vrh. Poredak elemenata po kojem se oni uklanjaju sa steka je obrnut poretku po kojem su ti
elementi dodati na stek.
Operacija dodavanja elementa u stek se naziva Push, a operacija uklanjanja elementa iz steka naziva
se Pop. Atributni objekat steka sadri polje name i polje top koje pokazuje na vrh steka.Stek od
najvie n elemenata moemo pretstaviti nizom A od n elemenata. Stek je identifikovan
promjenljivom S koja pokazuje na vrh steka, tj. na poziciju poslednjeg dodatog elementa.

Stek od najvise n elemenata, S pokazuje na vrh steka

10
Tijana Tali Algoritmi I strukture podataka - vjebe

Kada je S=0 kae se da je stek prazan. Da li je stek prazan moemo provjeriti sljededim algoritmom:

StackEmpty(S)
if S=0 then
return true
else
return false;

Ako pokuavamo da uklonimo element iz praznog steka kaemo da je dolo do


potkoraenja(underflow).

Kada je S = n tada je stek pun. Da li je stek pun provjeravamo sljededim algoritmom:

StackFull(S)
if S=n then
return true
else
return false;

Ako pokuamo da dodamo element na pun stek kaemo da je dolo do prekoraenje(overflow).

Algoritam koji pravi prazan stek:

StackMake(S)
S=0;
return S;

Algoritam koji dodaje element na stek:

Push(S, x)
if StackFull(S) then
return overflow
else
S=S+1;
A(S)=x;
return S;

11
Tijana Tali Algoritmi I strukture podataka - vjebe

Algoritam koji uklanja element iz steka:

Pop(S)
if StackEmpty(S) then
return underflow
else
x=A(S);
S=S-1;
return S, x;

12
Tijana Tali Algoritmi I strukture podataka - vjebe

Vjebe 4

Rekurzija

Rekurzija je procedura ili funkcija koja poziva samu sebe.

Primjer rekurzije:

faktorijel( n )
if ( n = 0 ) return 1;
else return (n * faktorijel( n-1 ))

Binarno stablo

Korijensko stablo se sastoji od skupa elemenata koji se nazivaju vorovi, i skupa parova razliitih
vorova koji su povezani linijama, koje se nazivaju grane. Jedan od vorova korijenskog stabla je
poseban po tome to oznaava korijen stabla i na crteima se obino prikazuje na vrhu hijerarhijske
strukture.
Svaki vor x osim korijena je povezan granom sa tano jednim vorom y koji se naziva roditelj vora
x.

Binarno stablo je stablo u kojem nijedan vor nema vie od dvoje djece. Ta djeca se zovu lijevo i
desno dijete. Drugim rijeima, binarno stablo je stablo u kojem svaki vor ili nema djecu, ili ima lijevo
dijete, ili ima desno dijete, ili ima i lijevo i desno dijete.
Binarno stablo je povezana struktura podataka u kojoj je svaki vor predstavljen jednim objektom koji
ima polje key, koje sadri klju vora, kao i dva pokazivaka polja left i right, koja pokazuju na objekte
koji predstavljaju lijevo i desno dijete vora.

Listanje vorova binarnog stabla .

BSInorder(t)
if t NIL then
BSInorder(left(t));
write(key(t));
BSInorder(right(t));
return;

13
Tijana Tali Algoritmi I strukture podataka - vjebe

Binarno stablo pretrage


Binarno stablo pretrage (BSP) je binarno stablo u kojem svaki vor x ima osobinu da su svi vorovi u
lijevom podstablu vora x imaju kljueve koji su manji od kljua vora x , a svi vorovi u desnom
podstablu vora x imaju kljueve koji su vedi od kljua vora x.

Slika 1: Binarno stablo pretrage

BSP operacije

Traenje vora

Pretpostavimo da traimo vor sa datim kljuem k. Polazimo od korijena stabla T. Ako je k jednak
kljuu korijena stabla, nali smo traeni vor i time je posao zavren.
Ako je k manje od klua korijena , prema BSP svojstvu k traimo u lijevom podstablu, a ako je k vede
od kljua korijena tada k traimo u desnom podstablu.

BSPSearch(t,k)
if (t = NIL) (k = key(t)) then
return t;
else
if k < key(t) then
return BSPSearch(left(t), k);
else
return BSPSearch(right(t),k);

14
Tijana Tali Algoritmi I strukture podataka - vjebe

Dodavanje vora

Dodajemo novi vor x u binarno stablo pretrage T.


Ako je T prazno stablo , ono postaje stablo koje se sastoji samo od novog vora x. Ako stablo T nije
prazno , a njegov korijen ima klju jednak kljuu vora x , tada se x ved nalazi u stablu i u tom sluaju
ne dodajemo duplikat. Ako stablo T nije prazno i njegov korijen nema isti klju kao vor x, vor x
dodajemo u lijevo podstablo korijena ako je njegov klju manji od kljua korijena, odnosno u desno
podstablo ako je njegov klju vedi od kljua korijena.

Slika 2: Dodavanje vora 23 u binarno stablo

Neka je dat t pokaziva na vor binarnog stabla pretrage i x pokaziva na novi vor.

BSPInsert(t,x)
if t = NIL then
t = x;
else if key(x) < key(t) then
left (t) = BSPInsert(lef(t), x)
else if key(x) > key(t) then
right(t) = BSPInsert(right(t),x);
else
return t;

15
Tijana Tali Algoritmi I strukture podataka - vjebe

Uklanjanje vora

Treba da uklonimo vor x iz stabla T. Posmatrademo sluajeve kada je vor x list stabla i kada se vor
x nalazi u unutranjosti stabla.
U sluaju da je vor x list stabla, moemo jednostavno ukloniti taj list.

Slika 3: Uklanjanje vora 3 iz Binarnog stabla

Ako je x unutranji vor stabla razlikujemo dva sluaja.


Ako vor x ima samo jedno dijete, vor x moemo zamijeniti tim djetetom.

Uklanjanje vora 20 iz binarnog stabla

16
Tijana Tali Algoritmi I strukture podataka - vjebe

U drugom sluaju , ako vor x ima dvoje djece, naemo najmanji vor y u desnom podstablu vora x i
zamjenjujemo vor x vorom y i uklanjamo vor y iz desnog podstabla.

Slika 4: Uklanjanje vora 17 iz binarnog stabla

Najprije demo navesti proceduru koja uklanja najmanji vor iz nepraznog podstabla sa korijenom t.
Ovaj vor se lako uklanja, poto on nema lijevo dijete.
BSPDeleteMin(t)
if left(t) = NIL then
d = t:
return right(t);
else
left(t) = BSPDeleteMin(left(t));
return t;

BSPDelete(t,k)
if t NIL then
if k < key(t) then
left(t) = BSPDelete(left(t), k);
else if k > key(t) then
right(t) = BSPDelete(right(t), k);
else
d = t;
if left(t) = NIL then
return right(t)
else if right(t) = NIL then
return left(t);
else
right(t) = BSPDeleteMin(right(t));
key(t) = key(d)
return t;
17
Tijana Tali Algoritmi I strukture podataka - vjebe

Vjebe 5
B -drvo

B drvo reda n +1 je struktura sa slijedeim karakteristikama:

1. Svaki vor u B-drvetu ima najvie n kljueva i n+1 djece.


2. Svaki vor (osim korijena) ima najmanje n div 2 kljueva.
3. vor sa k djece sadri k-1 klju

Slika 1

Ubacivanje podataka u B-drvo

Uvijek se ubacivanje novog podatka vri u list. Prvo se pronae stranica u kojoj bi, da postoji, taj
podatak nalazio. U sluaju da je broj podataka manji od n tada se jednostavno ubacivanje vri tako da
se novi podatak ubaci u list na mjesto gdje po vrijednosti kljua pripada.
Primjer: Ubacimo u prethodno drvo podatak 58. Vidimo da klju 58 moemo ubaciti samo u list D
izmeu kljueva 55 i 60.

Slika 2

U sluaju da je broj podataka jednak n (vor je pun) tada se vri djeljenje vora na dva vora a srednji
podatak se ubacuje u vor na viem nivou. Ubacimo u prethodno dobijeno stablo na slici 2 klju 62.
On bi po pravilu trebalo da doe u vor D. No meutim, vor D je pun pa dolazi do njegovog
cijepanja na dva vora D1 i D2, a srednji klju 60 prelazi u korijen A.
18
Tijana Tali Algoritmi I strukture podataka - vjebe

Slika 3

Brisanje podataka iz B drveta

Brisanje podataka iz B drveta je neto komplikovanije od ubacivanja ali se radi uvijek po istim
principima to jest trai se da osobine B drveta uvijek ostanu sauvane. Generalno uzevi mogue je
nekoliko sluajeva:

1. Brie se klju iz lista a pri tome broj vorova u listu ostaje vei ili jednak n div 2, klju se
jednostavno izbrie iz lista i to je najjednostavniji sluaj.
Iz stabla na slici 3 izbriimo klju 75. Poto minimalan broj kljueva u datom stablu mora biti
2, vidimo da brisanjem kljua 75 ne dolazi do potkoraenja i klju 75 jednostavno izbriemo.

Slika 4

2. Brie se klju iz lista ali u listu ostaje manje n div 2 kljueva.


U ovom sluaju ispitujemo lijevog i desnog brata. Ako brat sadri vie od n div 2 kljueva
tada se klju iz vora oca koji razdvaja dva lista brata spusti u vor iz koga se prethodno izbaci
eljeni klju, a klju brata (prvi ako uzimamo klju iz desnog brata, zadnji ako uzimamo klju
iz lijevog brata) se prebacuje u vor oca.

Izbriimo iz stabla na slici 4 klju 58. Brisanjem kjua 58 iz lista D1 dolazi do potkoraenja.
Gledamo da li lijevi ili desni brat lista D1 ima vie od n div 2 kljueva. Vidimo da list C, tj.
Lijevi brat lista D1 ima vie od n div 2 kljueva i klju 44 iz lista C prelazi u vor A umjesto
kljua 50, a klju 50 se sputa u list D1.

19
Tijana Tali Algoritmi I strukture podataka - vjebe

Slika 5

Meutim, moe se desiti da i lijevi i desni brat sadre tano n div 2 kljueva. U tom sluaju
vor iz kog izbacujemo klju i jedan od njegove brae se spajaju u jedan vor koji pored
njihovih kljueva sadri i klju iz oca koji je razdvajao vorove koje spajamo.

Izbacimo iz stabla na slici 5 klju 31. Vidimo da i lijevi i desni brat vora C iz kojeg
izbacujemo klju 31 sadre tano n div 2 kljueva. Spojiemo vor C sa njegovim lijevim
bratom vorom B, a klju 25 iz oca koji je razdvajao vorove B i C prelazi u novi vor B1 koji
je nastao spajanjem vorova B i C.

Slika 6

3. Brie se klju iz vora koji nije list. Tada se iz lijevog postabla uzima najvei klju ili se iz
desnog podstabla uzima najmanji klu i prenosi se u vor iz kojeg se brie klju. Nakon toga
se ispituje da li je popunjenost vora lista iz kojeg je uzet klu manji od n div 2 i ako jeste vri
se spajanje ili prelijevanje podataka.

Slika 7

Iz datog B-stabla na slici 7 izbrisati klju 44. Klju 44 iz vora A briemo tako to traimo
najvei klju iz lijevog brata ili najmanji klju iz desnog brata i stavljamo ga u vor A umjesto
20
Tijana Tali Algoritmi I strukture podataka - vjebe

kljua 44.

Slika 8

Zadatak:

1. Dato je B stablo kod koga je maksimalan broj kljueva 3:

25 50 70

6 15 31 38 44 55 66 75 85 90

U dato stablo ubaciti kljueve: 35, 60 i 80, a zatim iz dobijenog stabla izbaciti kljueve 35, 60,
70.

21

You might also like