algoritmi i strukture podataka
DESCRIPTION
Algoritmi i strukture podataka. Prof. dr. sc. Damir Kalpić Prof. dr. sc. Vedran Mornar Prof. dr. sc. Krešimir Fertalj Doc. dr. sc. Gordan Gledec Dr. sc. Zvonimir Vanjak Dr. sc. Ivica Botički, dipl. ing. Mr. sc. Boris Milašinović. - PowerPoint PPT PresentationTRANSCRIPT
19.04.23
Algoritmi i strukture podatakaAlgoritmi i strukture podataka
Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/2.5/hr/
Prof. dr. sc. Damir KalpićProf. dr. sc. Vedran MornarProf. dr. sc. Krešimir FertaljDoc. dr. sc. Gordan GledecDr. sc. Zvonimir VanjakDr. sc. Ivica Botički, dipl. ing.Mr. sc. Boris Milašinović
Algoritmi i strukture podataka, FER, 2008./09. 2 / 4219.04.23
Creative CommonsCreative Commons
slobodno smijete:slobodno smijete: dijelitidijeliti — umnožavati, distribuirati i javnosti priopćavati djelo — umnožavati, distribuirati i javnosti priopćavati djelo remiksiratiremiksirati — prerađivati djelo — prerađivati djelo
pod sljedećim uvjetima:pod sljedećim uvjetima: imenovanjeimenovanje. Morate priznati i označiti autorstvo djela na način kako je . Morate priznati i označiti autorstvo djela na način kako je
specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše korištenje njegova djela imate njegovu izravnu podršku). korištenje njegova djela imate njegovu izravnu podršku).
nekomercijalnonekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe. . Ovo djelo ne smijete koristiti u komercijalne svrhe. dijeli pod istim uvjetimadijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate . Ako ovo djelo izmijenite, preoblikujete ili stvarate
koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična ovoj. ovoj.
U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava. Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava.
Tekst licencije preuzet je s http://creativecommons.org/.
19.04.23
RekurzijaRekurzija
Algoritmi i strukture podataka, FER, 2008./09. 4 / 4219.04.23
Osnovna ideja rekurzijeOsnovna ideja rekurzije
procedura poziva samu sebeprocedura poziva samu sebe mora postojati završetak!mora postojati završetak!
Zašto se dug napravljen kreditnom karticom ne može platiti istom Zašto se dug napravljen kreditnom karticom ne može platiti istom kreditnom karticom?kreditnom karticom?
rekurzivni programi su kraći, ali je izvođenje programa duljerekurzivni programi su kraći, ali je izvođenje programa dulje neki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurzijuneki jezici (npr. stare verzije jezika FORTRAN) ne podržavaju rekurziju
za pohranjivanje rezultata i povratak iz rekurzije koristi se struktura za pohranjivanje rezultata i povratak iz rekurzije koristi se struktura podataka stogpodataka stog
rekurzija:rekurzija:
vidi: rekurzijavidi: rekurzija
rekurzija:rekurzija:
ako nije jasno što je ako nije jasno što je to, vidi: rekurzijato, vidi: rekurzija
Algoritmi i strukture podataka, FER, 2008./09. 5 / 3819.04.23
Elementarna rekurzija i sistemski stogElementarna rekurzija i sistemski stog
......
f(1);f(1);
......
void f(int i)void f(int i)
{{
int v;int v;
f(i+1);f(i+1);
return;return;
}}
void f(int i)void f(int i)
{{
int v;int v;
f(i+1);f(i+1);
return;return;
}}
void f(int i)void f(int i)
{{
int v;int v;
f(i+1);f(i+1);
return;return;
}}
void f(int i)void f(int i)
{{
int v;int v;
f(i+1);f(i+1);
return;return;
}}
11pov.adr.pov.adr.
vv
11pov.adr.pov.adr.
vv22
pov.adr.pov.adr.vv
11pov.adr.pov.adr.
vv22
pov.adr.pov.adr.vv33
pov.adr.pov.adr.vv
11pov.adr.pov.adr.
vv22
pov.adr.pov.adr.vv33
pov.adr.pov.adr.vv44
pov.adr.pov.adr.vv
ElementarnaRekurzijaElementarnaRekurzija
mainmain ff f’f’ f’’f’’ f’’’f’’’
Algoritmi i strukture podataka, FER, 2008./09. 6 / 4219.04.23
Izračunavanje faktorijelaIzračunavanje faktorijela
jedan od jednostavnih rekurzivnih algoritama jest izračunavanje jedan od jednostavnih rekurzivnih algoritama jest izračunavanje n!n! za za n >= 0n >= 0 0! = 10! = 1 1! = 11! = 1 n! = n* (n-1)!n! = n* (n-1)!
primjer: 4!primjer: 4!k = fakt (4);k = fakt (4);
= 4 * fakt (3);= 4 * fakt (3);
= 3 * fakt (2);= 3 * fakt (2);
= 2 * fakt (1);= 2 * fakt (1);
= 1 = 1
int fakt(int n){int fakt(int n){
if (n <= 1) {if (n <= 1) {
return 1;return 1;
} else {} else {
return n * fakt(n-1);return n * fakt(n-1);
}}
}}
Algoritmi i strukture podataka, FER, 2008./09. 7 / 3819.04.23
Izračuvananje faktorijelaIzračuvananje faktorijela
......
i=fakt(3);i=fakt(3);
......
int fakt(int n){int fakt(int n){
if (n <= 1) {if (n <= 1) {
return 1;return 1;
} else {} else {
return return
n * fakt(n-1);n * fakt(n-1);
}}
}}
33
FaktorijeliFaktorijeli
mainmainint fakt(int n){int fakt(int n){
if (n <= 1) {if (n <= 1) {
return 1;return 1;
} else {} else {
return return
n * fakt(n-1);n * fakt(n-1);
}}
}}
int fakt(int n){int fakt(int n){
if (n <= 1) {if (n <= 1) {
return 1;return 1;
} else {} else {
return return
n * fakt(n-1);n * fakt(n-1);
}}
}}
faktfakt fakt’’fakt’’fakt’fakt’
3322
332211
1122
66
Algoritmi i strukture podataka, FER, 2008./09. 8 / 4219.04.23
Zadaci za vježbuZadaci za vježbu
Napisati funkciju koja prima dva cjelobrojna argumenta Napisati funkciju koja prima dva cjelobrojna argumenta xx i i yy i vraća i vraća preko imena vrijednost preko imena vrijednost xxyy.. PotencijaRekurzijomPotencijaRekurzijom
Poziv funkcije:Poziv funkcije:k = pot(2,5);k = pot(2,5);
= 2*pot(2,4)= 2*pot(2,4)
= 2*pot(2,3)= 2*pot(2,3)
= 2*pot(2,2)= 2*pot(2,2)
= 2*pot(2,1)= 2*pot(2,1)
= 2*pot(2,0)= 2*pot(2,0)
= 1= 1
Algoritmi i strukture podataka, FER, 2008./09. 9 / 3819.04.23
Sadržaj stogaSadržaj stoga
pot(2,5)pot(2,5) pot(2,4)pot(2,4) pot(2,3)pot(2,3) pot(2,2)pot(2,2) pot(2,1)pot(2,1) pot(2,0)pot(2,0) returnreturn
11return return
2*12*1return return
2*22*2return return
2*42*4return return
2*82*8return return 2*162*16
(2,0)(2,0) 11
(2,1)(2,1) (2,1)(2,1) (2,1)(2,1) 22
(2,2)(2,2) (2,2)(2,2) (2,2)(2,2) (2,2)(2,2) (2,2)(2,2) 44
(2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) (2,3)(2,3) 88
(2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) (2,4)(2,4) 1616
(2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) (2,5)(2,5) 3232
Algoritmi i strukture podataka, FER, 2008./09. 10 / 4219.04.23
Zadaci za vježbuZadaci za vježbu
Što bi se dogodilo kada bi bila izostavljena linija:Što bi se dogodilo kada bi bila izostavljena linija:if (y <= 0) return 1;if (y <= 0) return 1;
funkcija bi samu sebe pozivala beskonačno puta i nikada ne bi vratila neku vrijednost u funkcija bi samu sebe pozivala beskonačno puta i nikada ne bi vratila neku vrijednost u glavni programglavni program
u gornjem primjeru dogodilo bi se ovo:u gornjem primjeru dogodilo bi se ovo:
pot(2,5);pot(2,5); = 2*pot(2,4)= 2*pot(2,4) = 2*pot(2,3)= 2*pot(2,3) = 2*pot(2,2)= 2*pot(2,2) = 2*pot(2,1)= 2*pot(2,1) = 2*pot(2,0)= 2*pot(2,0) = 2*pot(2,-1)= 2*pot(2,-1) = 2*pot(2,-2)= 2*pot(2,-2) = 2*pot(2,-3)= 2*pot(2,-3) ......
Algoritmi i strukture podataka, FER, 2008./09. 11 / 4219.04.23
Zadaci za vježbuZadaci za vježbu
Rješenje bez rekurzije:Rješenje bez rekurzije:
Napisati funkcije koja ispisuju sve brojeve do ili od Napisati funkcije koja ispisuju sve brojeve do ili od nn na razne načine na razne načine RekurzRekurzivniIspisRedomivniIspisRedom
Napisati rekurzivnu funkciju koja računa Napisati rekurzivnu funkciju koja računa n-tin-ti član aritmetičkog nizačlan aritmetičkog niza AritmetickiNizAritmetickiNiz
int pot(long x, long y) {int pot(long x, long y) {
int retval = 1;int retval = 1;
int i;int i;
for (i = 0; i < y; i++) retval *= x;for (i = 0; i < y; i++) retval *= x;
return retval;return retval;
}}
Algoritmi i strukture podataka, FER, 2008./09. 12 / 3819.04.23
Leonardo Pisano Fibonacci Leonardo Pisano Fibonacci
rođen: 1170 (vjerojatno) Pisa rođen: 1170 (vjerojatno) Pisa umro: 1250 (vjerojatno) Pisaumro: 1250 (vjerojatno) Pisa
godine 1202godine 1202. Liber abaci. Liber abaci : : uvođenje hindu-arapskih brojevauvođenje hindu-arapskih brojeva simultane linearne jednadžbesimultane linearne jednadžbe trgovački matematički problemitrgovački matematički problemi izračun profitaizračun profita preračunavanje valutapreračunavanje valuta
Algoritmi i strukture podataka, FER, 2008./09. 13 / 3819.04.23
Arapski brojeviArapski brojevi
ne poklapaju se s našim ne poklapaju se s našim “arapskim” brojevima“arapskim” brojevima
najveće dostignuće – uvođenje najveće dostignuće – uvođenje nule i težinskih mjestanule i težinskih mjesta
٠٠ 0 Sifer 0 Sifer ١١ 1 Wahid1 Wahid٢٢ 2 Ithinin 2 Ithinin ٣٣ 3 Thalatha 3 Thalatha ٤٤ 4 Arba'a 4 Arba'a ٥٥ 5 Kamisa 5 Kamisa ٦٦ 6 Sita 6 Sita ٧٧ 7 Saba'a 7 Saba'a ٨٨ 8 Thamania 8 Thamania ٩٩ 9 Tisa'a 9 Tisa'a ٠٠ ١١ 10 Ashara10 Ashara
Algoritmi i strukture podataka, FER, 2008./09. 14 / 4219.04.23
Fibonaccijevi brojeviFibonaccijevi brojevi
1, 1, 2, 3, 5, 8, 13, 21, 34,... (koji je sljedeći?)1, 1, 2, 3, 5, 8, 13, 21, 34,... (koji je sljedeći?)FF00=F=F11=1=1
FFii=F=Fi-2i-2+F+Fi-1i-1; i>1; i>1 program je vrlo kratak i potpuno odgovara matematičkoj definicijiprogram je vrlo kratak i potpuno odgovara matematičkoj definiciji
– učinkovitost je vrlo niskaučinkovitost je vrlo niska
int F(int n) {int F(int n) {
if (n <= 1) if (n <= 1)
return 1;return 1;
elseelse
return F(n-2) + F(n-1);return F(n-2) + F(n-1);
}}
Algoritmi i strukture podataka, FER, 2008./09. 15 / 4219.04.23
Fibonaccijevi brojevi – izvođenje programaFibonaccijevi brojevi – izvođenje programaF(0) se izračunava 5 putaF(0) se izračunava 5 putaF(1) se izračunava 8 putaF(1) se izračunava 8 putaF(2) se izračunava 5 putaF(2) se izračunava 5 putaF(3) se izračunava 3 putaF(3) se izračunava 3 putaF(4) se izračunava 2 putaF(4) se izračunava 2 putaF(5) se izračunava 1 putaF(5) se izračunava 1 putaF(6) se izračunava 1 putaF(6) se izračunava 1 puta
Ukupno : 25Ukupno : 25
Fibonacci
F(4)F(4)
F(6)F(6)
F(5)F(5)
F(0)F(0)
F(2)F(2)
22F(1)F(1)11
33 F(3)F(3)
F(1)F(1) F(2)F(2)44
F(0)F(0) F(1)F(1)55 66
77
88
99
F(3)F(3)
F(1)F(1) F(2)F(2)
F(0)F(0) F(1)F(1)1111
1313
1414 F(4)F(4)
F(0)F(0)
F(2)F(2)
1616F(1)F(1)1515
1717 F(3)F(3)
F(1)F(1) F(2)F(2)1818
F(0)F(0) F(1)F(1)1919 2020
2121
2222
2323
1212
1010
2424
2525
11 11
22
11 11
2211
33
55
11 11 11 11
11 11
11 22
33222211
33
88
1313
55
Algoritmi i strukture podataka, FER, 2008./09. 16 / 4219.04.23
Najveća zajednička mjeraNajveća zajednička mjera
jedan od najstarijih algoritama je Euklidov postupak za pronalaženjejedan od najstarijih algoritama je Euklidov postupak za pronalaženje najveće zajedničke mjerenajveće zajedničke mjere ((nzmnzm) dva nenegativna cijela broja:) dva nenegativna cijela broja:
Euklid
ako je ako je bb = 0 = 0
nzmnzm = = aa
inačeinače
nzmnzm = najveća zajednička mjera od = najveća zajednička mjera od bb i i
ostatka dijeljenja ostatka dijeljenja a a sa sa bb
Algoritmi i strukture podataka, FER, 2008./09. 17 / 4219.04.23
Najveća zajednička mjera – primjer i funkcijaNajveća zajednička mjera – primjer i funkcija
primjer:primjer:nzm(22,8) = nzm(8,6) = nzm(6,2) = nzm(2,0) = 2nzm(22,8) = nzm(8,6) = nzm(6,2) = nzm(2,0) = 2
nzm(21,13) = nzm(13,8) = nzm(8,5) = nzm(5,3) = nzm(21,13) = nzm(13,8) = nzm(8,5) = nzm(5,3) = nzm(3,2) = nzm(2,1) = nzm(1,0) nzm(3,2) = nzm(2,1) = nzm(1,0) = 1= 1
nzm (21,0) = 21nzm (21,0) = 21
nzm (0,21) = nzm (21,0) = 21nzm (0,21) = nzm (21,0) = 21 rekurzivna funkcija:rekurzivna funkcija:
int nzm (int a, int b) {int nzm (int a, int b) {
if(b == 0) return a;if(b == 0) return a;
return nzm (b, a % b);return nzm (b, a % b);
}}
Algoritmi i strukture podataka, FER, 2008./09. 18 / 4219.04.23
Traženje člana poljaTraženje člana polja
Rekurzivni postupak za traženje indeksa prvog člana Rekurzivni postupak za traženje indeksa prvog člana jednodimenzionalnog polja od jednodimenzionalnog polja od nn članova koji ima vrijednost članova koji ima vrijednost xx. Ako . Ako takvoga nema, rezultat je takvoga nema, rezultat je -1-1..
pretraživanje počinje pozivom funkcijepretraživanje počinje pozivom funkcije trazi(A, x, n, 0)trazi(A, x, n, 0)..
Rekurzija
int trazi (tip A[], tip x, int n, int i) {int trazi (tip A[], tip x, int n, int i) {
if(i >= n) return -1;if(i >= n) return -1;
if(A[i] == x) return i;if(A[i] == x) return i;
return trazi (A, x, n, i+1);return trazi (A, x, n, i+1);
}}
Algoritmi i strukture podataka, FER, 2008./09. 19 / 4219.04.23
Pretraživanje s ograničavačemPretraživanje s ograničavačem
pretraživanje je brže ako se prethodno u polje prošireno za jedan pretraživanje je brže ako se prethodno u polje prošireno za jedan član stavi tzv. ograničivač (član stavi tzv. ograničivač (sentinelsentinel)) A[n] = x;A[n] = x;
poziv: poziv: tip i; tip i;
A[n] = x;A[n] = x;
if ((i = if ((i = trazi1 (A, x, 0)trazi1 (A, x, 0)) == n) ...) == n) ...
int trazi1 (tip A[], tip x, int i){int trazi1 (tip A[], tip x, int i){
if(A[i] == x)if(A[i] == x) return i;return i;
return trazi1 (A, x, i+1)return trazi1 (A, x, i+1)
}}
Algoritmi i strukture podataka, FER, 2008./09. 20 / 4219.04.23
Traženje najvećeg člana poljaTraženje najvećeg člana polja
određivanje indeksa najvećeg člana u polju od određivanje indeksa najvećeg člana u polju od nn članova članova
Rekurzija
int maxclan (int A[], int i, int n) {int maxclan (int A[], int i, int n) {
int imax;int imax;
if (i >= n-1) return n-1;if (i >= n-1) return n-1;
imax = maxclan (A, i + 1, n);imax = maxclan (A, i + 1, n);
if (A[i] > A[imax]) return i;if (A[i] > A[imax]) return i;
return imax;return imax;
}}
Algoritmi i strukture podataka, FER, 2008./09. 21 / 4219.04.23
Traženje najvećeg člana poljaTraženje najvećeg člana polja
određivanje najvećeg člana u polju od određivanje najvećeg člana u polju od nn članova članova Zašto je ova izvedba neučinkovita?Zašto je ova izvedba neučinkovita?
#define maxof(a,b) ((a) > (b) ? (a) : (b)) #define maxof(a,b) ((a) > (b) ? (a) : (b))
int maxclan2 (int A[], int i, int n) {int maxclan2 (int A[], int i, int n) {
if (i >= n-1) return A[i];if (i >= n-1) return A[i];
else return maxof(A[i], maxclan2 (A, i + 1, n));else return maxof(A[i], maxclan2 (A, i + 1, n));
}}
Rekurzija
Algoritmi i strukture podataka, FER, 2008./09. 22 / 4219.04.23
Karakteristike rekurzijeKarakteristike rekurzije
osnovni slučajeviosnovni slučajevi uvijek moraju postojati osnovni slučajevi koji se rješavaju bez rekurzijeuvijek moraju postojati osnovni slučajevi koji se rješavaju bez rekurzije
napredovanjenapredovanje za slučajeve koji se rješavaju rekurzivno, svaki sljedeći rekurzivni poziv za slučajeve koji se rješavaju rekurzivno, svaki sljedeći rekurzivni poziv
mora se približiti osnovnim slučajevimamora se približiti osnovnim slučajevima pravilo projektiranjapravilo projektiranja
podrazumijeva se da svaki rekurzivni poziv funkcionirapodrazumijeva se da svaki rekurzivni poziv funkcionira pravilo neponavljanjapravilo neponavljanja
ne valja dopustiti da se isti problem rješava odvojenim rekurzivnim pozivimane valja dopustiti da se isti problem rješava odvojenim rekurzivnim pozivima to rezultira umnažanjem posla, vidi npr. Fibonaccijeve brojeveto rezultira umnažanjem posla, vidi npr. Fibonaccijeve brojeve
Algoritmi i strukture podataka, FER, 2008./09. 23 / 4219.04.23
Primjer pogreškePrimjer pogreške
za vrijednostza vrijednost n = 1n = 1 rekurzivni poziv je opet s argumentom rekurzivni poziv je opet s argumentom 11 nema napredovanja prema osnovnom slučajunema napredovanja prema osnovnom slučaju
program ne radi niti za druge vrijednosti argumenta: program ne radi niti za druge vrijednosti argumenta: npr. zanpr. za n = 4n = 4, , rekurzivno se poziva rekurzivno se poziva loslos s argumentom s argumentom 4/3 +1 = 4/3 +1 = 22, zatim, zatim 2/3 +1 = 12/3 +1 = 1 i dalje stalnoi dalje stalno 1/3 +1 = 11/3 +1 = 1
int los (int n) {int los (int n) {
if (n == 0) return 0;if (n == 0) return 0;
return los (n / 3 + 1) + n - 1;return los (n / 3 + 1) + n - 1;
}}
19.04.23
RekurzijaRekurzija
Zadaci za vježbuZadaci za vježbu
Algoritmi i strukture podataka, FER, 2008./09. 25 / 4219.04.23
KamateKamate
Zadana suma novaca oročena je u banci na zadani broj godina uz Zadana suma novaca oročena je u banci na zadani broj godina uz zadanu godišnju kamatnu stopu. Napisati program koji računa zadanu godišnju kamatnu stopu. Napisati program koji računa dobivenu sumu nakon isteka oročenja.dobivenu sumu nakon isteka oročenja.
KamateKamate
Algoritmi i strukture podataka, FER, 2008./09. 26 / 4219.04.23
PremetaljkaPremetaljka
premetaljkapremetaljka (anagram)– riječ u kojoj su permutirana sva slova (anagram)– riječ u kojoj su permutirana sva slova anagrami od PAS: PAS, PSA, APS, anagrami od PAS: PAS, PSA, APS, ASPASP, SAP, SPA, SAP, SPA za riječ od za riječ od nn različitih slova ima različitih slova ima n!n! mogućih permutacija mogućih permutacija
kako to postićikako to postići:: uvijek se premeće uvijek se premeće n-1n-1 slova s desne straneslova s desne strane kao prvo slovo treba rotirati svih kao prvo slovo treba rotirati svih nn slova, pri čemu se sva slova pomiču za slova, pri čemu se sva slova pomiču za
jedno mjesto ulijevo, osim prvog, koje odlazi na krajnje desno mjestojedno mjesto ulijevo, osim prvog, koje odlazi na krajnje desno mjesto ovi koraci se ponavljaju ovi koraci se ponavljaju nn puta puta
rotiranjem slova postiže se da svako slovo može biti početnorotiranjem slova postiže se da svako slovo može biti početno dok je izabrano slovo početno, sva ostala slova se premećudok je izabrano slovo početno, sva ostala slova se premeću
osnovni slučaj: treba premetnuti jedno slovoosnovni slučaj: treba premetnuti jedno slovo PremetaljkaPremetaljka
Algoritmi i strukture podataka, FER, 2008./09. 27 / 4219.04.23
ObrtaljkaObrtaljka
Napišite program koji će rekurzivno provjeriti je li zadana riječ ili Napišite program koji će rekurzivno provjeriti je li zadana riječ ili rečenica rečenica obrtaljkaobrtaljka (palindrom). U ulaznom nizu podataka zanemarite (palindrom). U ulaznom nizu podataka zanemarite razmak i sve znakove interpunkcije.razmak i sve znakove interpunkcije. primjeri: primjeri:
– UDOVICA BACI VODUUDOVICA BACI VODU– ON VIDI DIVNOON VIDI DIVNO– U RIMU UMIRUU RIMU UMIRU– ANA NABRA PAR BANANAANA NABRA PAR BANANA
uputa: ako u palindromu izbacite prvo i posljednje slovo, preostali tekst uputa: ako u palindromu izbacite prvo i posljednje slovo, preostali tekst također mora biti obrtaljkatakođer mora biti obrtaljka
ObrtaljkaObrtaljka
Algoritmi i strukture podataka, FER, 2008./09. 28 / 4219.04.23
Hanojski tornjeviHanojski tornjevi
Postoje štapovi Postoje štapovi II (izvor), (izvor), OO (odredište), (odredište), PP (pomoćni). Na prvom štapu ( (pomoćni). Na prvom štapu (II) ima ) ima nn diskova različite veličine postavljenih tako da veći nikad ne dolazi iznad manjeg. diskova različite veličine postavljenih tako da veći nikad ne dolazi iznad manjeg. Uz minimalni broj operacija preselite sve diskove na Uz minimalni broj operacija preselite sve diskove na OO, jedan po jedan. Disk se , jedan po jedan. Disk se smije postaviti ili na prazan štap ili tako da je manji disk na većem. smije postaviti ili na prazan štap ili tako da je manji disk na većem.
algoritam rješenja:algoritam rješenja: ignorirati donji (najveći) disk i riješiti problem za ignorirati donji (najveći) disk i riješiti problem za n-1n-1 disk, ali sa štapa disk, ali sa štapa II na štap na štap PP koristeći koristeći
OO kao pomoćni kao pomoćni sada se najveći disk nalazi na sada se najveći disk nalazi na II, a ostalih , a ostalih n-1n-1 na na PP preseliti najveći disk sa preseliti najveći disk sa II na na OO preseliti preseliti n-1n-1 disk sa disk sa PP na na OO koristeći koristeći II kao pomoćni (problem je već riješen za kao pomoćni (problem je već riješen za n-1n-1 disk) disk)
HanoiHanoi
Algoritmi i strukture podataka, FER, 2008./09. 29 / 4219.04.23
Osam kraljicaOsam kraljica
Napisati funkciju koja će pronaći položaj 8 kraljica na šahovskoj Napisati funkciju koja će pronaći položaj 8 kraljica na šahovskoj ploči, tako da se one međusobno ne napadaju.ploči, tako da se one međusobno ne napadaju.
algoritam rješenja:algoritam rješenja: promatramo stupce na šahovskoj ploči od prvog prema zadnjempromatramo stupce na šahovskoj ploči od prvog prema zadnjem u svaki postavljamo jednu kraljicuu svaki postavljamo jednu kraljicu promatramo ploču u situaciji kada je već postavljeno promatramo ploču u situaciji kada je već postavljeno ii kraljica (u i različitih kraljica (u i različitih
stupaca) koje se međusobno ne napadajustupaca) koje se međusobno ne napadaju želimo postaviti želimo postaviti ii ++ 11 kraljicu tako da ona ne napada niti jednu od već kraljicu tako da ona ne napada niti jednu od već
postavljenih kraljica i da se ostale kraljice mogu postaviti uz uvjet postavljenih kraljica i da se ostale kraljice mogu postaviti uz uvjet nenapadanjanenapadanja
napomena:napomena: postoje 92 različita rješenjapostoje 92 različita rješenja
KraljiceKraljice
Algoritmi i strukture podataka, FER, 2008./09. 30 / 4219.04.23
Obilazak šahovske ploče konjem (Knight’s Tour)Obilazak šahovske ploče konjem (Knight’s Tour)
Napišite program koji će ispisati put konja na šahovskoj ploči, tako Napišite program koji će ispisati put konja na šahovskoj ploči, tako da na svako polje stane samo jednom. Put konja započnite u da na svako polje stane samo jednom. Put konja započnite u gornjem lijevom polju (A8).gornjem lijevom polju (A8). konj se kreće u obliku slova L, na slici su crvenom bojom označena polja na konj se kreće u obliku slova L, na slici su crvenom bojom označena polja na
koja se konj smije pomaknuti s trenutnog položajakoja se konj smije pomaknuti s trenutnog položaja ima nekoliko milijardi rješenjaima nekoliko milijardi rješenja 122 milijuna su zatvorena putanja122 milijuna su zatvorena putanja
KonjKonj
19.04.23
RekurzijaRekurzija
Složenost pri rekurzijiSloženost pri rekurziji
Algoritmi i strukture podataka, FER, 2008./09. 32 / 4219.04.23
Primjer za različite složenosti istog problema (M.A. Weiss) – 1 Primjer za različite složenosti istog problema (M.A. Weiss) – 1
Zadano je polje cijelih brojeva AZadano je polje cijelih brojeva A00, A, A22,…,A,…,An-1n-1. Brojevi mogu biti i . Brojevi mogu biti i negativni. Potrebno je pronaći najveću vrijednost sume niza brojeva. negativni. Potrebno je pronaći najveću vrijednost sume niza brojeva. Pretpostavit će se da je najveća suma 0 ako su svi brojevi negativni.Pretpostavit će se da je najveća suma 0 ako su svi brojevi negativni.
MaxPodSumaNiza3MaxPodSumaNiza3 O(nO(n33)) Ispituju se svi mogući podnizovi. U vanjskoj varira se prvi član podniza od Ispituju se svi mogući podnizovi. U vanjskoj varira se prvi član podniza od
nultog do zadnjeg. U srednjoj petlji varira se zadnji član podniza od prvog nultog do zadnjeg. U srednjoj petlji varira se zadnji član podniza od prvog člana do zadnjega člana polja. U unutrašnjoj petlji varira se duljina niza od člana do zadnjega člana polja. U unutrašnjoj petlji varira se duljina niza od prvog člana do zadnjeg člana. prvog člana do zadnjeg člana.
Sve 3 petlje se za najgori slučaj obavljaju Sve 3 petlje se za najgori slučaj obavljaju nn puta. Zbog toga je apriorna puta. Zbog toga je apriorna složenost složenost O(nO(n33) ) ..
RazneSlozenostiRazneSlozenosti
Algoritmi i strukture podataka, FER, 2008./09. 33 / 4219.04.23
Primjer za različite složenosti istog problema – 2 Primjer za različite složenosti istog problema – 2
MaxPodSumaNiza2MaxPodSumaNiza2 O(nO(n22)) ako uočimo da vrijedi: ako uočimo da vrijedi:
složenost se može reducirati uklanjanjem jedne petljesloženost se može reducirati uklanjanjem jedne petlje
1j j
k j kk i k i
A A A
RazneSlozenostiRazneSlozenosti
Algoritmi i strukture podataka, FER, 2008./09. 34 / 4219.04.23
Primjer za različite složenosti istog problema – 3Primjer za različite složenosti istog problema – 3
MaxPodSumaMaxPodSuma O(nlogO(nlog22n)n) relativno složeni rekurzivni postupakrelativno složeni rekurzivni postupak kad ne bi bilo i boljeg (linearnog) rješenja, ovo bi bio dobar primjer snage kad ne bi bilo i boljeg (linearnog) rješenja, ovo bi bio dobar primjer snage
rekurzije i postupka podijeli-pa-vladaj (divide-and-conquer).rekurzije i postupka podijeli-pa-vladaj (divide-and-conquer). Ako se ulazno polje podijeli približno po sredini, rješenje može biti takvo da Ako se ulazno polje podijeli približno po sredini, rješenje može biti takvo da
je maksimalna suma u lijevom dijelu polja, ili je u desnom dijelu polja ili je maksimalna suma u lijevom dijelu polja, ili je u desnom dijelu polja ili prolazi kroz oba dijela. Prva dva slučaja mogu biti riješena rekurzivno. prolazi kroz oba dijela. Prva dva slučaja mogu biti riješena rekurzivno. Zadnji slučaj se može realizirati tako da se nađe najveća suma u lijevom Zadnji slučaj se može realizirati tako da se nađe najveća suma u lijevom dijelu koja uključuje njegov zadnji član i najveća suma u desnom dijelu koja dijelu koja uključuje njegov zadnji član i najveća suma u desnom dijelu koja uključuje njegov prvi član. Te se dvije sume zbroje i uspoređuju s one prve uključuje njegov prvi član. Te se dvije sume zbroje i uspoređuju s one prve dvije. dvije.
Algoritmi i strukture podataka, FER, 2008./09. 35 / 4219.04.23
Primjer za različite složenosti istog problema – 4Primjer za različite složenosti istog problema – 4
Najveća lijeva suma je od članova 0 do 2 i iznosi 6. Najveća desna Najveća lijeva suma je od članova 0 do 2 i iznosi 6. Najveća desna suma je od članova 5 do 6 i iznosi 8. Najveća lijeva suma koja suma je od članova 5 do 6 i iznosi 8. Najveća lijeva suma koja uključuje zadnji član na lijevo je od 0 do 3 člana i iznosi 4, a desno uključuje zadnji član na lijevo je od 0 do 3 člana i iznosi 4, a desno od 4 do 6 člana i iznosi 7. Ukupno to daje sumu 11 koja je onda i od 4 do 6 člana i iznosi 7. Ukupno to daje sumu 11 koja je onda i najveća.najveća. pozivni program za početne rubove zadaje pozivni program za početne rubove zadaje 00 i i n-1n-1
44 -3-3 55 -2-2 -1-1 22 66 -2-2
00 11 22 33 44 55 66 77
Desni dioDesni dioLijevi dioLijevi dio
Algoritmi i strukture podataka, FER, 2008./09. 36 / 4219.04.23
Primjer za različite složenosti istog problema – 5Primjer za različite složenosti istog problema – 5
Programski kôd je relativno složen, ali daje za red veličine bolje Programski kôd je relativno složen, ali daje za red veličine bolje rezultate od prethodnoga. Znači da rezultate od prethodnoga. Znači da kraći kôd ne implicira i bolji kôd!kraći kôd ne implicira i bolji kôd!
Ako bi Ako bi nn bio potencija od bio potencija od 2 2 intuitivno se vidi da će sukcesivnih intuitivno se vidi da će sukcesivnih raspolavljanja biti raspolavljanja biti loglog22 n n. To će se detaljnije dokazivati kasnije kod . To će se detaljnije dokazivati kasnije kod
binarnih stabala. Budući da kroz postupak prolazi binarnih stabala. Budući da kroz postupak prolazi nn podataka, podataka, imamo imamo O(n logO(n log22n) n) ..
Općenito se može reći da je trajanje algoritma Općenito se može reći da je trajanje algoritma O(logO(log22n)n) ako u ako u
vremenu vremenu O(O(11)) podijeli veličinu problema (obično ga raspolovi). podijeli veličinu problema (obično ga raspolovi). Ako u pojedinom koraku reducira problem za Ako u pojedinom koraku reducira problem za 11, onda je njegovo , onda je njegovo
trajanje trajanje O(n) O(n) ..
Algoritmi i strukture podataka, FER, 2008./09. 37 / 4219.04.23
Primjer za različite složenosti istog problema – 6Primjer za različite složenosti istog problema – 6
MaxPodSumaNiza1MaxPodSumaNiza1 O(n)O(n) zbrajaju svi članovi polja redom, a pamti se ona suma koja je u cijelom tijeku zbrajaju svi članovi polja redom, a pamti se ona suma koja je u cijelom tijeku
tog postupka bila najvećatog postupka bila najveća
Algoritmi i strukture podataka, FER, 2008./09. 38 / 4219.04.23
Analiza a posterioriAnaliza a posteriori
Primjer: izračunati Primjer: izračunati modmod sortiranog cjelobrojnog polja, tj. odrediti član sortiranog cjelobrojnog polja, tj. odrediti član polja koji se najčešće pojavljuje i prebrojati njegovu učestalost.polja koji se najčešće pojavljuje i prebrojati njegovu učestalost. ModPoljaModPolja mode0mode0 izravno rješavanjeizravno rješavanje rmode0rmode0 rekurzivni postupak rekurzivni postupak rmode1rmode1 rekurzivni postupak transformiran u iterativni rekurzivni postupak transformiran u iterativni
Sva tri postupka imajuSva tri postupka imaju vrijeme izvođenjavrijeme izvođenja (n) (n). Koji je najbolji?. Koji je najbolji?
Algoritmi i strukture podataka, FER, 2008./09. 39 / 4219.04.23
rmode0rmode0
Zamislimo da je u polju od Zamislimo da je u polju od nn članova članova a[0:n-1]a[0:n-1] izračunat mod i izračunat mod i učestalost učestalost ff za prvih za prvih n-1n-1 članova polja. Pod kojim uvjetima zadnji članova polja. Pod kojim uvjetima zadnji član polja može promijeniti mod? Ako je član polja može promijeniti mod? Ako je a[n-1] != a[n-2]a[n-1] != a[n-2] niti mod niti učestalost se ne mijenjaju. Ako jest jednak, kako niti mod niti učestalost se ne mijenjaju. Ako jest jednak, kako razlikovati između 3 moguća slučaja:razlikovati između 3 moguća slučaja: a) nađen je novi moda) nađen je novi mod b) mod je isti, ali se povećava učestalost b) mod je isti, ali se povećava učestalost ff c) nema promjene ni moda niti učestalosti c) nema promjene ni moda niti učestalosti
odgovor ovisi o tome je li odgovor ovisi o tome je li a[n-1] == a[n-1 - f]a[n-1] == a[n-1 - f] ako jest, onda ima ako jest, onda ima n-1 - (n-1 - f) +1 = f + 1n-1 - (n-1 - f) +1 = f + 1
pojavljivanja vrijednosti koje je u pojavljivanja vrijednosti koje je u a[n-1]a[n-1]. To znači da je ta vrijednost . To znači da je ta vrijednost sigurno ili novi mod ili stari mod s uvećanom učestalošću sigurno ili novi mod ili stari mod s uvećanom učestalošću ff..
Algoritmi i strukture podataka, FER, 2008./09. 40 / 4219.04.23
Zadaci za vježbuZadaci za vježbu
primjeri rekurzivnih poziva funkcijeprimjeri rekurzivnih poziva funkcije PrimjeriRekurzijePrimjeriRekurzije
Algoritmi i strukture podataka, FER, 2008./09. 41 / 4219.04.23
Zadaci za vježbuZadaci za vježbu
Napisati program za računanje binomnog koeficijenta koristeći izraz:Napisati program za računanje binomnog koeficijenta koristeći izraz:a) a) BINOM(BINOM(nn, , mm) = ) = nn!/(!/(mm!(!(nn--mm)!))!)
b) b) BINOM(BINOM(nn, , mm) = BINOM() = BINOM(nn-1, -1, mm) + BINOM() + BINOM(nn-1, -1, mm-1);-1); BINOM(BINOM(nn, 0) = BINOM(, 0) = BINOM(nn, , nn) = 1) = 1
BinomniKoeficijentiBinomniKoeficijenti
Napisati funkciju koja će na zaslon ispisati prvih Napisati funkciju koja će na zaslon ispisati prvih nn redaka redaka Pascalovog trokuta. Kolika je apriorna složenost?Pascalovog trokuta. Kolika je apriorna složenost? BinomniKoeficijentiBinomniKoeficijenti
PascalovTrokutRekurzijaPascalovTrokutRekurzija
Algoritmi i strukture podataka, FER, 2008./09. 42 / 4219.04.23
Problem trgovačkog putnikaProblem trgovačkog putnika
Problem trgovačkog putnika (TSP; Problem trgovačkog putnika (TSP; Travelling Salesman ProblemTravelling Salesman Problem): zadan je ): zadan je skup od skup od nn gradova gradova GG i cijene i cijene ccijij putovanja iz grada putovanja iz grada i u grad u grad j.. Potrebno je, Potrebno je, krenuvši iz zadanog grada, obići sve gradove točno jednom, tako da ukupni krenuvši iz zadanog grada, obići sve gradove točno jednom, tako da ukupni trošak puta bude najmanji. trošak puta bude najmanji. cij = cji
TSP(Gi, G) = min (cij + TSP (Gj, G \ Gj))
jj
TSP(Gi, {Gj}) = cij
Složenost: O(n!), ~(n!/2)
TSPTSP