107
Algoritmi i strukture podataka (2+1+1)**S ra: an: Pascal i programiranje, ZOTK, Ljubljana, 1989. : Informatika 2, Element, Zagreb, 1998. hutz: Theory and Problems of Data Structures, Mc G . : The Art of Computer Programming, Vol. 1. Fundame ithms, Vol. 2. Seminumerical Algorithms, on Wesley, 1997. hutz, Lipson: Discrete Mathematics, Mc Graw Hill,N .

Algoritmi i strukture podataka prezentacija ETF Osijek

Embed Size (px)

DESCRIPTION

Algoritmi i strukture podataka prezentacija ETF Osijek

Citation preview

Page 1: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 2: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 3: Algoritmi i strukture podataka prezentacija ETF Osijek

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...

Page 4: Algoritmi i strukture podataka prezentacija ETF Osijek

Primjer: Raskršće “Đakovština” (prije rekonstrukcije)

CD

A B

EF

G

H I

AH

CE DF BI

AG

Fizikalna stvarnost Matematički model

Page 5: Algoritmi i strukture podataka prezentacija ETF Osijek

CD

A B

EF

G

H I

AH

CE FD IB

AG

5555

1.

2.

3.

4. 5.

Page 6: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 7: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 8: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 9: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 10: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 11: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 12: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 13: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 14: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 15: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 16: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 17: Algoritmi i strukture podataka prezentacija ETF Osijek

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):

Page 18: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 19: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 20: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 21: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 22: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 23: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 24: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 25: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 26: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 27: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 28: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 29: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 30: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 31: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 32: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 33: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 34: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 35: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 36: Algoritmi i strukture podataka prezentacija ETF Osijek

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;)

Page 37: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 38: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 39: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 40: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 41: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 42: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 43: Algoritmi i strukture podataka prezentacija ETF Osijek

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]

Page 44: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 45: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 46: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 47: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 48: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 49: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 50: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 51: Algoritmi i strukture podataka prezentacija ETF Osijek

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]

Page 52: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 53: Algoritmi i strukture podataka prezentacija ETF Osijek

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 )

Page 54: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 55: Algoritmi i strukture podataka prezentacija ETF Osijek

Zapis 2

prvi

Zapis 1 Zapis 3

x 7x 25 x 12iduci iduciNULL

iduci

Sortiranje povezanim popisom (Insert sort)

Page 56: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 57: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 58: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 59: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 60: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 61: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 62: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 63: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 64: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 65: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 66: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 67: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 68: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 69: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 70: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 71: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 72: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 73: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 74: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 75: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 76: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 77: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 78: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 79: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 80: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 81: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 82: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 83: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 84: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 85: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 86: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 87: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 88: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 89: Algoritmi i strukture podataka prezentacija ETF Osijek

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]

Page 90: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 91: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 92: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 93: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 94: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 95: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 96: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 97: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 98: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 99: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 100: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 101: Algoritmi i strukture podataka prezentacija ETF Osijek

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]

Page 102: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 103: Algoritmi i strukture podataka prezentacija ETF Osijek

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)

Page 104: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 105: Algoritmi i strukture podataka prezentacija ETF Osijek

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

Page 106: Algoritmi i strukture podataka prezentacija ETF Osijek

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.

Page 107: Algoritmi i strukture podataka prezentacija ETF Osijek

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 “*”.