Vous êtes sur la page 1sur 107

Algoritmi i strukture podataka (2+1+1)**Sl81

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.
Sadraj predmeta:


1. Osnovni pojmovi
2. Elementarni podaci
3. Sluajni 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 konanog broja radnji
daje suvisli rezultat .

Algoritam je i dio posla u procesu koji od uoenog problema dovodi
do rezultata (najee pomou raunalnog programa).

Slijed poslova:
Fizikalna Matemati- ALGO- Struktura Raunalni
stvarnost ki model RITAM podataka program
}
H
Pdp
Ponavljati..
................
Sve dok..
do{
S/= V[i++];
}while...
Primjer: Raskre akovtina (prije rekonstrukcije)
C
D
A B
E
F
G
H I
AH
CE
DF BI
AG
Fizikalna stvarnost Matematiki model
C
D
A B
E
F
G
H I
AH
CE
FD IB
AG
5555
1.
2.
3.
4. 5.
Pohlepni algoritam - nalazi jedno od rjeenja koje ne mora biti
optimalno
Pohlepni algoritam obojat e graf s tri boje, iako je mogue
koristiti samo dvije.
1.
2.
3.
4.
5.
1.
5.
3.
4.
2.
Algoritam bojanja grafa:
Boja=1
Sve dok graf nije obojan
Obavljaj bojanje(Boja)
Poveaj 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[]
Nai neobojani vor i
Postavi Obojani[1]=i
Postavi nb=1
Naznai 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

Program
Bojanje.cpp
2. Elementarni podaci
a) Znakovi

8 bitni ASCII kod definira 256 znaka (kontrolni i grafiki - 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 ).
Rjeenje: 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 pomou 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 (01 i 1 0)
2. Aritmetiki 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
Poveati i za 1
Sve dok je V[i-1]=0


Program
Binkomp.cpp
Ili krae:

Postaviti i=0
Sve dok je b[i]=0 poveati i za 1
Poveati i za 1
Sve dok je i<n initi
Postaviti b[i]=(b[i]!=1)+0
Poveati i za 1


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

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


Mantisa: 1=<m<2
x=2
E
*m
Program
FLOHEX.cpp
Pogreke u aritmetici kliznog zareza
Najee uslijed konanog broja binarnih (dekaskih) znamenaka u mantisi (24 binarne
znamenke daju 7 tonih dekadskih znameki:
Primjer : Raunanje 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

numeriki
raun:
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
Poetno je (za upisani i opisani kvadrat) S= 2, T=2

Algoritam Ludolf

Postaviti S= 2 i T=2
Uitati 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
Raunanje broja t (2)
Raunanje 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. Sluajni brojevi


Niz brojeva u kojem je svaki lan nezavisan od prethodnih je niz
sluajnih brojeva (engl. Random Numbers). Programski jezici obino
sadre funkciju (npr. RND, random) koja generira jednoliko
raspodjeljene sluajne brojeve.

Brojevi su jednoliko rasporeeni (distribuirani) u definiranom
intervalu , [x1,x2] ako su vjerojatnosti pojavljivanja, u bilo kojim
podintervalima iste irine Ax, meusobno 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
Sluajni brojevi (2)

Tablica i histogram jednolikih sluajnih brojeva iz inervala [0,1)
s podintervalima (razredima) irine 1/6 (generirano 6000 brojeva):
Sluajni 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
Sluajni brojevi (4)

Algoritam Histogram:
Generirati m jednoliko raspodijeljenih sluajnih brojeva u intervalu
[x1,x2) i razvrstati ih u histogram s n razreda jednake irine sr.
Pretpostaviti da postoji generator jednoliko raspodijeljene varijable u
iji inetrval je [0,1)

Uitati 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
Poveati Hist[k] za 1
Kraj iteracije
Za svaki i=0 do n ispisati Hist[i]
Program
Histuni.cpp
Sluajni brojevi (5)

Nejednolika raspodjela:
Primjer: Simulirati bacaje kocke kod koje se broj 3 pojavljuje 10% ee
od ostalih brojeva
0
1 z
x 1.1 x
1 2 3 4 5 6

Algoritam:
Postaviti x=0.164
Generirati sluaji broj u (0<=u<1)
Ako je u>=2*x i u<3.1*x postaviti R=3
U suprotnom
Ako je u<2*x postaviti R=int(u/x)+1
U suprotom postaviti R=(u-3.1*x)/x+4
5*x+1.1*x=1 x=1/6.1=0.164
Program
Varalica.cpp
Sluajni brojevi (6)

Nejednolika raspodjela - openito:
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
Program
Histnoun.cpp
1
u
F(x)=
x
}
x
x
dx x f
1
) (
x1 x(u) x2
Sluajni brojevi (7)
Nejednolika raspodjela:

2 . Kontinuirana
x(u)=F
-1
(u)
Sluajni brojevi (8)
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)

Program
Histnorm.cpp
Sluajni brojevi (9)
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
F
-1
(u)
Program
Histexp.cpp
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) Pretraivanja: Za zadani podatak X nai da li se on
nalazi u skupu V[] i na kojem mjestu.

a.1) Sekvencijelno pretraivanje.
Postaviti i=0
Sve dok je V[i]!=X i i<n-1 poveati i za 1.
Ako je i<n naznaiti da je X na i-tom mjestu.
U suprotnom naznaiti da i nije u skupu V.

Maksimalan broj ispitivanja O(n)=n
O(n) je red veliine (engl order) ili
kompleksnost algoritma.
a2) Binarno pretraivanje: Skup je ureen (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 naznaitida je X na s-tom mjestu u skupu.
U suprotnom naznaiti da X nije u skupu

O(n)=log2(n)

Program
Bintraz.cpp
0 1 2 14 15 16 17 28 29 30 31
0.2 0.7 1.2 8.6 8.7 9.1 9.5 11 17 22 24
Binarno pretraivanje: Trai se mjesto broja x=0.7

1. Iteracija: dg=0 gg=31
s=15, x<V[s]
0 1 2 14 15 16 17 28 29 30 31
0.2 0.7 1.2 8.6 8.7 9.1 9.5 11 17 22 24
Algoritam Idua permutacija

Zadan je vektor V od n elemenata u kojem je poetno 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, nai m+1.
permurtaciju.

Primjer: P
0
= 0 1 2 3 4 5 tj. vektor P
0
={0,1,2,3,4,5}

P
m
= 0 1 2 5 4 3
Nai P
m+1
(P
m+1
= 0 1 3 2 4 5 )



Rjeenje:


Nai najvei i za koji vrijedi V[i]<V[i+1] (Procedura Nadji_i)
Nai 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 rastuem redoslijedu

Program
Nextperm.cpp
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
Program
Allperm.cpp
2. Matrice
a) Magini kvadrati neparnog reda:
Sainiti kvadratnu matricu A neparnog reda m popunjenu brojevima
[1,m
2
] tako da sume svih redaka i stupaca i obiju dijagonala
budu meusobno 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



Program
Magkvad.cpp
Algoritam Magini kvadrat

Uitati 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 /*Poni od srednjeg reda */
Postaviti j=0 /* Poni 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 */
Poveati j za 1 /* Kreni stupac u desno */
Poveati n za 1 /* Idui broj u matrici */
Ako je n-1 djeljivo s m initi
Poveati i za m+1 /* Ponovo poni red nie...*/
Smanjiti j za m-1 /* .. i stupac dalje */
Kraj ako je
Kraj sve dok
Algoritam procedure Prebaci(A[][],m,dolje)

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 mnoenju s X
i
) poetna matrica pretvori u jedininu, tim
istim transformacijama se jedinina 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

Uitati m
Uitati matricu A[m][m]
Formirati jedininu matricu I u stupcima od 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 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 pozivajuu proceduru
Kraj ako je
Kraj za svaki k
Postaviti d = 0

(Napomena: Zamjena sadraja dviju numerikih varijabli x i y
moe se obaviti i ovako: x=y-x; y=y-x; x=x+y;)

Algoritam procedure Redukcija(i,d)

Pomnoiti 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]

Program
Invmat.cpp
4.2 Stogovi

Stog se sastoji od vektora V[]od n elemenata i pokazivaa 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 pogreku stavi ga u x */
U suprotnom Ako je Prazan_stog javiti pogreku
Poveati Sp za 1 U suprotnom
Postaviti V[Sp]=x Postaviti x=V[Sp]
Kraj u suprotnom Smanjiti Sp za 1
Kraj u suprotnom
Procedura Oisti_stog
Postaviti Sp= - 1

Algoritam Putna torba

Zadan je skup od n prirodnih brojeva Tezine i prirodni broj T. Nai bilo
koji podskup Torba skupa Tezine tako da zbroj elemenata u Torba bude
jednak T. Ako takvog podskupa nema, ispisati odgovarajuu poruku.
Procedura Torba
Oisti_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
Poveati pred za 1
Poveati 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
Uitati T i n
Za svaki i=1 do n uitati Tezine[i]
Pozvati proceduru Torba
Ako je rjeenje nadjeno
Za svaki i=0 do pred-1 ispisati Tezine[predmeti[i]]
U suprotnom ispisati poruku da nema rjeenja
Programi
Knapsac1.cpp
Knapsac2.cpp
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 poveati 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
Program
Povrhs.cpp
Algoritam Quick sort
Zadani skup brojeva u vektoru A[ ] poredati po rastuem redoslijedu.
Postupak: 1. Nai konano mjesto m prvog lana skupa (tako da
su lijevo od njega svi manji a desno svi vei 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 trai 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 poveati dg za 1
Ako je dg=m vratiti m
Zamijeniti A[m] i A[dg]
Do beskonanosti
Program
Quickss.cpp
Algoritam Quick

Uitati 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, pokazivaa na poetak
(izlaz) reda iz te pokazivaa na kraj (ulaz) reda ul. Pokaziva iz pokazuje
na prvi element koji treba izai 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 uao u red prvi e
i izai iz reda (FIFO -First in, first out naelo). Postoje konani i cikliki
redovi.

4.3.1 Konani 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 pogreku stavi ga u x (Dequeue) */
U suprotnom Ako je Prazan_red javiti pogreku
Poveati ul za 1 U suprotnom
Postaviti V[ul]=x Postaviti x=V[iz]
Kraj u suprotnom Poveati iz za 1
Kraj u suprotnom
Procedura Oisti_red
Postaviti ul=-1
Postaviti iz=0

4.3.2 Cikliki red

U ciklikom redu se nakon to se popuni n-1. podatak red i dalje puni
od poetka tj. od nultog mjesta.

n-1 0
1
2
3
U ciklikom redu se ulazni pokaziva
poveava izrazom ul=mod(ul+1,n) .
Isto vrijedi i za izlazni pokazivac.
Cikliki red je prazan ako je ul=iz-1 i
zadnja promjena bio je izlaz
Cikliki red je pun ul=iz-1 i zadnja
promjena bio je ulaz.


Primjer za red: Algoritam Labirint
U zadanom labirintu (grafu) nai put od ulaza (poetnog vora p) do
izlaza (zavrnog 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
Program
Labirint.cpp
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
Poveati 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
Poveati 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
Nai susjed Su voru tako da je Status[cvor]>Status[Su]
Postaviti Put[Nc]=Su
Postaviti cvor=Su
Poveati 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 dinamika struktura. Elementi
popisa (zapisi) se stavljaju u slobodni dio memorije, a kada pojedini
zapis ili cijeli popis vie nije potreban, zauzeti dio memorije se
oslobaa. Elementi su meusobno povezani adresnim podacima -
pokazivaima (engl. Pointer). Redoslijed po kojemu se sekvencijelno
prolazi kroz popis moe se mijenjati mijenjajui samo vrijednosti
pokazivaa.
Pokazivai na
idui zapis
Prvi
Zapis 1
Zapis 2 Zapis 3
Podaci
Podaci
Podaci
Stvaranje povezanog popisa:
Postaviti prvi=NULL
Uitati podatak y
Sve dok nije kraj podataka initi
Ako je prvi=NULL initi
Postaviti trenutni=nova adresa u dinamikoj memoriji
(procedurom malloc u C-u ili New u Pascalu)
Postaviti prvi=trenutni
U suprotnom initi
Postaviti prethodni=trenutni
Postaviti trenutni=nova adresa u dinamikoj memoriji
Postaviti iduci na adresi prethodni = trenutni
Kraj ako je
Postaviti x na adresi trenutni = y /* trenutni->x=y */
Uitati podatak y
Kraj sve dok
Postaviti iduci na adresi trenutni = NULL ( (*trenutni).iduci=NULL )
Obilazak kroz povezani popis (od poetka do kraja)

Postaviti trenutni=prvi
Sve dok je trenutni !=NULL initi
Ispisati x na adresi trenutni /* trenutni->x */
Postaviti trenutni= iduci na adresi trenutni) /*trenutni=trenutni->iduci */
Kraj sve dok


Povezani popis s pokazivaima na poetak i kraj popisa

Zapis 1
Zapis 2 Zapis n
Podaci
Podaci
Podaci Podaci
prvi zadnji
Program
Povpop1.cpp
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 (padajui redoslijed)
Postaviti pokaziva prvi=NULL
Uitati podatak y
Sve dok nije kraj podatak y initi
Pozvati proceduru Insert_sort(y)
Uitati podatak y
Kraj sve dok

Procedura Insert_sort(y)
Nai slijedeu 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 trenutni=prvi
Sve dok je y<(*trenutni).x i nije kraj popisa initi
Postaviti prethodni=trenutni
Postaviti trenutni=(*trenutni).iduci /*Pomici se po popisu*/
Kraj sve dok
Ako nije kraj popisa initi
Ako je trenutni= =prvi initi /* Najvei podatak */
Postaviti prvi=adr
Postaviti iduci na adresi prvi = trenutni
U suprotnom /* Opi sluaj */
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

Program
inssortp.cpp
5. Nelinearne strukture

5.1. Stabla

Stablo je hijerarhijska struktura koja se sastoji od vorova i
grana.vorovi su toke (ili kruii u grafikom prikazu),
koji su spojeni duinama koje se nazivaju granama.
Hijerarhijska struktura stabla uoava se iz injenice, da vorovi
mogu imati podreene vorove (povezane granama prema
dolje) i najvie jedan nadreeni vor (povezan granom prema
gore). Svi vorovi osim jednog, koji se zove korjen imaju
jedan nadreeni vor. Korjen nema nadreeni vor.

Stablo na slici naziva se opim stablom jer broj podreenih
vorova moe 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 podreena
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 naznaen
(nacrtan) kao prvi nasljednik s lijeve strane crtea. Idui nasljednik istog
nadreenog 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 opeg stabla

Povezani popis je jedan nain prikaza. Svaki vor prikazan je zapisom u
povezanom popisu koji u podacima ima oznake nadreenog vora,
nasljednika i prvog susjeda. Pokaziva Idui pokazuje na naredni zapis.
vor Nasljed- Susjed Idui
nik
Obilazak stabla je procedura kojom se stvara popis svih vorova u
stablu. Obilazak po irini je obilazak po nivoima i slian je
pretraivanju labirinta te takoer koristi red.
Algoritam obilaska opeg stabla po irini (pomou reda)

Staviti korjen u red
Sve dok red nije prazan initi
Skinuti vor iz red-a
Ispisati vor
Ako postoji nasljednik staviti nasljednik u red
Sve dok postoji susjed initi
Ispisati susjed
Ako susjed ima nasljednik stavi taj nasljednik u red
Kraj sve dok postoji susjed
Kraj sve dok red nije prazan
Program
opcestab.cpp
5.1.2. Binarno stablo
Binarno stablo je stablo kod kojeg svaki vor moe imati najvie dva
nasljednika. Oni su lijevi i desni nasljednik.
Ope stablo moe se prikazati binarnim stablom tako da za svaki vor
prvi nasljednik postane lijevi, a prvi susjed postane desni nasljednik
u binarnom stablu.
Ope 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 najnieg nivoa (odakle
isto moe poeti obilazak). Uobiajeno je da se takvi obilasci definiraju
tako, da se sputanje do najnieg nivoa obavlja po lijevoj strani tj.
da se od nadreenog vora krene prema lijevom nasledniku. U tom
sluaju e se lijevi nasljednik L uvijek nai na popisu prije desnog
naslednika D. Nadreeni vor N e se ovisno o definiranom nainu
nainu obilaska nai ispred, izmeu ili iza podreenih vorova L i D.
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 zavriti obilazak
Ispisati desni
Staviti desni na stog
Kraj sve dok
Program
stablopr.cpp
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



Program
stabloin.cpp
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 oznakomD
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
Program
stablopo.cpp
5.1.6. Poredano binarno stablo (engl. Binary Search Tree)

Ako su vorovi binarnog stabla ozaeni meusobno usporedivim
oznakama te je oznaka lijevog nasljednika manja a oznaka desnog
nasljednika vea od oznake nadreenog vora i to vrijedi za svaki vor,
takvo stablo se naziva poredano binarno stablo. Ovakvo binarno
stablo omoguuje efikasno pretraivanje, dodavanje i brisanje (engl.
naziv je Binary Search Tree).

Algoritam pretraivanja treba pronai 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 sluaja nalazi se nadredjeni. Kada je P
naen, podatak nadredjeni dobiva oznaku vora koji je nadreen
traenom voru P. Ako P nije naen (nadjen=-1) nadredjeni je vor
koji e biti nadreen ako se ubaci vor P pri emu e stablo i dalje
ostati poredano binarno stablo.
Algoritam traenja Trazi P u poredanom binarnom stablu
Uitati 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 traenja Nadji P nai vor P i njemu nadredjeni
Ako je P naen javiti da se vor ne moe 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
Program
porbinst.cpp
Algoritam Brisi P brisanja iz poredanog binarnog stabla

Algoritmom traenja Nadji P nai vor P i njemu nadredjeni
Ako P nije naen javiti da se vor ne moe brisati
U suprotnom initi
Ako P nema desni nasljednik postaviti lijevi nasljednik na mjesto
vora P
U suprotnom initi
Nai vor Lndnas koji je LND nasljednika od desnog
nasljednika vora P
Staviti Lndnas na mjesto vora P
Kraj u suprotnom
Kraj u suprotnom



Program
porbinst.cpp
5.1.7 Proireno binarno stablo

Binarno stablo u kojem svaki vor moe imati ili dva ili niti jedan
nasljednik naziva se proireno binarno stablo. vorovi bez
nasljednika
su vanjski, ostali su unutarnji.
Unutarnji
vor

Vanjski vor

9 7
8 6 4
12 14
Svakom vanjskom voru moe se pridjeliti brojana vrijednost ili teina
vora. Duina puta l
i
do vanjskog vora i definirana je brojem grana koje
treba proi od korjena do vanjskog vora. Teinski put do vora i tj. w
i
definiran je umnokom l
i
w
i
. Ukupni teinski 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 teine moe se nai stablo s
najmanjim teinskim putem tako da vorovi s veom teinom dou
to blie korjenu a vorovi s malom teinom to dalje od korjena.
To radi slijedei Huffmanov algoritam

Algoritam najmanjeg teinskog puta (Huffmanov algoritam)

Teine vorova w
i
staviti u skup Ws{w
i
}
Sve dok skup Ws ima vie od jedan lan initi
Nai dva najmanja elementa wmin
1
i wmin
2
u skupu Ws
Ubaciti novi vor steinom 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 teinskim 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 oznae s 0 a grane prema desnim nasljednicima s 1.

Huffmanov kod koristi se pri kodiranju poruka. Znakovima koji se
ee pojavljuju dodjeljuje se krai binarni niz a rjee pojavljivanim
znakovima dodjeljuje se dui binarni niz.
31
54
Npr. elimo kodirati poruku Drvo i Drava a zadano je da je prosjeno
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 treem stupcu
tabele. Dekodirati:
0101101011101110101101011
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 razina
popunjava se s lijeva na desno. Ako je jo zadovoljen uvjet, da je
nadreeni vor vei ili jednak od oba podreena, takvo potpuno
binarno stablo zove se hrpa (engl. Heap).

Ako se razina na kojoj je korjen stabla oznai s 0 , onda na svakoj
popunjenoj razini n ima 2
n
-tu vorova (zadnja razina ne mora biti
popunjen pa tamo taj broj moe 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 veim razinama i od lijeva na desno onda se
iz rednog broja i vora moe jednoznano 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. Nadreeni i-tom voru ima redni broj n(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
Prikaz hrpe pomou vektora Hrpa
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
Poveati 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

Nai 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 podreenim */
Ako je Hrpa[2*i]>Hrpa[2*i+1] initi
Zamijeniti Hrpa[2*i] s Hrpa[i]
Pomnoiti 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


Algoritam Dodaj u hrpu cvorx (s povezanim popisom)

Dodijeliti pokazivau pc prvu slobodnu adresu
Slogu na adresi pc postaviti
lijevi=0; desni=0; cvor=cvorx; broj=ukupno_cvorova iduci=NULL
Poveati 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 razliit 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)

Nai zadnji vor (s najveim rednim brojem)
Nai 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
Sortiranje pomou hrpe (Heap sort)

Sve dok nije kraj podataka initi
Uitati 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 Opi 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 neureeni skup parova e{u,v}. u i v su vorovi iz V(G).
u i v su krajnje toke grane e. u i v su susjedni vorovi. Grana e
pridruena 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 tokama je petlja.
Stupanj deg(u) vora u odreen je brojem grana pridruenih voru.
Zbroj deg(u) za sve vorove jednak je dvostrukom broju grana. vor
za koji je deg(u) =0 zove se izolirani vor.
Put duine 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 izmeu 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.
Razapinjue stablo sadri sve vorove grafa.

2
1
3
4
5
e
2
e
4
e
6 e
3
Razapinjue 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 pridrui smjer tj. grana e{u,v}
predstavlja put od vora u do vora v ali ne i obrnuto. Grane takvog
grafa oznaavaju se dodatno strijelicama.Ako je svaka grana oznaena
nekavim brojem w veim od nule (duinom) graf postaje teinski graf.
1
3
4
5
0.8 1
0.8
0.7
1
1.5
3.2
0.35
0.05
Graf G
2
4
7
3
5
2
7
6
8
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 moe se potencirati.
0 0 1 0 0 k-ta potencija te matrice daje broj puteva duine 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

Matrica incidencije: I[c][g]=0 ako vor c nije incidentan grani g .
I[c][g]=1 ako je vor c incidentan grani g i
grana g ulazi u vor c.
I[c][g]=-1 ako je vor c incidentan grani g i
grana g izlazi iz vora c.
I[c][g]= 2 ako je vor c incidentan grani g i
grana g ulazi i izlazi iz vora..
-1 1 0 0 0
0 2 2 0 0
0 1 0 -1 0
I= -1 0 0 0 0
0 0 1 -1 0
0 0 1 0 1
0 0 0 2 0
1 0 -1 0 0
5.2.3 Obilazak grafa je sastavljanje popisa svih vorova;
zadan je graf G(V,E), broj vorova n i poetni 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.



Program
porbinst.cpp

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 teinski graf definirana je i matrica teina
W u kojoj je W[i][j]=w
ij
tj. teina grane od i-tog do j-tog vora.
Za teinski graf G (s prethodne slike) matrica W ima vrijednosti

NULL 0.8 NULL 0.7 NULL Ovdje NULL oznaava
NULL NULL 0.8 NULL NULL nepostojanje puta (put
W= 3.2 0.8 NULL NULL 1.5 duine beskonano)
NULL 0.05 1.0 0.35 NULL
NULL NULL NULL NULL NULL

Modificirani Warshallov algoritam nalazi matricu najkraih puteva Q
meu vorovima. Za matricu Q koja je poetno jednaka matrici W
vrijedi
Q[i][j]=min(Q[i][j],Q[i][k]+Q[k][j]
Modificirani Warshallov algoritam (algoritam najkraeg 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 najkraih 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 Najkrai put izmeu vorova grafa i vorove (i grane) na tom putu
nalazi se algoritmom Najkrai put pretraivanjem po irini (Napomena:
Algoritam zahtjeva da su vorovi oznaeni brojevima od 1 do n)

Uitati broj vorova n i matricu susjedstva S
Uitati poetni 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 najkrae putove od poetnog vora pc do svih
ostalih vorova. Udaljenosti vorova od poetnog pc na putu stavljaju se
u matricu Udaljenosti. i-ti red sadri podatke za i-ti vor. Prvi stupac
(s indeksom 0) sadri udaljenost, dok se u drugi stupac stavlja oznaka
prethodnog vora na putu.

Iz te matrice procedura ISPIS ispisuje vorove na najkraem 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 nai vor cmin s najmanjom udaljenou
Za svaki susjed i vora cmin koji ima status[i]=-2 initi
Staviti vor i u red
Nai u=udaljenosti[cmin][0] + susj[cmin][i]
Ako je status[i] =-2 ili u<udaljenosti[i][0] 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 reda 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]
Poveati i za 1
Kraj sve dok
Sve dok se stog ne isprazni initi
Skinuti vor sa stoga
Ispisati vor
Kraj sve dok





Matrica Udaljenosti sadri i krajnje vorove grana u najmanjem
razapinjuem stablu. Ispis tih vorova postie se procedurom
ISPIS_NRS koja je neto proirena 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)

Openito rekurzivna procedura ima najee gornji oblik tj.
Ako je rjeenje trivialno vratiti to rjeenje
U suprotnom obaviti rekurzivni poziv
Kruskalov algoritam: Nainiti najmanje
Razapinjue stablo dodavanjem najmanje
grane koja ne ini petlju.

Uitati broj vorova N
Uitati matricu GRANE
(Poetni i zavrni cvor i duina grane)
Sortirati GRANE po duini svake grane
u rastuem redoslijedu
Pozvati Kruskal(N)
Ispisati grane u stablu


Rekurzivna procedura Kruskal (N)

Ako je N=0 vrati se
Postaviti cvor1=GRANE[g][0]
Postaviti cvor2=GRANE[g][1]
Sve dok je U_stablu(cvor1)=1 i U_stablu(cvor2)=1
poveati g za 1
Staviti granu g u stablo
Ako je U_stablu(cvor1)=0 i U_stablu(cvor_2)=0 pozvati
Kruskal(N-2)
U suprotnom pozvati Kruskal(N-1)
6.2 Quick sort rekurzijom

Glavna procedura QUICKSORT
Uitati n brojeva u vektor A
Pozvati QUICK1(0,n-1,A)
Ispisati n brojeva iz vektora A

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

Procedura QUICK2(d,g,A)
/* Nai indeks m tako da su brojevi lijevo manji od A[m] a desno vei */
Ponavljati do beskonanosti
Postaviti m=d
Ako je d=g vratiti d
Sve dok je A[g] > A[m] i m!=g smanjivati g 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 poveavati d za 1
Ako je m=d vratiti m
Zamijeniti A[m] i A[d]
Postaviti m=QUICK2(d,g,A)

6.3 Rekurzivno sortiranje ubacivanjem (Merge sort)


Glavna procedura MERGESORT
Uitati n brojeva u vektor A
Pozvati SORT(0,n-1,A)


Procedura SORT(d,g,A)
Ako je d=g vratiti se u pozivajuu 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]
Poveati i1 za 1
U suprotnom initi
Postaviti T[i]=A[i2]
Poveati i2 za 1
U suprotnom
Ako je i1>s initi
Postaviti T[i]=A[i2]
Poveati i2 za 1
U suprotnom initi
Postaviti T[i]=A[i1]
Poveati 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)
Ispii vor cvor
Ako postoji desni pozovi LND(desni)

NLD obilazak: procedura NLD(cvor)
Ispii 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)
Ispii vor cvor


6.5 Elektromobil

Zadatak: Vozilo s pogonom na bateriju (akumulator) s jednom baterijom
prijee udaljenost k. Na raspolaganju je n baterija na poetnom mjestu.
Uz pogonsku bateriju vozilo ima mjesta za prijevoz jo samo jedne
baterije. Koliku udaljenost x moe prijei vozilo.
Rjeenje:
x
n
x
n-1 x
2
=k x
1
=k
d
2
d
1
Vozilo prelazi udaljenost x prevozei n-1 bateriju vie puta (mora se i
vraati, 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
openito 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 plou postaviti osam kraljica tako da se
meusobno ne napadaju. Nai sva mogua rjeenja.

Rjeenje:

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 poveati Ploca[i][stupac] za 1
Za svaki j=1 do 8 poveati 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 poveati 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 slina proceduri Zauzmi.
Razlika je u tome to se obavlja smanjivanje za 1 (umjesto poveanja)
broja u polju koje vie ne napada skinuta kraljica. Takoer se na polje
koje je bilo zauzeto kraljicom stavlja broj 0.

Procedura Ispis poveava broj rjeenja 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 *.

Vous aimerez peut-être aussi