You are on page 1of 102

Algoritmi i strukture podataka (2+1+1

)
Literatura:

1. Dovedan: Pascal i programiranje, ZOTK, Ljubljana, 1989.

2. Budin: Informatika 2, Element, Zagreb, 1998.

3. Lipschutz: Theory and Problems of Data Structures, Mc Graw Hill,
1986.

4. Knuth: The Art of Computer Programming, Vol. 1. Fundamental
Algorithms, Vol. 2. Seminumerical Algorithms,
Addison Wesley, 1997.

5. Lipschutz, Lipson: Discrete Mathematics, Mc Graw Hill,New York
1997.
Sadrţaj predmeta:


1. Osnovni pojmovi
2. Elementarni podaci
3. Sluĉajni brojevi
4. Linearne strukture
a) Vektori i matrice
b) Stogovi
c) Redovi
5. Nelinearne strukture
a) Stabla
b) Grafovi
6. Rekurzije
1. Osnovni pojmovi:
Algoritam (po Muhammad ibn Musa al-Kwarizm):
opis postupka koji nakon konaĉnog broja radnji
daje suvisli rezultat .

Alogoritam je i dio posla u procesu koji od uoĉenog problema dovodi
do rezultata (najĉešće pomoću raĉunalnog programa).

Slijed poslova:
Fizikalna Matemati- ALGO- Struktura Raĉunalni
stvarnost ĉki model RITAM podataka program
}
H
Pdp
Ponavljati..
................
Sve dok..
do{
S/= V[i++];
}while...
Primjer: Raskršće “Đakovština” (prije rekonstrukcije)
C
D
A B
E
F
G
H I
AH
CE
DF BI
AG
Fizikalna stvarnost Matematiĉki model
C
D
A B
E
F
G
H I
AH
CE
FD IB
AG
5555
2.
3.
5.
1. 4.
Pohlepni algoritam - nalazi jedno od rješenja koje ne mora biti
optimalno
“Pohlepni” algoritam obojat će graf s tri boje, iako je moguće
koristiti samo dvije.
1.
5.
3.
4.
2.
Algoritam bojanja grafa:
Boja=1
Sve dok graf nije obojan
Obavljaj bojanje(Boja)
Povećaj Boja za 1
Kraj sve dok
Algoritam procedure bojanje (Boja)
/*Neobojane ĉvorove ĉiji susjedi nisu obojani bojom Boja
obojaj bojom Boja*/
Stavi 0 u sve elemente vektora Obojani[]
NaĊi neobojani ĉvor i
Postavi Obojani[1]=i
Postavi nb=1
Naznaĉi da je i-ti ĉvor obojan bojom Boja
Za svaki ĉvor j grafa ĉiniti
Ako je ĉvor j neobojan i njegovi susjedi nisu u vektoru
Obojani[] postavi boju ĉvora j na Boja

2. Elementarni podaci
a) Znakovi

8 bitni ASCII kod definira 256 znaka (kontrolni i grafiĉki - vidljivi)


Dec Hex Char
0 00 Nul
1 01 SOH
..........................
32 20 (blank)
.............................
65 41 A
............................
97 61 a
.............................
159 9F
ĉ
Problem specijalnih
“nacionalnih” znakova
(u hrvatskom ĈĆĐŠŢ).
Rješenje: Kodna stranica
(Code Page - CP)

Npr. CP 852
Ĉ 172 ĉ 159
Ć 143 ć 134
Đ 209 Ċ 208
Š 230 š 231
Ţ 166 ţ 167
b) Brojevi

A) Cijeli brojevi

Pozicioni brojni sustav

Definirano: Baza B i znamenke d
i
s vrijednostima [0,B-1]
Broj N napisan nizom od n znamenaka d
n-1
,d
n-2
,...

,d
2
,d
1
,d
0

ima vrijednost

N=


Kod za cijele brojeve definira pomoću bitova (znamenaka 0 i 1)
pozitivne i negativne brojeve. Negativni brojevi definirani su preko
dualnog komplementa
¿
÷
=
-
1
0
n
i
i
i B d
Komplement broja u pozicionom sustavu s bazom B definiran je kao:

komp(N)=B
n
-N | B
n
> N

Komplementiranje binarnog broja (B=2) zove se dualno
komplementiranje. Obavlja se u dva koraka:
1. Unarno kompementirati broj (0->1 i 1->0)
2. Aritmetiĉki dodati 1

DOKAZ: komp(N)= 2
n
- =2
n
- =



= 2
n
+ = 2
n
+ - =



= 2
n
+ -2
n
+1= +1


¿
÷
=
·
1
0
2
n
i
i
i
b
¿
÷
=
· + ÷
1
0
2 ) 1 1 (
n
i
i
i
b
¿
÷
=
1
0
2
n
i
i
¿
÷
=
· ÷
1
0
2 ) 1 (
n
i
i
i
b
¿
÷
=
· ÷ ÷
1
0
2 ) 1 1 (
n
i
i
i
b
¿
÷
=
· ÷
1
0
2 ) 1 (
n
i
i
i
b
¿
÷
=
· ÷
1
0
2 ) 1 (
n
i
i
i
b
Algoritam binarnog komplementiranja (broj je u vetoru V[] od 16
bitova)

Za svaki i=0 do 15 ĉiniti
Ako je V[i]=1 postaviti V[i]=0
U suprotnom postaviti V[i] = 1
Kraj za svaki i
Postaviti i=0
Ponavljati
Ako je V[i]=1 postaviti V[i]=0
U suprotnom postaviti V[i] = 1
Povećati i za 1
Sve dok je V[i-1]=0


B) Realni (Real, float)
31 30 29 28 27 26 25 24 23 22 21 .............. 2 1 0
Predznak: 0 +
1 -
Karakteristika: k=E+128
Eksponent E=k-128
E
min
=-128 ->x
min
=2
-128
=10
-38

E
max
= 127 -> x
max
=2
128
=10
38


Mantisa: 0.5<m<1
x=2
E
*m
Pogreške u aritmetici kliznog zareza
Najĉešće uslijed konaĉnog broja binarnih (dekaskih) znamenaka u mantisi (24 binarne
znamenke daju 7 toĉnih dekadskih znameki:
Primjer : Raĉunanje broja t Ludolfovom metodom:
S
n
S
n+1
l
n
2
= S
2
n+1
-(S
n
/2)
2

(1-l
n
)
2
= 1-(s
n
/2)
2



S
n+1
= 2- 4-(S
n
/2)
2

Prilago-
Ċeno za S
n+1
= S
n
/ 2 + 4-S
n
2

numeriĉki
raĉun:
l
n
Za opisane mnogokutnike: T
n+1
=2T
n
/( 4+T
n
2
+2)

Za i-tu iteraciju je t=2
i-1
S
i
Poĉetno je (za upisani i opisani kvadrat) S= 2, T=2

Algoritam “Ludolf”

Postaviti S=1.41 T=2
Uĉitati broj iteracija k
Za svaki i = 2 do k ĉiniti
Postaviti t
s
=2
i-1
*S
Postaviti t
t
=2
i-1
*T
Ispisati t
s
i

t
t

Postaviti S= S/ 2 + 4-S
2

Postaviti T= 2T/( 4+T
2
+2)
Kraj iteracije po i
r=1
T
S
Raĉunanje broja t (2)
Raĉunanje broja t; Rezultati: (3)
Iter. Pi(pogr) Pi(upis) Pi(Opis)

2 2.8284271 2.8284271 4.0000000
3 3.0614674 3.0614674 3.3137085
4 3.1214452 3.1214452 3.1825979
5 3.1365485 3.1365485 3.1517248
6 3.1403313 3.1403313 3.1441183
7 3.1412773 3.1412773 3.1422236
8 3.1415138 3.1415138 3.1417503
9 3.1415730 3.1415730 3.1416321
10 3.1415877 3.1415876 3.1416025
11 3.1415915 3.1415915 3.1415951
12 3.1415925 3.1415925 3.1415932
13 3.1415927 3.1415927 3.1415927
................................
................................
28 3.1622777 3.1415927 3.1415927
29 2.8284271 3.1415927 3.1415927
30 0.0000000 3.1415927 3.1415927
31 0.0000000 3.1415927 3.1415927
3. Sluĉajni brojevi


Niz brojeva u kojem je svaki ĉlan nezavisan od prethodnih je niz
sluĉajnih brojeva (engl. Random Numbers). Programski jezici obiĉno
sadrţe funkciju koja generira jednoliko raspodjeljene (npr. RND,
random).

Brojevi su jednoliko rasporeĊeni (distribuirani) u definiranom
intervalu, ako su vjerojatnosti pojavljivanja, u bilo kojem podintervalu
iste širine Ax, meĊusobno jednake.


0 1 2 3 4 5 Razredi
R f[r] fr[r] %

0 1006 16.77
1 978 16.30
2 1000 16.67
3 1034 17.23
4 995 16.58
5 987 16.45
Uk: 6000 100,00
Frekvencije
Sluĉajni brojevi (2)

Tablica i histogram jednolikih sluĉajnih brojeva iz inervala [0,1)
s podintervalima (razredima) širine 1/6 (generirano 6000 brojeva):
Sluĉajni brojevi (3)

Linearna transformacija jednolike varijable u iz intervala [0,1)
u jednoliku varijablu x u intervalu [x1,x2)
0
1
x1
x2
u
x
x=x1+(x2-x1)*u
Sluĉajni brojevi (4)

Algoritam “Histogram”:
Generirati m jednoliko raspodijeljenih sluĉajnih brojeva u intervalu
[x1,x2) i razvrstati ih u histogram s n razreda jednake širine sr.

Uĉitati m, n, x1 i x2
Za svaki i=0 do n-1 postaviti Hist[i]=0
Postaviti sr=(x2-x1)/n
Za svaki i=1 do m ĉiniti
Generirati x=x1+(x2-x1)*u
Postaviti k=(x-x1)/sr
Povećati Hist[k] za 1
Kraj iteracije
Za svaki i=0 do n ispisati Hist[i]
Sluĉajni brojevi (5)

Nejednolika raspodjela:
1. Diskretna: p
0
,p
1
,..p
i
...p
n-1
su vjerojatnosti pojavljivanja varijable x u
razredu i.
1
1
0
=
¿
÷
=
n
i
i p
0 p
0
p
1
p
i
p
n-1
1
<=x<
¿
÷
=
1
0
i
j
j p
¿
=
i
j
j p
0
1
x
i
u
k
1
u
F(x)=
x
}
x
x
dx x f
1
) (
x1 x(u) x2
Sluĉajni brojevi (5)
Nejednolika raspodjela:

2 . Kontinuirana
x(u)=F
-1
(u)
Sluĉajni brojevi (6)
Primjeri kontinuirane razdiobe:

1. Normalna: f(x)=

o
µ
t o
2
) (
2
2
1
÷
÷
x
e
F(x)=?, F
-1
(u)=?
µ t o + · · · ÷ · = ) 2 cos( ) 1 ln( 2 u u x
x
f(x)
µ
Sluĉajni brojevi (7)
2. Eksponencijalna razdioba: f(x)= oe
-ox
| 0<x<
F(x)=1-e
-ox

x= - 1/o ln(1-u) x= - 1/o ln(u)
·
1
F(x), F(x)
o
x
u
Rezultati simulacije
Histogram slucajnih brojeva je:
r dg(r) gg(r) H(r) Teor. vr.

0 (0.00 - 1.67) 0. 621 0. 632
1 (1.67 - 3.33) 0.250 0.232
2 (3.33 - 5.00) 0.083 0.85
3 (5.00 - 6.67) 0.029 0. 31
4 (6.67 - 8.33) 0.007 0. 11
5 (8.33 - 10.00) 0.007 0. 4
4. Linearne strukture

4.1 Vektori i matrice:

4.1.1 Vektori: “jednodimenzionalna” linearna
struktura podataka. Svi ĉlanovi su istog tipa.
V[]
V[0]
V[1]
V[i]
V[n-1]
Algoritmi s vektorima:
a) Pretraţivanja: Za zadani podatak X naći da li se on
nalazi u skupu V[] i na kojem mjestu.

a.1) Sekvencijelno pretraţivanje.
Postaviti i=0
Sve dok je V[i]!=X i i<n-1 povećati i za 1.
Ako je i<n naznaĉiti da je X na i-tom mjestu.
U suprotnom naznaĉiti da i nije u skupu V.
a2) Binarno pretraţivanje: Skup je ureĊen (V[i]<=V[i+1] za i=(0,n-2) )
dg=0 s=(dg+gg)/2 gg=n-1

Postaviti dg=0,
Postaviti gg=n-1
Ponavljati
Postaviti s=(dg+gg)/2
Ako je X>V[s] postaviti dg=s+1;
Ako je X<V[s] postaviti gg=s-1;
Do uvjeta V[s]=X ili gg=dg
Ako je V[s]=X naznaĉitida je X na s-tom mjestu u skupu.
U suprotnom naznaĉiti da X nije u skupu

Algoritam “Iduća permutacija”

Zadan je vektor V od n elemenata u kojem je poĉetno V[i]=i. To je prva
permutacija podataka u V. Zadnja permutacija od (ukupno n!) je takva
da je V[i]=n-1-i. Ako je zadana neka m-ta permutacija, naći m+1.
permurtaciju.

Primjer: P
0
= 0 1 2 3 4 5

P
m
= 0 1 2 5 4 3
Naći P
m+1
(P
m+1
= 0 1 3 2 4 5 )



Rješenje:


Naći najveći i za koji vrijedi V[i]<V[i+1] (Procedura Nadji_i)
Naći i < j < n tako da je V[j] najmanja vrijednost uz uvjet
V[j]>V[i] (Procedura Nadji_j)
Zamijeniti V[j] s V[i]
Poredati elemente V[k] , k>i u rastućem redoslijedu

Algoritam procedure “Nadji_i”

Postaviti i=n-1
Sve dok je V[i-1]<V[i] smanjiti i za 1
Smanjiti i za 1

Algoritam procedure “Nadji_j”

Postaviti j=i+1
Za svaki k=i+1 do n-1 ĉiniti
Ako je V[k]>V[i] i V[k]<V[j] postaviti j=k
2. Matrice
a) Magiĉni kvadrati neparnog reda:
Saĉiniti kvadratnu matricu A neparnog reda m popunjenu brojevima
[1,m
2
] tako da sume svih redaka i stupaca i obiju dijagonala
budu meĊusobno jednake (i jednake (1+m
2
)*m/2).
PRIMJER za m=5

05
04 10
03 09 15 03 16 09 22 15
02 08 14 20 20 08 21 14 02
01 07 13 19 25 07 25 13 01 19
06 12 18 24 24 12 05 18 06
11 17 23 11 04 17 10 23
16 22
21

Slika a Slika b



Algoritam “Magiĉni kvadrat”

Uĉitati m /* m mora biti neparan*/

/* Popuniti matricu prema slici a procedurom Popuni */
Pozvati proceduru Popuni(A[][],m)

/* Obaviti prebacivanja u matrici da bi se dobila slika b */
Pozvati proceduru Prebaci(A[][],m,”lijevo”)
Pozvati proceduru Prebaci(A[][],m,”desno”)
Pozvati proceduru Prebaci(A[][],m,”gore”)
Pozvati proceduru Prebaci(A[][],m,”dolje”)

/*Ispisati matricu A od m/2 do m/2+m-1 procedurom Ispis*/
Pozvati proceduru Ispis(A[][],m)



Algoritam procedure “Popuni”

Za svaki i=0 do 2*m-2 ĉiniti
Za svaki j=0 do 2*m-2 postaviti A[i][j]=0
Postaviti i=m-1 /*Poĉni od srednjeg reda */
Postaviti j=0 /* Poĉni od lijevog stupca */
Postaviti n=1
Sve dok je n<=m*m ĉiniti
Postaviti A[i][j]=n
Smanjiti i za 1 /* Kreni red gore */
Povećati j za 1 /* Kreni stupac u desno */
Povećati n za 1 /* Idući broj u matrici */
Ako je n-1 djeljivo s m ĉiniti
Povećati i za m+1 /* Ponovo poĉni red niţe...*/
Smanjiti j za m-1 /* .. i stupac dalje */
Kraj ako je
Kraj sve dok
Algoritam procedure “Prebaci(A[][],m,”desno”)”

Za svaki j=0 do m/2-1 ĉiniti
Za svaki i=0 do 2*m-2 ĉiniti
Ako je A[i][j]!=0 postaviti A[i+m][j]=A[i][j]


Procedure prebacivanja u ostalim smjerovima su analogne ovoj

b) Inveriranje matrice Gaussovom metodom:

A*A
-1
= I
X
1
*A*A
-1
= X
1
*I
X
2
*X
1
*A*A
-1
= X
2
*X
1
*I
X
3
*X
2
*X
1
*A*A
-1
= X
3
*X
2
*X
1
*I
X
n
*..X
3
*X
2
*X
1
*A*A
-1
= X
n
*..X
3
*X
2
*X
1
*I

Ako X
n
*..X
3
*X
2
*X
1
*A postane I onda lijeva je strana jednaka I*A
-1
tj.
A
-1
, pa je tome jednaka i desna strana: Ako se nizom transformacija
(što odgovara mnoţenju s X
i
) poĉetna matrica pretvori u jediniĉnu, tim
istim transformacijama se jediniĉna pretvori u inverznu!


X
n
*..X
3
*X
2
*X
1
*A*A
-1
= X
n
*..X
3
*X
2
*X
1
*I

Algoritam “INVMAT”

Uĉitati m
Uĉitati matricu A[m][m]
Formirati jediniĉnu matricu I u stupcima m do 2*m-1 matrice A
(A postaje tkzv. blok matrica)
Postaviti d=1
Postaviti i=0
Sve dok je i<m-1 i d!=0 ĉiniti
Ako je A[i][i]=0 pozvati proceduru Zamjena(i,d)
Ako je d!=0 pozvati proceduru Redukcija(i,d)
Kraj sve dok
Pozvati proceduru Ispis(d)
Algoritam procedure “Zamjena(i,d)”

Za svaki k=i+1 do m-1 ĉiniti
Ako je A[k][i]!=0 onda ĉiniti
Za svaki j=i do 2*m-1 ĉiniti
Postaviti t=A[k][j]
Postaviti A[k][j]=A[k][i]
Postaviti A[k][i]=t
Kraj za svaki j
Postaviti d = - d
Vratiti se u pozivajuću proceduru
Kraj ako je
Kraj za svaki k
Postaviti d = 0

(Napomena: Zamjena sadrţaja dviju numeriĉkih varijabli x i y
moţe se obaviti i ovako: x=y-x; y=y-x; x=x+y;)

Algoritam procedure “Redukcija(i,d)”

Pomnoţiti d s A[i][i]
Za svaki j=2*m-1 do i s korakom -1 podijeliti A[i][j] s A[i][i]
Za svaki k=0 do m-1 i k!=i
Za svaki j=2*m-1 do i s korakom -1
smanjiti A[k][j] za A[i][j]*A[k][i]

4.2 Stogovi

Stog se sastoji od vektora V[]od n elemenata i pokazivaĉa stoga Sp.
Pokazivaĉ stoga ima vrijednost indeksa zadnjeg popunjenog elementa
u vektoru V.
Popunjeni
dio stoga
Prazni dio
stoga
Pokazivaĉ stoga
Sp=3

5
4
3
2
1
0

Stog je prazan ako je Sp = -1
Stog je pun ako je Sp=n-1
Stog se “puni” i “prazni” na “vrhu”. Podatak koji je zadnji stavljen na
stog, bit će prvi skinut sa stoga (LIFO - Last In - First out)
Stavljenje na stog obavlja procedure Push
Skidanje sa stoga obavlja procedura Pop
Funkcija “Prazan_stog” Funkcija “Pun_stog”
Ako je Sp= - 1 vratiti 1 (True) Ako je Sp=n-1 vratiti 1 (True)
U suprotnom vratiti 0 (False) U suprotnom vratiti 0 (False)


Procedura Push Procedura Pop
/* Stavi x na stog */ /* Skini podatak sa stoga i
Ako je Pun_stog javiti pogrešku stavi ga u x */
U suprotnom Ako je Prazan_stog javiti pogrešku
Povećati Sp za 1 U suprotnom
Postaviti V[Sp]=x Postaviti x=V[Sp]
Kraj u suprotnom Smanjiti Sp za 1
Kraj u suprotnom
Procedura Oĉisti_stog
Postaviti Sp= - 1

Algoritam “Putna torba”

Zadan je skup od n prirodnih brojeva Tezine i prirodni broj T. Naći bilo
koji podskup Torba skupa Tezine tako da zbroj elemenata u Torba bude
jednak T. Ako takvog podskupa nema, ispisati odgovarajuću poruku.
Procedura Torba
Oĉisti_stog
Ponavljati
Ako je uk_tez=T postaviti rjes=1
U suprotnom
Ako je uk_tez<T i pred <n onda pozvati proceduru u_torbu
U suprotnom
Pozvati proceduru iz_torbe
Ako je pred<n pozvati proceduru u_torbu
Kraj u suprotnom
Kraj u suprotnom
sve dok nije rjes i nije prazan_stog
Procedura u_torbu
Povećati pred za 1
Povećati uk_tez za Tezine[pred]
Pozvati proceduru push(pred)

Procedura iz_torbe
Pozvati proceduru pop(pred)
Smanjiti uk_tez za Tezine[pred]

Glavni program Putna_torba
Postaviti rjes=0, uk_tez=0 i pred=0
Uĉitati T i n
Za svaki i=1 do n uĉitati Tezine[i]
Pozvati proceduru Torba
Ako je rješenje nadjeno
Za svaki i=0 do pred-1 ispisati Tezine[predmeti[i]]
U suprotnom ispisati poruku da nema rješenja
Algoritam “Povrh”

1
0
, 1
1
, 1 ;
1
1
1
= = =
÷
+
÷
÷
=
|
|
.
|

\
|
|
|
.
|

\
|
|
|
.
|

\
|
|
|
.
|

\
|
|
|
.
|

\
|
|
|
.
|

\
| k
k k
k
m
n
m
n
m
n
Isprazniti stogove s1 i s2
Staviti n na stog s1
Staviti m na stog s2
Postaviti Povrh=0
Ponavljati
Skinuti n sa stoga s1
Skinuti m sa stoga s2
Ako je m=n ili n=1 ili m=0 povećati Povrh za 1
U suprotnom
Staviti n-1 na stog s1
Staviti m-1 na stog s2
Staviti n-1 na stog s1
Staviti m na stog s2
do praznog stoga s1
Ispisati Povrh
Algoritam “Quick sort”
Zadani skup brojeva u vektoru A[ ] poredati po rastućem redoslijedu.
Postupak: 1. Naći konaĉno mjesto m prvog ĉlana skupa (tako da
su lijevo od njega svi manji a desno svi veći ĉlanovi)
2. Ponavljati taj postupak s podskupovima lijevo i desno
od m. Granice podskupova stavljati na stog.
1. Algoritam Nadji_m (dg,gg)
/*dg je donja a gg gornja granica u A[] unutar kojih se traţi m*/
7 9 12 19 31 15 25
7 9 15 19 31 12 25
12 9 15 19 31 7 25
A[m]>A[g]
A[d]>A[m]
Ponavljati
Postaviti m=dg
Sve dok je A[gg]>A[m] i gg<>m smanjiti gg za 1
Ako je gg=m vratiti m
Zamijeniti A[m] i A[gg]
Postaviti m=gg
Sve dok je A[dg]<A[m] i dg<>m povećati dg za 1
Ako je dg=m vratiti m
Zamijeniti A[m] i A[dg]
Do beskonaĉnosti
Algoritam Quick

Uĉitati broj podataka n i n podataka u vektor A[]
Staviti 0 na stog
Staviti n-1 na stog
Ponavljati
Skinuti g sa stoga
Skinuti d sa stoga
Postaviti m=Nadji_m(d,g)
Ako je d<m-1 onda
Staviti d na stog
Staviti m-1 na stog
Kraj ako je
Ako je g>m+1 onda
Staviti m+1 na stog
Staviti g na stog
Kraj ako je
Do praznog stoga
4.3 Redovi (engl. Queue)

Red se sastoji od vektora V[]od n elemenata, pokazivaĉa na poĉetak
(izlaz) reda iz te pokazivaĉa na kraj (ulaz) reda ul. Pokazivaĉ iz pokazuje
na prvi element koji treba izaći iz reda (ako takvog ima tj. ako red nije
prazan). Pokazivaĉ ul pokazuje na prvo slobodno mjesto u redu (ako
takvog ima tj. ako red nije pun). Podatak koji je prvi ušao u red prvi će
i izaći iz reda (FIFO -First in, first out naĉelo). Postoje konaĉni i cikliĉki
redovi.

4.3.1 Konaĉni red
0 n-1
iz ul
V
Funkcija “Prazan_red” Funkcija “Pun_red”
Ako je ul= iz-1 vratiti 1 (True) Ako je ul=n-1 vratiti 1 (True)
U suprotnom vratiti 0 (False) U suprotnom vratiti 0 (False)

Procedura U_red Procedura Iz_reda
/* Stavi x u red (Enqueue) */ /* Skini podatak iz reda i
Ako je Pun_red javiti pogrešku stavi ga u x (Dequeue) */
U suprotnom Ako je Prazan_red javiti pogrešku
Povećati ul za 1 U suprotnom
Postaviti V[ul]=x Postaviti x=V[iz]
Kraj u suprotnom Povećati iz za 1
Kraj u suprotnom
Procedura Oĉisti_red
Postaviti ul=0
Postaviti iz=0

4.3.2 Cikliĉki red

U cikliĉkom redu se nakon što se popuni n-1. podatak red i dalje puni
od poĉetka tj. od nultog mjesta.

n-1 0
1
2
3
U cikliĉkom redu se ulazni pokazivac
povećava izrazom ul=mod(ul+1,n) .
Isto vrijedi i za izlazni pokazivac.
Cikliĉki red je prazan ako je ul=iz i
zadnja promjena bio je izlaz
Cikliĉki red je pun mod(ul+1)=iz i
zadnja promjena bio je ulaz


Primjer za red: Algoritam “Labirint”
U zadanom labirintu (grafu) naći put ulaza (poĉetnog ĉvora p) do izlaza
(završnog ĉvora z).
1(p)
8
18
9
19
21
15
16
28
7
17 20
4
22
23
14
26
27(z)
3
2
5
6
13
12
11
10
Algoritam procedure Labirint
Za svaki ĉvor i postaviti Status[i]=0
Postaviti cvor=p
Postaviti s=1
Staviti cvor u Red
Postaviti Status[cvor]=s
Povećati s za 1
Sve dok je cvor!=z i Red nije prazan ĉiniti
Izvaditi cvor iz reda
Za svaki susjed Su sa Status[Su]=0 ĉiniti
Staviti Su u Red
Postaviti Status[Su]=s
Kraj za svaki susjed
Povećati s za 1
Kraj sve dok je
Ako je cvor!=z ispisati poruku da puta nema
U suprotnom aktivirati proceduru Nadji_put


Algoritam procedure Nadji_put
Postaviti Nc=1
Postaviti cvor =z
Postaviti Put[0]=z
Sve dok je cvor!=p ĉiniti
Naći susjed Su ĉvoru tako da je Status[cvor]>Status[Su]
Postaviti Put[Nc]=Su
Postaviti cvor=Su
Povećati Nc za 1
Kraj sve dok
Za svaki i=Nc-1 do 0 ispisati Put[i]

4.4 Povezani popis

Povezani popis (engl. Linked List) je dinamiĉka struktura. Elementi
popisa (zapisi) se stavljaju u slobodni dio memorije, a kada pojedini
zapis ili cijeli popis više nije potreban, zauzeti dio memorije se
oslobaĊa. Elementi su meĊusobno povezani adresnim podacima -
pokazivaĉima (engl. Pointer). Redoslijed po kojemu se sekvencijelno
prolazi kroz popis moţe se mijenjati mijenjajući samo vrijednosti
pokazivaĉa.
Pokazivaĉi na
idući zapis
Prvi
Zapis 1
Zapis 2 Zapis 3
Podaci
Podaci
Podaci
Stvaranje povezanog popisa:
Postaviti prvi=NULL
Uĉitati podatak y
Sve dok nije kraj podataka ĉiniti
Ako je prvi=NULL ĉiniti
Postaviti trenutni=nova adresa u dinamiĉkoj memoriji
(procedurom malloc u C-u ili New u Pascalu)
Postaviti prvi=trenutni
U suprotnom ĉiniti
Postaviti prethodni=trenutni
Postaviti trenutni=nova adresa u dinamiĉkoj memoriji
Postaviti iduci na adresi prethodni = trenutni
Kraj ako je
Postaviti x na adresi trenutni = y ( (*trenutni.x)=y )
Uĉitati podatak y
Kraj sve dok
Postaviti iduci na adresi trenutni = NULL ( (*trenutni).iduci=NULL )
Obilazak kroz povezani popis (od poĉetka do kraja)

Postaviti trenutni=prvi
Sve dok je trenutni !=NULL ĉiniti
Ispisati x na adresi trenutni ((*trenutni).x )
Postaviti trenutni= iduci na adresi trenutni)
Kraj sve dok


Povezani popis s pokazivaĉima na poĉetak i kraj popisa

(trenutni=(*trenutni).iduci
Zapis 1
Zapis 2 Zapis n
Podaci
Podaci
Podaci Podaci
prvi zadnji
Zapis 2
prvi
Zapis 1
Zapis 3
x 7 x 25
x 12
iduci iduci
NULL
iduci
Sortiranje povezanim popisom (Insert sort)
Algoritam “Insert sort” (padajući redoslijed)
Postaviti pokazivaĉ prvi=NULL
Uĉitati podatak y
Sve dok nije kraj podatak y ĉiniti
Pozvati proceduru Insert_sort(y)
Uĉitati podatak y
Kraj sve dok

Procedura Insert_sort(y)
Naći slijedeću slobodnu adresu adr
Staviti y u podatak x na adresi adr /* (*adr).x=y */
Ako je prvi=NULL ĉiniti /* Prvi podatak */
Postaviti iduci na adresi adr na NULL /* (*adr).iduci=NULL */
Postaviti prvi=adr
U suprotnom ĉiniti /* Svi ostali osim prvog*/
Postaviti prethodni=NULL
Postaviti trenutni=prvi
Sve dok je x na adresi trenutni veći od y i nije kraj popisa ĉiniti
Ako nije kraj popisa ĉiniti
Ako je došao najveći ĉiniti /* Najveći podatak */
Postaviti prvi=adr
Postaviti iduci na adresi prvi = trenutni
U suprotnom /* Opći sluĉaj */
Postaviti iduci na adresi adr=iduci na
adresi prethodni
Postaviti iduci na adresi prethodni = adr
Kraj ako je
U suprotnom /* Najmanji podatak */
Postaviti iduci na adresi trenutni = adr
Postaviti iduci na adresi adr=NULL
Kraj ako je
Kraj sve dok
Kraj ako je

5. Nelinearne strukture

5.1. Stabla

Stablo je hijerarhijska struktura koja se sastoji od čvorova i
grana.Ĉvorovi su “toĉke” (ili kruţići u grafiĉkom prikazu),
koji su spojeni duţinama koje se nazivaju granama.
Hijerarhijska struktura stabla uoĉava se iz ĉinjenice, da ĉvorovi
mogu imati podreĊene ĉvorove (povezane granama “prema
dolje”) i najviše jedan nadreĊeni ĉvor (povezan granom “prema
gore”). Svi ĉvorovi osim jednog, koji se zove korjen imaju jedan
nadreĊeni ĉvor. Korjen nema nadreĊeni ĉvor.

Stablo na slici naziva se općim stablom jer broj podreĊenih
ĉvorova moţe biti proizvoljan.
R
a
b
c
d
e
f g h i
j
k
l m
n o
R je korjen stabla.
R ima ĉetiri podreĊena
ĉvora ili nasljednika.
Ĉvorovi c, f, g, h , i, k, l,
m, n i o nemaju niti
jedan nasljednik
Korjen stabla R nalazi
se na nultom nivou
stabla. Nasljednici svih
ĉvorova na i-tom nivou
nalaze se na i+1-om nivou.
Prvi nasljednik nekog ĉvora v je onaj nasljednik w koji je naznaĉen
(nacrtan) kao prvi nasljednik s lijeve strane crteţa. Idući nasljednik istog
nadreĊenog ĉvora v je prvi susjed ĉvora w.
Npr. prvi nasljednik ĉvora b je ĉvor g. Prvi susjed ĉvora g je ĉvor h.
Ĉvor i nema prvi susjed.
5.1.1 Prikaz i obilazak općeg stabla

Povezani popis je jedan naĉin prikaza. Svaki ĉvor prikazan je zapisom u
povezanom popisu koji u podacima ima oznake nadreĊenog ĉvora,
nasljednika i prvog susjeda. Pokazivaĉ Idući pokazuje na naredni zapis.
Ĉvor Nasljed- Susjed Idući
nik
Obilazak stabla je procedura kojom se stvara popis svih ĉvorova u
stablu. Obilazak po širini je obilazak po nivoima i sliĉan je
pretraţivanju labirinta te takoĊer koristi red.
Algoritam obilaska općeg stabla po širini (pomoću reda)

Staviti korjen u red
Sve dok red nije prazan ĉiniti
Skinuti čvor iz red-a
Ispisati čvor
Ako postoji nasljednik ĉiniti
Ispisati nasljednik
Staviti nasljednik u red
Sve dok postoji susjed ĉiniti
Staviti susjed u red
Ispisati susjed
Kraj sve dok
Kraj ako postoji nasljednik
Kraj sve dok
5.1.2. Binarno stablo
Binarno stablo je stablo kod kojeg svaki ĉvor moţe imati najviše dva
nasljednika. Oni su lijevi i desni nasljednik.
Opće stablo moţe se prikazati binarnim stablom tako da za svaki ĉvor
prvi nasljednik postane lijevi, a prvi susjed postane desni nasljednik
u binarnom stablu.
Opće stablo s predhodne slike
postaje binarno stablo prikazano
na slici na ovoj stranici.
R
a
e
l
m
f
b
c
d
j
n
o
h
g
k
i
5.1.3. Obilasci binarnog stabla

Kod binarnog stabla definirani su obilasci po dubini. Takav obilazak
prati put od korjena (vrha) stabla “u dubinu” do najniţeg nivoa odakle
“poĉinje” obilazak. Uobiĉajeno je da da se takvi obilasci definiraju
tako, da se “spuštanje” do najniţeg nivoa obavlja “po lijevoj strani” tj.
da se od nadreĊenog ĉvora “krene” prema lijevom nasledniku. U tom
sluĉaju će se lijevi nasljednik L uvijek naći na popisu prije desnog
naslednika D. NadreĊeni ĉvor N će se ovisno o definiranom naĉinu
naĉinu obilaska naći ispred, izmeĊu ili iza posdreĊenih ĉvorova N i L.
Zato razlikujemo NLD obilazak (engl. preorder) LND (inorder) i LDN
(postorder) obilazak. Za graf na slici obilsaci su:

R
a b
c
d
e
f
g h
NLD: R, a, c, f, d, b, e, g, h
LND: f, c, a, d, R, b, g, e, h
LDN: f, c, d, a, g, h, e, b, R

Za sva tri obilaska koristi se stog.
5. 1. 3 Algoritam NLD obilaska

Isprazniti stog
Ispisati korjen stabla i staviti ga na stog
Sve dok stog nije prazan ĉiniti
Sve dok cvor ima lijevi nasljednik ĉiniti
Postavit cvor=lijevi
Staviti cvor na stog
Ispisati cvor
Kraj sve dok
Sve dok cvor nema desni nasljednik i stog nije prazan ĉiniti
Skinuti cvor sa stoga
Kraj sve dok
Ako je stog prazan završiti obilazak
Ispisati desni
Staviti desni na stog
Kraj sve dok
5.1.4. Algoritam LND obilaska

Isprazniti stog i staviti “KRAJ” na stog
Postavit cvor = korjen stabla
Ponovljati
Sve dok postoji lijevi nasljednik ĉiniti
Staviti cvor na stog
Postaviti cvor=lijevi
Kraj sve dok
Postaviti desni_nas=0
Ponavljati
Ispisati cvor
Ako postoji desni nasljednik
Postaviti cvor=desni nasljednik
Postaviti desni_nas=1
U suprotnom skinuti cvor sa stog-a
Dok je zadovoljen uvjet desni_nas=0 i stog nije prazan
Dok je zadovoljen uvjet ima podataka na stog-u



5.1.5. Algoritam LDN obilaska
Isprazniti stog
Postaviti cvor=korjen stabla
Ponavljati
Sve dok postoji lijevi ĉiniti
Staviti cvor na stog
Ako postoji desni staviti ga na stog s oznakom “D”
Postaviti cvor=lijevi
Kraj sve dok
Staviti cvor na stog
Ako postoji desni staviti ga na stog s oznakom”D”
Postaviti desni_nas=0
Ponavljati
Skinuti cvor sa stog-a
Ako cvor ima oznaku “D” postavit desni_nas=1
U suprotnom ispisati cvor
Do uvjeta prazan stog ili desni_nas=1
Do uvjeta prazan stog
5.1.6. Poredano binarno stablo (engl. Binary Search Tree)

Ako su ĉvorovi binarnog stabla ozaĉeni meĊusobno usporedivim
oznakama te je oznaka lijevog nasljednika manja a oznaka desnog
nasljednika veća od oznake nadreĊenog ĉvora i to vrijedi za svaki ĉvor,
takvo stablo se naziva poredano binarno stablo. Ovakvo binarno
stablo omogućuje efikasno pretraţivanje, dodavanje i brisanje.

Algoritam pretraţivanja treba pronaći da li se podatak P nalazi u stablu
(oznaka jednog ĉvora je jednaka P), a ako se ne nalazi idikator nadjen
poprima vrijednost -1. U oba sluĉaja nalazi se nadredjeni. Kada je P
naĊen, podatak nadredjeni dobiva oznaku ĉvora koji je nadreĊen
traţenom ĉvoru P. Ako P nije naĊen (nadjen=-1) nadredjeni je ĉvor
koji će biti nadreĊen ako se ubaci ĉvor P pri ĉemu će stablo i dalje
ostati poredano binarno stablo.
Algoritam traţenja “Trazi P” u poredanom binarnom stablu
Uĉitati podatak P
Postaviti cvor=korjen stabla
Postaviti nadjen=0
Postaviti nadredjeni=0
Sve dok je nadjen=0 ĉiniti
Ako je cvor=P postaviti nadjen=1
U suprotnom ĉiniti
Postaviti nadredjeni=cvor
Ako je P<cvor ĉiniti
Ako postoji lijevi postaviti cvor=lijevi
U suprotnom postaviti nadjen=-1
Ako je P>cvor ĉiniti
Ako postoji desni postaviti cvor=desni
U suprotnom postaviti nadjen=-1
Kraj sve dok


Algoritam “Dodaj P” dodavanja u poredano binarno stalo

Algoritmom traţenja “Nadji P” naći ĉvor P i njemu nadredjeni
Ako je P naĊen javiti da se ĉvor ne moţe dodati
U suprotnom ĉiniti
Ako je P<nadredjeni dodaj P kao lijevi nasljednik od nadredjeni
U suprotnom dodaj P kao desni nasljednik od nadredjeni
Kraj u suprotnom
Algoritam “Brisi P” brisanja iz poredanog binarnog stabla

Algoritmom traţenja “Nadji P” naći ĉvor P i njemu nadredjeni
Ako P nije naĊen javiti da se ĉvor ne moţe brisati
U suprotnom ĉiniti
Ako P nema desni nasljednik postaviti lijevi nasljednik na mjesto
ĉvora P
U suprotnom ĉiniti
Naći ĉvor Lndnas koji je LND nasljednika od desnog
nasljednika ĉvora P
Staviti Lndnas na mjesto ĉvora P
Kraj u suprotnom
Kraj u suprotnom



5.1.7 Prošireno binarno stablo

Binarno stablo u kojem svaki ĉvor moţe imati ili dva ili niti jedan
nasljednik naziva se prošireno binarno stablo. Ĉvorovi bez
nasljednika
su vanjski, ostali su unutarnji.
Unutarnji
ĉvor

Vanjski ĉvor

9 7
8 6 4
12 14
Svakom vanjskom ĉvoru moţe se pridjeliti brojĉana vrijednost ili teţina
ĉvora. Duţina puta l
i
do vanjskog ĉvora i definirana je brojem grana koje
treba proći od korjena do vanjskog ĉvora. Teţinski put do ĉvora i tj. w
i
definar je umnoškom l
i
w
i
. Ukupni teţinski put stabla definiran je s
W=E l
i
w
i
za sve vanjske ĉvorove i . Za nactrano stablo je
W=(9+7)*2+(8+6+4)*3+(12+14)*4=190
5.1.8 Huffmanovo stablo i Huffmanov algoritam

Za zadane vanjske ĉvorove i njihove teţine moţe se naći stablo s
najmanjim teţinskim putem tako da ĉvorovi s većom teţinom doĊu
što bliţe korjenu a ĉvorovi s malom teţinom što dalje od korjena.
To radi slijedeći Huffmanov algoritam

Algoritam najmanjeg teţinskog puta (Huffmanov algoritam)

Teţine ĉvorova w
i
staviti u skup Ws{w
i
}
Sve dok je skup Ws neprazan ĉiniti
Naći dva najmanja elementa wmin
1
i wmin
2
u skupu Ws
Ubaciti novi ĉvor steţinom w
n
= wmin
1
+ wmin
2
u skup Ws
Izbaciti ĉvorove wmin
1
i wmin
2
iz skupa Ws
Kraj sve dok


4 7 8 9
12 14
11
23
17
Za stablo zadano sa skupom vanjskih ĉvorova Ws={4,7,12,8,9,14}
Huffmanovo stablo s minimalnim teţinskim putem bit će prema slici:
Sada je W=(4+7+8+9)*3+(12+14)*2=136

Huffmanov kod dobiva se tako, da se grane koje idu k lijevim nasljed-
nicima oznaĉe s 0 a grane prema dsnim nasljedniocima s 1.

Huffmanov kod koristi se pri kodiranju poruka. Znakovima koji se
ĉešće pojavljuju dodjeljuje se kraći binarni niz a rjeĊe pojavljivanim
znakovima dodjeljuje se duţi binarni niz.
31
54
Npr. ţelimo kodirati poruku “Drvo i Drava” a zadano je da je prosjeĉno
pojavljivanje znakova u tekstu hrvatskog jezika dato s prva dva stupca
tabele:

ZNAK wi Huffmanov kod
praznina 7% 1 1
D 0.5% 0 1 0 0
r 2% 0 1 1
a 5% 0 0
o 2.5% 1 0 0
v 1% 0 1 0 1
i 3% 1 0 1

Kodovi za navedene znakove
prema Huffmanovom stablu
na slici dati su u trećem stupcu
tabele.
D v
0.5
1.5 2 2.5 3
r o i

5.5 3.5 5
a
8.5
7
praznina
0
0 1
1
0
0
1
1
1
1
0
0
1
12.5
21
5. 1. 8. Potpuno binarno stablo i hrpa

Stablo u kojem su sve razine popunjene a jedino posljednja razina ne mora
biti popunjena zove se potpuno binarno stablo. Svaka ratina popunjava
se s lijeva na desno. Ako je još zadovoljen uvjet, da je nadreĊeni ĉvor
veći ili jednak od oba podreĊena, takvo potpuno binarno stablo zove se
hrpa (engl. Heap).


Ako se razina na kojoj je korjen stabla oznaĉi s 0 , onda na svakom
popunjenoj razini n ima 2
n
-tu ĉvorova (zadnja razina ne mora biti
popunjen pa na tamo taj broj moţe biti i manji). Ako se ĉvorovima
pridjele redni brojevi i={0..N} (N je broj ĉvorova u stablu) s tim da
numeracija ide od 0-te ka većim razinama i od lijeva na desno onda se
iz rednog broja i ĉvora moţe jednoznaĉno odrediti i redne brojeve
njegovog prethodnika i oba nasljednika.


Za redne brojeve i ĉvorova u hrpi vrijede ova pravila:
1. Lijevi nasljednik ima parni i, a desni ima neparni i
2. NadreĊeni i-tom ĉvoru ima redni broj a(i)=int(i/2)
3. Lijevi nasljednik i-tog ĉvora ima redni broj l(i)=2*i
4. Desni nasljednik i-tog ĉvora ima redni broj l(i)+1
Razina 0
Razina 1
Razina 2
Razina 3
1
2
3
4 5 6 7
8
9
10
11
12
302
196
9
5 3
143
135 141 83
83
204
252
Redni broj čvora (i)
Oznaka čvora (c)
Zadnji čvor u hrpi
Algoritam “Dodaj u hrpu cvorx” (s povezanim popisom)

Dodijeliti pokazivaĉu pc prvu slobodnu adresu
Slogu na adresi pc postaviti
lijevi=0; desni=0; cvor=cvorx; broj=ukupno_cvorova iduci=NULL
Poveĉati ukupno_cvorova za 1
Ako je prvi=NULL postaviti prvi=pc
U suprotnom ĉiniti
Postaviti ptr=prvi
Postaviti broj_nadredjenog=ukupno_cvorova / 2
Sve dok je iduci na adresi ptr razliĉit od NULL ĉiniti
Ako je broj_cvora na adresi ptr jednak broj_nadredjenog ĉiniti
Ako je ukupno_cvorova paran postaviti lijevi=cvor
U suprotnom postaviti desni=cvor
Kraj Ako je
Kraj Sve dok
Sve dok je cvor>nadredjeni zamijeniti cvor i nadredjeni

Algoritam “Brisi iz hrpe cvorx” (s povezanim popisom)

Naći zadnji ĉvor (s najvećim rednim brojem)
Naći ĉvor cvorx koji treba brisati
Zamijeniti ĉvorove zadnji i cvorx

Sve dok je cvorx manji od svog lijevog ili desnog nasljednika ĉiniti
Zamijeniti cvorx s manjim nasljednikom
Kraj sve dok
Izbaciti cvorx iz povezanog popisa
Smanjiti ukupno_cvorova za 1
Algoritam dodavanja u hrpu i brisanja iz hrpe:
Hrpa je prikazana vektorom: Hrpa[0] =broj ĉvorova u hrpi
Hrpa[i]=oznaka ĉvora s rednim brojem “i”

Algoritam “Dodati cvor”
Povećati Hrpa[0] za 1
Postaviti i=Hrpa[0]
Postaviti Hrpa[i]=cvor
Sve dok je Hrpa[i]<Hrpa[i/2] i i>1 ĉiniti
Zamijeniti Hrpa[i] i Hrpa[i/2]
Podijeliti i s 2
Kraj sve dok


Algoritam “Brisati cvor”

Naći i tako da je Hrpa[i]=cvor
Postaviti j=Hrpa[0]
Smanjiti Hrpa[0] za 1
Postaviti Hrpa[i]=Hrpa[j]
Postaviti Hrpa[j]=0
Sve dok je Hrpa[i]<Hrpa[2*i] ili je Hrpa[i]<Hrpa[2*i+1]
i Hrpa[2*i]>0 ĉiniti /* Zamijeniti cvor s podreĊenim */
Ako je Hrpa[2*i]>Hrpa[2*i+1] ĉiniti
Zamijeniti Hrpa[2*i] s Hrpa[i]
Pomnoţiti i s 2
U suprotnom ĉiniti
Zamijeniti Hrpa[2*i+1] s Hrpa[i]
Postaviti i=2*i+1
Kraj Ako je
Kraj Sve dok


Sortiranje pomoću hrpe (Heap sort)

Sve dok nije kraj podataka ĉiniti
Uĉitati broj
Dodati broj u stablo Hrpa
Kraj sve dok
Sve dok Hrpa nije prazna ĉiniti
Ispisati korjen stabla Hrpa
Brisati korjen iz stabla Hrpa
Kraj sve dok
5. 2 Grafovi

5.2.1 Opći pojmovi

Graf G (V,E) se sastoji od skupa ĉvorova (ili vrhova; engl. nodes,
vertices) V(G) i skupa grana (bridova; engl. branches, edges) E(G).
Skup E(G) je neureĊeni skup parova e{u,v}. u i v su ĉvorovi iz V(G).
u i v su krajnje toĉke grane e. u i v su susjedni ĉvorovi. Grana e
pridruţena je ĉvoru u i ĉvoru v.
2
ĉvor
grana
V(G)={1,2,3,4,5,6}
E(G)={e
1
,e
2
,

e
3
,e
4
,e
5
,e
6
,e
7
,e
8
}


e
1
= {1,2} e
2
= {2,3} e
3
= {2,4}
e
4
= {1,4} e
5
= {3,4} e
6
= {3,5}
e
7
= {1,5} e
8
= {4,4}
1
3
4
5
e
1
e
2
e
4
e
5
e
6
e
7
e
8
6
e
3
Grana e s istim krajnjim toĉkama je petlja.
Stupanj deg(u) ĉvora u odreĊen je brojem grana pridruţenih ĉvoru.
Zbroj deg(u) za sve ĉvorove jednak je dvostrukom broju grana. Ĉvor
za koji je deg(u) =0 zove se izolirani ĉvor.
Put duţine n je niz P(v
0
,v
1
,v
2
.....v
n
) za koje vrijedi da su v
i
i

v
i+1
susjedni ĉvorovi. Ako je v
0
= v
n
, put P je petlja.
Ako izmeĊu bilo koja dva ĉvora grafa G postoji put, tada je to povezani
graf. Graf H(V’,E’) je podgraf grafa G(V,E) ako su V’ i E’ podskupovi
od V i E. Povezani podgraf T grafa G koji nema petlje je stablo.
Razapinjuće stablo sadrţi sve ĉvorove grafa.

2
1
3
4
5
e
2
e
4
e
6 e
3
Razapinjuće stablo grafa G
1
3
4
5
e
1
e
2
e
4
e
5
e
6
e
7
e
8
e
3
Graf G
2
Graf je usmjeren ako se svakoj grani pridruţi smjer tj. grana e{u,v}
predstavlja put od ĉvora u do ĉvora v ali ne i obrnuto. Grane takvog
grafa oznaĉavaju se dodatno strijelicama.Ako je svaka grana oznaĉena
nekavim brojem w većim od nule (duţinom) graf postaje teţinski graf.
1
3
4
5
0.8
0.8
0.7
1
1.5
3.2
0.35
0.05
Graf G
2
5.2.2 Prikaz grafa u programu:

Matrica susjedstva: S[i][j]=0 ako ĉvorovi i i j nisu susjedi
S[i][j]=1 ako su ĉvorovi i i j susjedi

Usmjereni graf G ima matricu susjedstva S prema slici

0 1 0 1 0 Matrica susjedstva je kvadratna i moţe se potencirati.
0 0 1 0 0 k-ta potencija te matrice daje broj puteva duţine k.
S= 1 1 0 0 1
0 1 1 1 0
0 0 0 0 0

0 1 2 1 0 2 3 2 1 2 2 5 4 3 2
1 1 0 0 1 0 1 1 1 0 1 2 2 1 1
S
2
= 0 1 1 1 0 S
3
= 1 2 2 1 1 S
4
= 2 4 3 2 2
1 2 2 1 1 2 4 3 2 2 3 7 6 4 3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

5.2.3 Obilazak grafa je sastavljanje popisa svih ĉvorova;
zadan je graf G(V,E), broj ĉvorova n i poĉetni ĉvor c0.

Algoritma “Obilazak po širini”

Za svaki i=0 do n-1 postaviti Status[i]=0
Staviti c0 u Red
Postaviti Status[c0]=1
Sve dok Red nije prazan ĉiniti
Skinuti cvor iz reda Red
Ispisati cvor
Svaki susjed ĉvora cvor sa Status[susjed]=0 staviti u Red i postaviti
Status[susjed]=1
Kraj sve dok

Jednako tako obavlja se obilazak po dubini, samo se umjesto u red
ĉvorovi stavljaju na stog.


5.2.4 Matrica povezanosti ĉvorova

Iz matrice susjedstva S dobiva se u matrica povezanosti P u kojoj je
P[i][j]=1 ako postoji put od ĉvora i do ĉvora j. U suprotnom P[i][j]=0.
.
Warshallov algoritam obavlja tu pretvorbu matrice S u matricu P .

Za svaki i=0 do n-1
Za svaki j=0 do n-1
Postaviti P[i][j]=0
Za svaki k=0 do n-1
Za svaki i=0 do n-1
Za svaki j=0 do n-1
Ako je S[i][j]=1 ili S[i][k]=1 i S[k][j]=1 postaviti P[i][j]=1

Osim matrice susjedstva S za teţinski graf definirana je i matrica teţina
W u kojoj je W[i][j]=w
ij
tj. teţina grane od i-tog do j-tog ĉvora.
Za teţinski graf G (s prethodne slike) matrica W ima vrijednosti

NULL 0.8 NULL 0.7 NULL Ovdje NULL oznaĉava
NULL NULL 0.8 NULL NULL nepostojanje puta (put
W= 3.2 0.8 NULL NULL 1.5 duţine beskonaĉno)
NULL 0.05 1.0 0.35 NULL
NULL NULL NULL NULL NULL

Modificirani Warshallov algoritam nalazi matricu najkraćih puteva Q
meĊu ĉvorovima. Za matricu Q koja je poĉetno jednaka matrici W
vrijedi
Q[i][j]=min(Q[i][j],Q[i][k]+Q[k][j]
Modificirani Warshallov algoritam (algoritam najkraćeg puta)

Zadana je matrica W s n redaka/stupaca
Postaviti matrica Q= matrica W
Za svaki k=0 do n-1
Za svaki i=0 do n-1
Za svaki j=0 do n-1
postaviti Q[i][j]=min(Q[i][j] , Q[i][k]+Q[k][j])

Za graf iz gornjeg primjera matrica najkraćih puteva Q je

4.75 0.75 1.55 0.70 3.05
4.00 1.60 0.80 4.70 2.30
Q= 3.20 0.80 1.60 3.90 1.50
4.05 0.05 0.85 0.35 2.35
NULL NULL NULL NULL NULL

5.2.5 Najkraći put izmeĊu ĉvorova grafa i ĉvorove (i grane) na tom putu
nalazi se algoritmom ”Najkraći put pretraţivanjem po širini” (Napomena:
Algoritam zahtjeva da su ĉvorovi oznaĉeni brojevima od 1 do n)

Uĉitati broj ĉvorova n i matricu susjedstva S
Uĉitati poĉetni ĉvor pc i krajnji ĉvor kc
Za svaki i=1 do n postaviti Status[i]=-2
Pozvati proceduru STABLO
Pozvati proceduru ISPIS

Procedura Stablo nalazi najkraće putove od poĉetnog ĉvora pc do svih
ostalih ĉvorova. Udaljenosti ĉvorova od poĉetnog pc na putu stavljaju se
u matricu Udaljenosti. i-ti red sadrţi podatke za i-ti ĉvor. Prvi stupac
(s indeksom 0) sadrţi udaljenost, dok se u drugi stupac stavlja oznaka
prethodnog ĉvora na putu.

Iz te matrice procedura ISPIS ispisuje ĉvorove na najkraćem putu do
kc-tog ĉvora iz kc-tog reda te matrice.
Algotitam “Stablo”

Staviti pc u Red
Postaviti Udaljenosti[pc][0]=0 i Udaljenosti[pc][1]=0
Sve dok Red nije prazan ĉiniti
U redu Red naći ĉvor cmin s najmanjom udaljenošću
Za svaki susjed i ĉvora cmin koji ima Status[i]=-2 ĉiniti
Staviti ĉvor i u Red
Naći u=Udaljenosti[cmin][1] + S[cmin][i]
Ako je Status[i] =-2 ili u<Udaljenosti[i][1] ĉiniti
Postaviti Udaljenosti[i][0]=u
Postaviti Udaljenosti[i][1]=cmin
Postaviti Status[i]=0
U suprotnom postaviti Status[i]=-1
Kraj ako je
Kraj za svaki susjed i
Skinuti ĉvor cmin iz red Red
Kraj sve dok

Algoritam procedure “ISPIS”

Staviti kc na stog
Postaviti prethodni_cvor=Udaljenosti[kc][1]
Sve dok je Udaljenosti[prethodni_cvor][1] >0 činiti
Staviti Udaljenosti[kc][1] na stog
Postaviti prethodni_cvor=Udaljenosti[kc][1]
Povećati i za 1
Kraj sve dok
Sve dok se stog ne isprazni ĉiniti
Skinuti ĉvor sa stoga
Ispisati ĉvor
Kraj sve dok





Matrica Udaljenosti sadrţi i krajnje ĉvorove grana u najmanjem
razapinjućem stablu. Ispis tih ĉvorova postiţe se procedurom
ISPIS_NRS koja je nešto proširena gornja procedura ISPIS. Ispis se
obavlja ne samo za ĉvor kc (koji ne mora biti niti zadan) već za sve
krajnje ĉvorove stabla. To su ĉvorovi koji nisu prethodni ĉvorovi nit
jednom ĉvoru stabla pa se ne nalaze u drugom stupcu (s indeksom 1)
matrice Udaljenosti. Tim se ĉvorovima stavlja Status[i]=1 pa
algoritam ISPIS_NRS je:

Za svaki i=1 do n postaviti Status[i]=1
Za svaki i=1 do n ĉiniti
Postavit cvor=Udaljenosti[i][1]
Postaviti Status[cvor]=0
Kraj za svaki i
Za svaki i=1 do n
Ako je Status[i]=1 pozvati proceduru ISPIS
6. Rekurzivne procedure
6.1. Osnovni pojmovi

Rekurzivne procedure ostvaruju se tako da se unutar neke procedure
PROC obavi poziv te iste PROC procedure. Na primjer, faktorijel
prirodnog broja definiran je s N!=N*(N-1)*(N-2)*...*2*1 ili
N!=N*(N-1)! Algoritam NFAKT rekurzivne procedure NFAKT(n) će
zato biti:

Ako je n=1 vratiti 1
U suprotnom vratiti n*NFAKT(n-1)

Općenito rekurzivna procedura ima najĉešće gornji oblik tj.
Ako je rješenje trivialno vratiti to rješenje
U suprotnom obaviti rekurzivni poziv
6.2 Quick sort rekurzijom

Glavna procedura “QUICKSORT”
Uĉitati n brojeva u vektor A
Pozvati QUICK1(0,n-1,A)


Procedura QUICK1(d,g,A)
/* Poredati brojeve vektora A od d do g */
Ako je d>=g vratiti se u pozivajući program
Postaviti m=QUICK2(d,g,A)
Pozvati QUICK1(d,m-1,A)
Pozvati QUICK1(m+1,g,A)



Procedura QUICK2(d,g,A)
/* Naći indeks m tako da su brojevi lijevo manji od A[m] a desno veći */
Postaviti m=d
Ako je d=g vratiti d
Sve dok je A[g] > A[m] i m!=g smanjivati m za 1
Ako je m=g vratiti m
Zamijeniti A[m] i A[g]
Postaviti m=g
Sve dok je A[d] A[m] i m!=d povećavati m za 1
Ako je m=d vratiti m
Zamijeniti A[m] i A[g]
Postaviti m=QUICK2(d,g,A)
6.3 Rekurzivno sortiranje ubacivanjem (Merge sort)


Glavna procedura “MERGESORT”
Uĉitati n brojeva u vektor A
Pozvati SORT(0,n-1,A)


Procedura SORT(d,g,A)
Ako je d=g vratiti se u pozivajuću proceduru
Pozvati SORT (d, (d+g) / 2, A)
Pozvati SORT ((d+g)/2+1, g, A)
Pozvati MERGE(d, g, A)

Procedura MERGE (d, g, A)
Postaviti s=(d+g)/2, i1=d i i2=s+1
Za svaki i=0 do i=g-d ĉiniti
Ako je i1<=s i i2<= gg
Ako je A[i1]<A[i2] ĉiniti
Postaviti T[i]=A[i1]
Povećati i1 za 1
U suprotnom ĉiniti
Postaviti T[i]=A[i2]
Povećati i2 za 1
U suprotnom
Ako je i1>s ĉiniti
Postaviti T[i]=A[i2]
Povećati i2 za 1
U suprotnom ĉiniti
Postaviti T[i]=A[i1]
Povećati i1 za 1
Za svaki i=d do g postaviti A[i]=T[i-d]
6. 4 Obilazasci binarnog stabla rekurzijom

LND obilazak: procedura LND(cvor)
Ako postoji lijevi pozovi LND(lijevi)
Ispiši ĉvor cvor
Ako postoji desni pozovi LND(desni)

NLD obilazak: procedura NLD(cvor)
Ispiši ĉvor cvor
Ako postoji lijevi pozovi NLD(lijevi)
Ako postoji desni pozovi NLD(desni)

LDN obilazak: procedura LDN(cvor)
Ako postoji lijevi pozovi LDN(lijevi)
Ako postoji desni pozovi LDN(desni)
Ispiši ĉvor cvor


6.5 Elektromobil

Zadatak: Vozilo s pogonom na bateriju (akumulator) s jednom baterijom
prijeĊe udaljenost k. Na raspolaganju je n baterija na poĉetnom mjestu.
Uz pogonsku bateriju vozilo ima mjesta za prijevoz još samo jedne
baterije. Koliku udaljenost x moţe prijeći vozilo.
Rješenje:
x
n
x
n-1 x
2
=k x
1
=k
d
2
d
1
Vozilo prelazi udaljenost x prevozeći n-1 bateriju više puta (mora se i
vraćati, osim kad prevozi zadnju). Zbog toga je k=2*(n-2)*x+x za n>1.
Slijedi x=k/(2*n-3) Kako je d
1
=k, d
2
=x
2
+d
1
općenito je d
n
=x
n
+ d
n-1

ili d
n
= k/(2*n-3)+ d
n-1
.Algoritam funkcije d(n,k) glasi
Ako je n=1 vrati k
U suprotnom vrati k/(2*n-3)+d(n-1)
6.6 Algoritam “Osam kraljica”

Zadatak: Na šahovsku ploću postaviti osam kraljica tako da se
meĊusobno ne napadaju. Naći sva moguća rješenja.

Rješenje:

Glavni program:

Za svaki redak=1 do 8
Za svaki stupac= 1 do 8
Postaviti Ploca[redak][stupac]=0
Postaviti br_rjes=0
Pozvati proceduru Postavi(1)
*
*
*
*
*
*
*
*
1
8
1 8
Procedura Postavi (redak)

Za svaki j=1 do 8 ĉiniti
Ako je Ploca [redak][j]=0 ĉiniti
Pozvati proceduru Zauzmi(redak,j)
Ako je redak=7 pozvati proceduru Ispis
U suprotnom pozvati proceduru Postavi (redak+1)
Pozvati proceduru Oslobodi(redak,j)
Kraj ako je
Kraj za svaki j

Procedura Zauzmi(redak,stupac)

Za svaki i=1 do 8 povećati Ploca[i][stupac] za 1
Za svaki j=1 do 8 povećati Ploca[redak][j] za 1
Za svaki i=1 do 8 ĉiniti
Za svaki j=1 do 8 ĉiniti
Ako je i+j=redak+stupac ili je
i- j=redak- stupac povećati Ploca[i][j] za 1
Kraj ako je
Kraj za svaki j
Kraj za svaki i
Postaviti Ploca[redak][stupac]=9

Procedura Oslobodi(redak,stupac) vrlo je sliĉna proceduri Zauzmi.
Razlika je u tome što se obavlja smanjivanje za 1 (umjesto povećanja)
broja u polju koje više ne napada skinuta kraljica. TakoĊer se na polje
koje je bilo zauzeto kraljicom stavlja broj 0.

Procedura Ispis povećava broj rješenja za 1 i ispisuje matricu Ploca
koja ima osam redaka i stupaca. Polje s brojem manjim od 9 ispisuje se
kao “ “ (praznina), dok se polje s brojem 9 (polje na kojem je kraljica)
prikazuje znakom “*”.