Upload
max-poshtar
View
74
Download
6
Embed Size (px)
DESCRIPTION
Algoritmi i strukture podataka prezentacija ETF Osijek
Citation preview
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.
Sadržaj predmeta:
1. Osnovni pojmovi2. Elementarni podaci3. Slučajni brojevi4. Linearne strukture a) Vektori i matrice b) Stogovi c) Redovi5. Nelinearne strukture a) Stabla b) Grafovi6. Rekurzije
1. Osnovni pojmovi:
Algoritam (po Muhammad ibn Musa al-Kwarizm): opis postupka koji nakon konačnog broja radnji daje suvisli rezultat .
Algoritam 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čunalnistvarnost čki model RITAM podataka program
Pdp Ponavljati..................Sve dok..
do{ S/= V[i++];
}while...
Primjer: Raskršće “Đakovština” (prije rekonstrukcije)
CD
A B
EF
G
H I
AH
CE DF BI
AG
Fizikalna stvarnost Matematički model
CD
A B
EF
G
H I
AH
CE FD IB
AG
5555
1.
2.
3.
4. 5.
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. 2.
3.
4.
5. 1. 5.
3.
4.
2.
Algoritam bojanja grafa:Boja=1Sve 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 iPostavi Obojani[1]=iPostavi nb=1Naznači da je i-ti čvor obojan bojom BojaZa svaki čvor j grafa činiti Ako je čvor j neobojan i njegovi susjedi nisu u vektoru Obojani[] postavi boju čvora j na Boja
ProgramBojanje.cpp
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 di s vrijednostima [0,B-1]Broj N napisan nizom od n znamenaka dn-1,dn-2,... ,d2,d1,d0 ima vrijednost
N=
Kod za cijele brojeve definira pomoću bitova (znamenaka 0 i 1) pozitivne i negativne brojeve. Negativni brojevi definirani su prekodualnog komplementa
1
0
n
i
ii Bd
Komplement broja u pozicionom sustavu s bazom B definiran je kao:
komp(N)=Bn-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. Aritmetički dodati 1
DOKAZ: komp(N)= 2n- =2
n- =
= 2
n+ = 2
n+ - =
= 2
n+ -2
n+1= +1
1
0
2n
i
i
ib
1
0
2)11(n
i
i
ib
1
0
2n
i
i
1
0
2)1(n
i
i
ib
1
0
2)11(n
i
i
ib
1
0
2)1(n
i
i
ib
1
0
2)1(n
i
i
ib
Algoritam binarnog komplementiranja (broj je u vetoru V[] od 16bitova)
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 iPostaviti i=0Ponavljati 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
ProgramBinkomp.cpp
Ili kraće:
Postaviti i=0Sve dok je b[i]=0 povećati i za 1Povećati i za 1Sve dok je i<n činiti Postaviti b[i]=(b[i]!=‘1’)+’0’ Povećati 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+127Eksponent E=k-127Emin=-127 --> xmin=2-127=10-38
Emax= 128 --> xmax=2 128=1038
Mantisa: 1=<m<2
x=2E*m
ProgramFLOHEX.cpp
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 Ludolfovom metodom:
Sn Sn+1 ln2 = S2
n+1-(Sn/2)2
(1-ln)2 = 1-(sn/2)2
Sn+1 = 2- 4-(Sn/2)2
Prilago-
đeno za Sn+1 = Sn/ 2 + 4-Sn2
numerički račun:
ln
Za opisane mnogokutnike: Tn+1=2Tn/( 4+Tn2 +2)
Za i-tu iteraciju je = 2i-1 Si
Početno je (za upisani i opisani kvadrat) S= 2, T=2
Algoritam “Ludolf”
Postaviti S= 2 i T=2Učitati broj iteracija kZa svaki i = 2 do k činiti Postaviti s=2i-1*S
Postaviti t=2i-1*T
Ispisati s i t
Postaviti S= S/ 2 + 4-S2
Postaviti T= 2T/( 4+T2+2) Kraj iteracije po i
r=1
T
S
Računanje broja
Računanje brojaRezultati: 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 (npr. RND, random) koja generira jednoliko raspodjeljene slučajne brojeve.
Brojevi su jednoliko raspoređeni (distribuirani) u definiranom intervalu , [x1,x2] ako su vjerojatnosti pojavljivanja, u bilo kojim podintervalima iste širine x, međusobno jednake.
0 1 2 3 4 5 Razredi
R f[r] fr[r] %
0 1006 16.771 978 16.302 1000 16.673 1034 17.234 995 16.585 987 16.45Uk: 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.Pretpostaviti da postoji generator jednoliko raspodijeljene varijable učiji inetrval je [0,1)
Učitati m, n, x1 i x2Za svaki i=0 do n-1 postaviti Hist[i]=0Postaviti sr=(x2-x1)/nZa svaki i=1 do m činiti Generirati x=x1+(x2-x1)*u Postaviti k=(x-x1)/sr Povećati Hist[k] za 1 Kraj iteracijeZa svaki i=0 do n ispisati Hist[i]
ProgramHistuni.cpp
Slučajni brojevi (5)
Nejednolika raspodjela:Primjer: Simulirati bacaje kocke kod koje se broj 3 pojavljuje 10% češće od ostalih brojeva
0 1 z
x 1.1 x
1 2 3 4 5 6
Algoritam:Postaviti x=0.164Generirati slučaji broj u (0<=u<1)Ako je u>=2*x i u<3.1*x postaviti R=3U 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
ProgramVaralica.cpp
Slučajni brojevi (6)
Nejednolika raspodjela - općenito:1. Diskretna: p0,p1,..pi...pn-1 su vjerojatnosti pojavljivanja varijable x u razredu i.
11
0
n
i
ip
0 p0 p1 pi pn-1 1
<=x<
1
0
i
j
jp
i
j
jp0
1
x
i
u
k
ProgramHistnoun.cpp
1
u
F(x)=
x
x
x
dxxf1
)(
x1 x(u) x2
Slučajni brojevi (7)Nejednolika raspodjela:
2 . Kontinuirana
x(u)=F-1(u)
Slučajni brojevi (8)Primjeri kontinuirane razdiobe:
1. Normalna: f(x)=
2
)( 2
2
1 x
e F(x)=?, F-1(u)=?
)2cos()1ln(2 uux
x
f(x)
Program
Histnorm.cpp
Slučajni brojevi (9)2. Eksponencijalna razdioba: f(x)= e-x | 0<=x< F(x)=1-e-x
x= - 1/ ln(1-u) x= - 1/ ln(u)
1
f(x), F(x)
x
u
Rezultati simulacijeHistogram 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)
ProgramHistexp.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) Pretraživanja: Za zadani podatak X naći da li se onnalazi u skupu V[] i na kojem mjestu.
a.1) Sekvencijelno pretraživanje.Postaviti i=0Sve 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.
Maksimalan broj ispitivanja O(n)=nO(n) je red veličine (engl order) ili kompleksnost algoritma.
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-1Ponavljati 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=dgAko je V[s]=X naznačitida je X na s-tom mjestu u skupu.U suprotnom naznačiti da X nije u skupu
O(n)=log2(n)
ProgramBintraz.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 pretraživanje: Traži 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 “Iduća permutacija”
Zadan je vektor V od n elemenata u kojem je početno V[i]=i. To je prvapermutacija 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: P0 = 0 1 2 3 4 5 tj. vektor P0={0,1,2,3,4,5}
Pm = 0 1 2 5 4 3 Naći Pm+1 (Pm+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
ProgramNextperm.cpp
Algoritam procedure “Nadji_i”
Postaviti i=n-1Sve dok je V[i-1]<V[i] smanjiti i za 1Smanjiti i za 1
Algoritam procedure “Nadji_j”
Postaviti j=i+1Za svaki k=i+1 do n-1 činiti
Ako je V[k]>V[i] i V[k]<V[j] postaviti j=k
ProgramAllperm.cpp
2. Matricea) Magični kvadrati neparnog reda:Sačiniti kvadratnu matricu A neparnog reda m popunjenu brojevima [1,m2] tako da sume svih redaka i stupaca i obiju dijagonalabudu međusobno jednake (i jednake (1+m2)*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
ProgramMagkvad.cpp
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]=0Postaviti i=m-1 /*Počni od srednjeg reda */Postaviti j=0 /* Počni od lijevog stupca */Postaviti n=1Sve dok je n<=m*m činiti
Postaviti A[i][j]=nSmanjiti 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,”dolje”)”
Za svaki j=0 do m/2-1 činitiZa 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 X1*A*A-1= X1*I X2*X1*A*A-1= X2*X1*I
X3*X2*X1*A*A-1= X3*X2*X1*I Xn*..X3*X2*X1*A*A-1= Xn*..X3*X2*X1*I
Ako Xn*..X3*X2*X1*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 Xi) početna matrica pretvori u jediničnu, tim istim transformacijama se jedinična pretvori u inverznu!
Xn*..X3*X2*X1*A*A-1= Xn*..X3*X2*X1*I
Algoritam “INVMAT”
Učitati mUčitati matricu A[m][m]Formirati jediničnu matricu I u stupcima od m do 2*m-1 matrice A (A postaje tkzv. blok matrica)Postaviti d=1 Postaviti i=0Sve 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 činitiAko je A[k][i]!=0 onda činiti
Za svaki j=i do m-1 činitiPostaviti t=A[k][j]Postaviti A[k][j]=A[k][i]Postaviti A[k][i]=tKraj za svaki j
Postaviti d = - dVratiti se u pozivajuću proceduruKraj ako je
Kraj za svaki kPostaviti 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]
ProgramInvmat.cpp
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.
Popunjenidio stoga
Prazni diostoga
Pokazivač stogaSp=3
5
4
3
2
1
0
Stog je prazan ako je Sp = -1Stog je pun ako je Sp=n-1Stog se “puni” i “prazni” na “vrhu”. Podatak koji je zadnji stavljen nastog, bit će prvi skinut sa stoga (LIFO - Last In - First out)Stavljenje na stog obavlja procedure PushSkidanje 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 iAko 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 suprotnomProcedura Očisti_stogPostaviti 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 TorbaOčisti_stogPonavljati Ako je uk_tez=T postaviti rjes=1 U suprotnom
Ako je uk_tez<T i pred <n onda pozvati proceduru u_torbuU suprotnom
Pozvati proceduru iz_torbeAko je pred<n pozvati proceduru u_torbuKraj u suprotnom
Kraj u suprotnom sve dok nije rjes i nije prazan_stog
Procedura u_torbuPovećati pred za 1Povećati uk_tez za Tezine[pred]Pozvati proceduru push(pred)
Procedura iz_torbePozvati proceduru pop(pred)Smanjiti uk_tez za Tezine[pred]
Glavni program Putna_torbaPostaviti rjes=0, uk_tez=0 i pred=0Učitati T i n Za svaki i=1 do n učitati Tezine[i]Pozvati proceduru TorbaAko je rješenje nadjeno
Za svaki i=0 do pred-1 ispisati Tezine[predmeti[i]] U suprotnom ispisati poruku da nema rješenja
ProgramiKnapsac1.cpp
Knapsac2.cpp
Algoritam “Povrh”
10
,11
,1;1
1
1
k
kk
k
m
n
m
n
m
n
Isprazniti stogove s1 i s2Staviti n na stog s1Staviti m na stog s2Postaviti Povrh=0Ponavljati
Skinuti n sa stoga s1Skinuti m sa stoga s2Ako je m=n ili n=1 ili m=0 povećati Povrh za 1U suprotnom
Staviti n-1 na stog s1Staviti m-1 na stog s2Staviti n-1 na stog s1Staviti m na stog s2
do praznog stoga s1Ispisati Povrh
ProgramPovrhs.cpp
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
desnood 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 193115 25
7 9 15 193112 25
12 9 15 19317 25
A[m]>A[g]
A[d]>A[m]
PonavljatiPostaviti m=dgSve dok je A[gg]>A[m] i gg<>m smanjiti gg za 1Ako je gg=m vratiti mZamijeniti A[m] i A[gg]Postaviti m=gg Sve dok je A[dg]>A[m] i dg<>m povećati dg za 1Ako je dg=m vratiti mZamijeniti A[m] i A[dg]Do beskonačnosti
ProgramQuickss.cpp
Algoritam Quick
Učitati broj podataka n i n podataka u vektor A[]Staviti 0 na stogStaviti n-1 na stogPonavljati
Skinuti g sa stogaSkinuti d sa stogaPostaviti m=Nadji_m(d,g)Ako je d<m-1 onda
Staviti d na stogStaviti m-1 na stogKraj ako je
Ako je g>m+1 ondaStaviti m+1 na stogStaviti g na stogKraj 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 pokazujena 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 iAko 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 suprotnomProcedura Očisti_redPostaviti ul=-1Postaviti 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 23 U cikličkom redu se ulazni pokazivač
povećava izrazom ul=mod(ul+1,n) .
Isto vrijedi i za izlazni pokazivac.
Ciklički red je prazan ako je ul=iz-1 i zadnja promjena bio je izlaz
Ciklički red je pun ul=iz-1 i zadnja promjena bio je ulaz.
Primjer za red: Algoritam “Labirint”U zadanom labirintu (grafu) naći put od ulaza (početnog čvora p) doizlaza (završnog čvora z).
1(p)
8
18
9
19
2115
16
28
7
17 20
4
22
23
14
2627(z)
32
5
613
1211
10
ProgramLabirint.cpp
Algoritam procedure LabirintZa 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 RedPostaviti Status[Su]=sKraj 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
PodaciPodaci Podaci
Stvaranje povezanog popisa:Postaviti prvi=NULLUčitati podatak ySve 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=trenutniU suprotnom činiti
Postaviti prethodni=trenutniPostaviti trenutni=nova adresa u dinamičkoj memorijiPostaviti iduci na adresi prethodni = trenutniKraj ako je
Postaviti x na adresi trenutni = y /* trenutni->x=y */
Učitati podatak y Kraj sve dokPostaviti iduci na adresi trenutni = NULL ( (*trenutni).iduci=NULL )
Obilazak kroz povezani popis (od početka do kraja)
Postaviti trenutni=prviSve 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 pokazivačima na početak i kraj popisa
Zapis 1 Zapis 2 Zapis n
PodaciPodaci PodaciPodaci
prvi zadnji ProgramPovpop1.cpp
Zapis 2
prvi
Zapis 1 Zapis 3
x 7x 25 x 12iduci iduciNULL
iduci
Sortiranje povezanim popisom (Insert sort)
Algoritam “Insert sort” (padajući redoslijed)Postaviti pokazivač prvi=NULLUčitati podatak ySve 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 adrStaviti 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 dokAko nije kraj popisa činiti
Ako je trenutni= =prvi činiti /* Najveći podatak */Postaviti prvi=adrPostaviti iduci na adresi prvi = trenutniU suprotnom /* Opći slučaj */
Postaviti iduci na adresi adr=iduci naadresi prethodni
Postaviti iduci na adresi prethodni = adr Kraj ako je
U suprotnom /* Najmanji podatak */Postaviti iduci na adresi trenutni = adrPostaviti iduci na adresi adr=NULLKraj ako je
Kraj sve dok Kraj ako je
Programinssortp.cpp
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 čvorovimogu 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 cd
ef 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 nasljednikKorjen 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 upovezanom 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 redSve dok red nije prazan činiti
Skinuti čvor iz red-aIspisati čvorAko postoji nasljednik staviti nasljednik u redSve 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
Programopcestab.cpp
5.1.2. Binarno stabloBinarno 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 prikazanona 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 obilazakprati put od korjena (vrha) stabla “u dubinu” do najnižeg nivoa (odakleisto može početi obilazak). Uobičajeno je 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 tomsluč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činunačinu obilaska naći ispred, između ili iza podređenih č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
cd
e
fg h
NLD: R, a, c, f, d, b, e, g, hLND: f, c, a, d, R, b, g, e, hLDN: f, c, d, a, g, h, e, b, R
Za sva tri obilaska koristi se stog.
5. 1. 3 Algoritam NLD obilaska
Isprazniti stogIspisati korjen stabla i staviti ga na stogSve dok stog nije prazan činiti
Sve dok cvor ima lijevi nasljednik činitiPostavit cvor=lijevi Staviti cvor na stogIspisati cvorKraj sve dok
Sve dok cvor nema desni nasljednik i stog nije prazan činiti Skinuti cvor sa stogaKraj sve dok
Ako je stog prazan završiti obilazakIspisati desniStaviti desni na stogKraj sve dok
Programstablopr.cpp
5.1.4. Algoritam LND obilaska
Isprazniti stog i staviti “KRAJ” na stogPostavit cvor = korjen stablaPonovljati
Sve dok postoji lijevi nasljednik činitiStaviti cvor na stogPostaviti cvor=lijeviKraj sve dok
Postaviti desni_nas=0Ponavljati
Ispisati cvorAko postoji desni nasljednik
Postaviti cvor=desni nasljednikPostaviti desni_nas=1U 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
Programstabloin.cpp
5.1.5. Algoritam LDN obilaskaIsprazniti stogPostaviti cvor=korjen stablaPonavljati
Sve dok postoji lijevi činitiStaviti cvor na stogAko postoji desni staviti ga na stog s oznakom “D”Postaviti cvor=lijeviKraj sve dok
Staviti cvor na stog Ako postoji desni staviti ga na stog s oznakom”D”Postaviti desni_nas=0Ponavljati
Skinuti cvor sa stog-aAko cvor ima oznaku “D” postavit desni_nas=1U suprotnom ispisati cvor Do uvjeta prazan stog ili desni_nas=1
Do uvjeta prazan stog
Programstablopo.cpp
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 (engl. naziv je Binary Search Tree).
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 stabluUčitati podatak P Postaviti cvor=korjen stablaPostaviti nadjen=0Postaviti nadredjeni=0Sve dok je nadjen=0 činiti
Ako je cvor=P postaviti nadjen=1U suprotnom činiti
Postaviti nadredjeni=cvor Ako je P<cvor činiti
Ako postoji lijevi postaviti cvor=lijeviU suprotnom postaviti nadjen=-1
Ako je P>cvor činitiAko postoji desni postaviti cvor=desniU 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 nadredjeniAko 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 nadredjeniU suprotnom dodaj P kao desni nasljednik od nadredjeni Kraj u suprotnom
Programporbinst.cpp
Algoritam “Brisi P” brisanja iz poredanog binarnog stabla
Algoritmom traženja “Nadji P” naći čvor P i njemu nadredjeniAko 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 činitiNaći čvor Lndnas koji je LND nasljednika od desnog nasljednika čvora PStaviti Lndnas na mjesto čvora PKraj u suprotnom
Kraj u suprotnom Program
porbinst.cpp
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 nasljednikasu vanjski, ostali su unutarnji. Unutarnji
čvor
Vanjski čvor9 7
8 6 4
12 14Svakom vanjskom čvoru može se pridjeliti brojčana vrijednost ili težinačvora. Dužina puta li do vanjskog čvora i definirana je brojem grana kojetreba proći od korjena do vanjskog čvora. Težinski put do čvora i tj. wi
definiran je umnoškom li wi. Ukupni težinski put stabla definiran je s W=li wi za sve vanjske čvorove i . Za nactrano stablo jeW=(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 wi staviti u skup Ws{wi}Sve dok skup Ws ima više od jedan član činiti
Naći dva najmanja elementa wmin1 i wmin2 u skupu WsUbaciti novi čvor stežinom wn= wmin1 + wmin2 u skup WsIzbaciti čvorove wmin1 i wmin2 iz skupa WsKraj 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 desnim nasljednicima s 1.
Huffmanov kod koristi se pri kodiranju poruka. Znakovima koji sečešće pojavljuju dodjeljuje se kraći binarni niz a rjeđe pojavljivanimznakovima dodjeljuje se duži binarni niz.
3154
Npr. želimo kodirati poruku “Drvo i Drava” a zadano je da je prosječnopojavljivanje znakova u tekstu hrvatskog jezika dato s prva dva stupca tabele:
ZNAK wi Huffmanov kodpraznina 7% 1 1D 0.5% 0 1 0 0r 2% 0 1 1a 5% 0 0o 2.5% 1 0 0 v 1% 0 1 0 1 i 3% 1 0 1
Kodovi za navedene znakoveprema Huffmanovom stabluna slici dati su u trećem stupcutabele. Dekodirati: 0101101011101110101101011
D v0.5
1.5 2 2.5 3r o i
5.53.55a
8.5
7praznina
0
0 1
10
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 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 svakojpopunjenoj razini n ima 2n -tu čvorova (zadnja razina ne mora biti popunjen pa tamo taj broj može biti i manji). Ako se čvorovimapridjele 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 i2. Nadređeni i-tom čvoru ima redni broj n(i)=int(i/2)3. Lijevi nasljednik i-tog čvora ima redni broj l(i)=2*i4. Desni nasljednik i-tog čvora ima redni broj l(i)+1
Razina 0Razina 1
Razina 2
Razina 3
12 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 pomoću vektora HrpaAlgoritam 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 1Postaviti i=Hrpa[0]Postaviti Hrpa[i]=cvorSve dok je Hrpa[i]<Hrpa[i/2] i i>1 činiti
Zamijeniti Hrpa[i] i Hrpa[i/2]Podijeliti i s 2Kraj sve dok
Algoritam “Brisati cvor”
Naći i tako da je Hrpa[i]=cvorPostaviti j=Hrpa[0]Smanjiti Hrpa[0] za 1Postaviti Hrpa[i]=Hrpa[j]Postaviti Hrpa[j]=0Sve 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 činitiZamijeniti Hrpa[2*i+1] s Hrpa[i]Postaviti i=2*i+1
Kraj Ako jeKraj Sve dok
Algoritam “Dodaj u hrpu cvorx” (s povezanim popisom)
Dodijeliti pokazivaču pc prvu slobodnu adresuSlogu na adresi pc postavitilijevi=0; desni=0; cvor=cvorx; broj=ukupno_cvorova iduci=NULLPovečati ukupno_cvorova za 1Ako je prvi=NULL postaviti prvi=pcU 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 brisatiZamijeniti čvorove zadnji i cvorx
Sve dok je cvorx manji od svog lijevog ili desnog nasljednika činitiZamijeniti cvorx s manjim nasljednikomKraj sve dok
Izbaciti cvorx iz povezanog popisaSmanjiti ukupno_cvorova za 1
Sortiranje pomoću hrpe (Heap sort)
Sve dok nije kraj podataka činitiUčitati brojDodati broj u stablo HrpaKraj sve dok
Sve dok Hrpa nije prazna činitiIspisati korjen stabla HrpaBrisati korjen iz stabla HrpaKraj 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 čvorgrana
V(G)={1,2,3,4,5,6}E(G)={e1 ,e2 , e3 ,e4 ,e5 ,e6 ,e7 ,e8 }
e1= {1,2} e2= {2,3} e3= {2,4}e4= {1,4} e5= {3,4} e6= {3,5}e7= {1,5} e8= {4,4}
1 3
4
5
e1 e2
e4 e5
e6
e7
e8
6
e3
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. Čvorza koji je deg(u) =0 zove se izolirani čvor.Put dužine n je niz P(v0 ,v1 ,v2 .....vn ) za koje vrijedi da su vi i vi+1
susjedni čvorovi. Ako je v0 = vn , put P je petlja. Ako između bilo koja dva čvora grafa G postoji put, tada je to povezanigraf. 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
e2
e4
e6e3
Razapinjuće stablo grafa G
1 3
4
5
e1 e2
e4 e5
e6
e7
e8
e3
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 takvoggrafa 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 1 0.8
0.7 1
1.5
3.20.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 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 S2= 0 1 1 1 0 S3 = 1 2 2 1 1 S4 = 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 igrana g izlazi iz čvora c.I[c][g]= 2 ako je čvor c incidentan grani g igrana 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 početni čvor c0.
Algoritma “Obilazak po širini”
Za svaki i=0 do n-1 postaviti Status[i]=0Staviti c0 u RedPostaviti 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.
Programporbinst.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]=0Za 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]=wij 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/stupacaPostaviti matrica Q= matrica WZa 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 putunalazi 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 SUčitati početni čvor pc i krajnji čvor kcZa svaki i=1 do n postaviti Status[i]=-2 Pozvati proceduru STABLOPozvati proceduru ISPIS
Procedura Stablo nalazi najkraće putove od početnog čvora pc do svihostalih č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 oznakaprethodnog č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 redPostaviti udaljenosti[pc][0]=0 i udaljenosti[pc][1]=0Sve 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 redNaći u=udaljenosti[cmin][0] + susj[cmin][i]Ako je status[i] =-2 ili u<udaljenosti[i][0] činiti
Postaviti udaljenosti[i][0]=uPostaviti udaljenosti[i][1]=cminPostaviti status[i]=0U suprotnom postaviti status[i]=-1Kraj ako je
Kraj za svaki susjed iSkinuti čvor cmin iz reda red
Kraj sve dok
Algoritam procedure “ISPIS”
Staviti kc na stogPostaviti 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 1Kraj sve dok
Sve dok se stog ne isprazni činitiSkinuti čvor sa stogaIspisati čvorKraj sve dok
Matrica Udaljenosti sadrži i krajnje čvorove grana u najmanjemrazapinjućem stablu. Ispis tih čvorova postiže se proceduromISPIS_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]=1Za svaki i=1 do n činiti Postavit cvor=Udaljenosti[i][1] Postaviti Status[cvor]=0 Kraj za svaki iZa svaki i=1 do n
Ako je Status[i]=1 pozvati proceduru ISPIS
6. Rekurzivne procedure6.1. Osnovni pojmovi
Rekurzivne procedure ostvaruju se tako da se unutar neke procedurePROC obavi poziv te iste PROC procedure. Na primjer, faktorijel prirodnog broja definiran je s N!=N*(N-1)*(N-2)*...*2*1 iliN!=N*(N-1)! Algoritam NFAKT rekurzivne procedure NFAKT(n) će zato biti:
Ako je n=1 vratiti 1U 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šenjeU suprotnom obaviti rekurzivni poziv
Kruskalov algoritam: Načiniti najmanje Razapinjuće stablo dodavanjem najmanje grane koja ne čini petlju. Učitati broj čvorova N Učitati matricu GRANE
(Početni i završni cvor i dužina grane) Sortirati GRANE po dužini svake grane
u rastućem 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 povećati 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”Učitati n brojeva u vektor APozvati 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 pozivajući programPostaviti 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 */Ponavljati do beskonačnosti
Postaviti m=dAko je d=g vratiti dSve dok je A[g] > A[m] i m!=g smanjivati g za 1Ako je m=g vratiti mZamijeniti A[m] i A[g]Postaviti m=gSve dok je A[d] < A[m] i m!=d povećavati d za 1Ako je m=d vratiti mZamijeniti A[m] i A[d]Postaviti m=QUICK2(d,g,A)
6.3 Rekurzivno sortiranje ubacivanjem (Merge sort)
Glavna procedura “MERGESORT”Učitati n brojeva u vektor APozvati SORT(0,n-1,A)
Procedura SORT(d,g,A)Ako je d=g vratiti se u pozivajuću proceduruPozvati 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+1Za 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 cvorAko postoji desni pozovi LND(desni)
NLD obilazak: procedura NLD(cvor)Ispiši čvor cvorAko 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:
xn xn-1 x2=k x1=k
d2
d1
Vozilo prelazi udaljenost x prevozeći n-1 bateriju više puta (mora se ivrać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 d1=k, d2=x2+d1 općenito je dn =xn + dn-1
ili dn = k/(2*n-3)+ dn-1 .Algoritam funkcije d(n,k) glasiAko je n=1 vrati kU 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]=0Postaviti br_rjes=0Pozvati proceduru Postavi(1)
**
**
**
* *
1
8
1 8
Procedura Postavi (redak)
Za svaki j=1 do 8 činitiAko je Ploca [redak][j]=0 činiti
Pozvati proceduru Zauzmi(redak,j)Ako je redak=7 pozvati proceduru IspisU 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 1Za svaki j=1 do 8 povećati Ploca[redak][j] za 1Za 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 1Kraj ako je
Kraj za svaki jKraj 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 Plocakoja ima osam redaka i stupaca. Polje s brojem manjim od 9 ispisuje sekao “ “ (praznina), dok se polje s brojem 9 (polje na kojem je kraljica) prikazuje znakom “*”.