Algoritmi_Vjezbe

136 

Loading.... (view fulltext now)

Loading....

Loading....

Loading....

Loading....

Texto completo

(1)

Contents

1 Opšti pojmovi o algoritmima 2

1.1 Uvod . . . 2

1.2 Klasi…kacija algoritama . . . 4

1.3 Predstavljanje algoritama . . . 5

2 Linijski i cikliµcni algoritmi 6 2.1 Uvod . . . 6

2.2 Zadaci . . . 6

2.3 Zadaci za samostalni rad . . . 12

3 Cikliµcni algoritmi i algoritmi sa uslovom taµcnosti 14 3.1 Zadaci . . . 14

3.2 Zadaci za samostalni rad . . . 23

4 Analiza kompleksnosti algoritama na primjerima 26 4.1 Uvod . . . 26

4.2 Zadaci . . . 26

4.3 Analiza kompleksnosti nekih tipova algoritama . . . 28

4.3.1 Algoritmi konstantnog vremena . . . 28

4.3.2 Algoritmi u linearnom vremenu . . . 29

4.3.3 Algoritmi sa kvadratnim vremenom . . . 29

4.3.4 Algoritmi sa logaritamskim vremenom . . . 30

4.3.5 Algoritmi brzine pn . . . 30

4.3.6 Algoritmi sa eksponencijalnim vremenom . . . 30

4.3.7 Kombinacije algoritama . . . 31

5 Euklidov algoritam 33 5.1 Uvod . . . 33

5.2 Kako radi Euklidov algoritam ? . . . 33

5.3 Zadaci za samostalni rad . . . 36

6 Asimptotska procjena sloµzenosti algoritma 37 6.1 Uvod . . . 37

6.1.1 -notacija . . . 37

6.1.2 O-notacija . . . . 37

6.1.3 -notacija . . . 38

6.1.4 Primjeri raµcunanja sloµzenosti . . . 39

7 Analiza kompleksnosti - nastavak 41 7.1 Uvod . . . 41

7.2 Zadaci . . . 42

7.3 Zadaci za samostalni rad . . . 44

8 Rekurzije 46 8.1 Uvod . . . 46

8.2 Zadaci . . . 48

(2)

9 Tjuringova mašina 56

9.1 Uvod . . . 56

9.2 Alan Tjuring . . . 56

9.3 Alfabet . . . 57

9.4 Neformalni opis Tjuringove mašine . . . 57

9.5 Formalni opis Tjuringove mašine . . . 59

9.6 Modeli izraµcunljivost . . . 61

9.6.1 Nedetrministiµcka Tjuringova mašina . . . 61

9.6.2 Neograniµcena registarska mašina . . . 65

9.6.3 While i for petlje (dijagrami toka) . . . 66

9.6.4 Postova mašina . . . 68

9.7 Zadaci . . . 73

10 Sortiranja 81 10.1 Uvod . . . 81

10.2 Sortiranje nizova - osnovne metode . . . 81

10.2.1 Sortiranje putem umetanja (Insertion sort) . . . 82

10.2.2 Shell sort . . . 85

10.2.3 Sortiranje putem direktne podjele (Selection sort) . . . 89

10.2.4 Sortiranje putem zamjene (Bubble sort) . . . 92

10.3 Poboljšane metode (sloµzenost n log n) . . . 97

10.3.1 Merge sort . . . 97

10.3.2 Quick sort . . . 101

11 Sluµcajni brojevi 105 11.1 Uvod . . . 105

11.2 Uniformna raspodjela . . . 107

11.2.1 Linearni kongruenti generator . . . 108

11.2.2 Algoritam Marsaglia . . . 109 11.2.3 Lagged-Fibonacci . . . 111 11.2.4 Mersenov tvister . . . 112 11.3 Normalna distribucija . . . 112 11.4 Testiranje sluµcajnosti . . . 115 12 Grafovski algoritmi 117 12.1 Uvod . . . 117 12.2 Algoritmi pretraµzivanja . . . 118

12.3 Algoritmi najkra´ceg puta . . . 119

12.3.1 Dijkstra algoritam . . . 120

12.4 Pohlepni algoritmi na grafovima . . . 122

12.4.1 Kruskalov algoritam . . . 123

12.4.2 Primov algoritam . . . 124

12.5 Zadaci . . . 126

(3)

1 Opšti pojmovi o algoritmima

1.1

Uvod

Termin "algoritam" je nastao po latinskom prevodu imena matematiµcara iz devetog vi-jeka, Abu Jafar Muhammad Ibn Musu Al-Khowarizmi koji se bavio trigonometrijom, astronomijom, zemljopisom, kartogra…jom, a smatra se ocem algebre jer je de…nirao osnovna pravila rješavanja linearnih i kvadratnih jednadµzbi. Njegovi radovi su osnova razvoja mnogih matematiµckih i prirodnih disciplina, me†u njima i raµcunarstva.

Prvi zapis algoritma prilago†en raµcunaru pripada Adi Byron iz 1842, pa se zbog ovoga smatra prvom programerkom, a raµcunao je Bernoullijeve brojeve. Raµcunar za koji je napisan je bio analitiµcki stroj koji je zamislio, ali nikad u potpunosti proveo u djelo, Englez Charles Babbage. Analitiµcki stroj je trebao biti prvi programabilni raµcunar, sastavljen u potpunosti od mehaniµckih dijelova. Mehaniµcki dijelovi i …ziµcka glomaznost su glavni razlozi zašto nikad nije završen1.

Algoritam se de…niše na nekoliko naµcina :

Algoritam je skup pravila kojima se provodi kalkulacija bilo ruµcno bilo putem mašine Algoritam je procedura od konaµcnog broja koraka kako bi se dobio traµzeni rezultat Algoritam je niz raµcunskih koraka kojima se ulaz transformiše kako bi se dobio izlaz Algoritam je niz operacija koje se izvode nad podacima koji trebaju biti organizo-vani u strukturama podataka

Algoritam je apstrakcija programa koji se treba izvesti na …ziµckoj mašini (model izraµcunavanja)

U tekstu [11] algoritam se de…niše kao "jasno speci…ciran matematiµcki process izraµcuna-vanja; skup pravila koji ako se slijede daju µzeljeni rezultat". U matematici, raµcunarstvu, lingvistici i srodnim disciplinama, algoritam je konaµcan niz dobro de…nisanih naredbi za ostvarenje zadatka, koji ´ce za dato poµcetno stanje završiti u de…nisanom konaµcnom stanju.

Iz datih de…nicija se moµze zakljuµciti da je algoritam skup koraka odnosno postupak kojim se odre†eni problem rješava u konaµcnom broju koraka. Istorijski gledano, svi problemi su rješavani nekim vidom algoritma ali je proteklo puno vremena da se napravi odgovaraju´ca formalizacija.

Koncept algoritma je potekao kao sredstvo zapisivanja postupaka za rješavanje matem-atiµckih problema, poput pronalaµzenja zajedniµckog djelitelja dva broja ili mnoµzenja dva broja. Koncept je formaliziran 1936. u vidu Turingovog stroja Alana Turinga i lambda raµcuna Alonza Churcha, koji su jedan za drugim postavili temelje raµcunarstva.

Najpoznatiji algoritam u istoriji datira mnogo prije vremena starih grka; to je Euklidov algoritam za raµcunanje najve´ceg zajedniµckog djelioca dva cijela broja.

Algoritmi imaju slijede´ca svojstva:

(4)

diskretnost : u odvojenim koracima se izvode diskretne operacije algoritma koje vode ka konaµcnom cilju;

konaµcnost : oznaµcava sposobnost algoritma da nakon konaµcnog broja koraka daje izlazne podatke odnosno rezultate;

determiniranost : za iste ulazne podatke algoritam uvijek daje iste rezultate masovnost : algoritam je primjenjiv na ve´ci broj ulaznih vrijednosti.

Osnovne komponente algoritma su : De…nicija problema

Ulazne veliµcine Radne veliµcine Postupak rješavanja Izlaz

De…nicija problema treba biti jasna, sadrµzajna i sa dovoljno elemenata kako bi se problem mogao riješiti. Problem se de…niše tekstualno i/ili izrazom. De…nicija problema treba biti egzaktna i nedvosmislena.

Ulazne veliµcine de…nišu skup podataka koji su predmet obrade (input). Ove veliµcine mogu biti numeriµcke veliµcine, fajlovi, tekstovi, gra…ka itd.

Radne veliµcine su varijable koje se koriste u postupku rješavanja problema. Mada se koncept razlikuje po jezicima, svima im je zajedniµcko da zahtijevaju deklaraciju i inicijalizaciju radnih veliµcina.

Deklaracijade…niše tip varijable a samim tim i njene mogu´ce vrijednosti.

Incijalizacija je postupak davanja poµcetnih vrijednosti varijablama. Ovo je posebno vaµzno u cikliµcnim algoritmima. U nekim sluµcajevima inicijalizacija se vrši prvom dodjelom vrijednosti.

Postupak rješavanjade…niše svaki pojedini korak koji je potreban za rješenje problema, ukljuµcuju´ci deklaracije, inicijalizacije i svaku operaciju koja se obavlja.

Izlaz (output) de…niše rezultat rada koji moµze biti numeriµcka veliµcina, skup vrijednosti, datoteka itd.

Svaki algoritam mora imati završetak. Pravljenje tzv. vjeµcnih petlji je klasiµcna pro-gramerska greška. Potrebno je razlikovati procedure od funkcija. U principu, svaka procedura ima rezultat ali on ne mora biti vidljiv u svim sluµcajevima. Primjer je proce-dura sortiranja koja se moµze izvršavati kao dio nekog ve´ceg algoritma odnoso uslova za naredne korake. Funkcija mora imati vrijednost i moµze biti µclan u operacijama.

Dizajn algoritma ukljuµcuje obaveznu kontrolu njegove ispravnosti kako bi se ustanovilo da algoritam daje µzeljeni rezultat.

(5)

1.2

Klasi…kacija algoritama

Algoritme je mogu´ce klasi…cirati po raznim kriterijima: Klasi…kacija s obzirom na tok

Linijski algoritmise izvršavaju korak po korak, bez vra´canja na neki od prethod-nih koraka niti se neki od koraka ili grupa koraka ponavlja u bilo kom smislu. Ovi algoritmi mogu sadrµzavati i grananja, mjesta na kojima se postupak nastavlja nakon ispitivanja odre†enog uslova.

Cikliµcni algoritmi se realizuju na naµcin da se ponavlja odre†eni korak ili grupa koraka. Ponavljanje se moµze realizovati na dva naµcina :

- Putem brojaµca, kojim se zadaje koliko puta se odabrani korak ili grupa koraka ponavlja. Bitno je napomenuti da se u ovom tipu ciklusa zadati broj koraka ne moµze mijenjati u toku samog izvršenja

- Putem uslova za koji se ne zna unaprijed koliko puta ´ce se izvršiti. Ovo je sluµcaj npr. kada se µzeli posti´ci odre†ena taµcnost u raµcunanju; najµceš´ce nije poznato koliko koraka treba napraviti da bi se taµcnost postigla pa se traµzi drugi naµcin.

Najve´ca opasnost cikliµcnih algoritama je formiranje tzv. vjeµcitih petlji jer uslov završetka nije dobro de…nisan.

Klasi…kacija prema implementaciji

Rekurzivni ili iterativni: Rekurzivni algoritam je algoritam koji poziva samog sebe sve dok se ne postigne odre†en uslov. Rekurzivni algoritmi su vrlo µcesto usko vezani uz implementaciju pojedine matematiµcke funkcije na primjer raµcunanje Fibbonaµcijevih brojeva. Iterativni algoritmi su algoritmi koji ne pozivaju samog sebe ve´c se oslanjaju na konstrukcije poput petlji i dodatne strukture podataka da bi se riješio problem. Vaµzno je napomenuti da je svaki rekurzivni algoritam mogu´ce pretvoriti u iterativni, i da je svaki iterativni algoritam mogu´ce pretvoriti u rekurzivni, iako ponekad to pretvaranje moµze biti vrlo kompleksno.

Serijski ili paralelni: Ve´cina današnjih raµcunara sadrµzi samo jedan procesor te stoga obavlja naredbe jednu po jednu, to jest serijski. Algoritmi koji su dizajnirani sa namjerom da se izvršavaju u takvom okruµzenju shodno tome se nazivaju serijski algoritmi. Suprotno njima su paralelni algoritmi koji sa sve ve´cim brojem višeproce-sorskih raµcunara dobivaju sve ve´cu vaµznost. Paralelni algoritmi koriste mogu´cnost višeprocesorskog sistema na naµcin da problem podijele na više malih potproblema koje svaki procesor rješava zasebno te se zatim rezultati spajaju. Paralelni algoritmi uz resurse potrebne za obradu podataka tako†er imaju i malu potrošnju resursa na komunkaciju izme†u više procesora. Algoritmi za sortiranje su jedan od primjera algoritama koje je mogu´ce znatno poboljšati upotrebom paralelnih procesora, dok je neke probleme sasvim nemogu´ce riješiti paralelnim algoritmom.

Deterministiµcki ili stohastiµcki: Deterministiµcki algoritam je algoritam koji ´ce pri svakom izvršavanju u bilo kojim uslovima od istog unosa do´ci do istog izlaza na naµcin da svaki put slijedi identiµcan niz naredbi. Stohashiµcki algoritmi je algoritam

(6)

Taµcan ili pribliµzan: Iako algoritmi u principu daju taµcan rezultat, ponekad al-goritam traµzi pribliµzno rješenje koje je dovoljno blizu toµcnom, ili je taµcno rješenje nemogu´ce na´ci.

Klasi…kacija prema strategiji rješavanja

Brute force algoritmi- raµcunar "µcistom silom" isprobava sve mogu´cnosti i traµzi odgovaraju´ce rješenje. Ovo su najnee…kasnijji algoritmi jer ukazuju na nesistem-atiµcnost i neanalitµcnost u pristupu.

Podijeli i vladaj algoritmi(Divide and conquer). Problem se dijeli na više istih, manjih problema. Podjela teµce tako dugo dok se ne do†e do malog problema kojeg je jednostavno riješiti (obiµcno rekurzijom).

Dinamiµcki algoritmi - Metodama dinamiµckog programiranja rješavaju se višefazni procesi, tj. procesi u kojima se donosi niz me†usobno zavisnih odluka. Dinamiµcko programiranje poznato je i pod nazivom metoda donošenja višefaznih odluka. Pohlepni algoritmi (greedy) - Pohlepni algoritam koristi metaheuristiku za rješavanje problema, takvu da u svakom koraku bira lokalno najbolje rješenje, u nadi da ´ce tako izna´ci globalni optimum. Ovi algoritmi µcesto ne daju najbolje rješenje ve´c brzu aproksimaciju najboljeg rješenja.

Algoritmi za sortiranje i pobrojavanje (search and enumeration) - Algoritmi sortiranja sluµze za brzo sortiranje podataka, npr. niza brojeva. Mnogi se problemi mogu rješavati teorijom grafova.

1.3

Predstavljanje algoritama

Algoritmi se predstavljaju gra…µcki i tekstualno.

Gra…µcko predstavljanje se realizuje putem standardnih simbola koji predstavljaju po-jedine korake i koji se povezuju linijama kao prikaz toka operacija. Pritom se dijagram pravi tako da ide odozgo prema dolje s lijeva na desno.

Tekstualno predstavljanjemoµze biti putem pseudokoda ili putem odabranog program-skog jezika. Pseudokod nije vezan ni za jedan speci…µcan programski jezik. U radu ´cemo koristiti sljede´ce formulacije pseudokoda :

Ako je <uslov> tada <operacija> : Ispituje se <uslov> i ako je zadovoljen realizuje se <operacija>; u suprotnom se realizuje alternativni blok

Za <varijabla> od <g1> do <g2> korak <g3> : Poµcetak ciklusa u kojem <varijabla> mijenja vrijednosti od <g1> do <g2> sa korakom <g3>. Ako je g1<g2 tada korak mora biti pozitivan, u suprotnom je negativan

SveDokJe(<uslov>) : poµcetak ciklusa u kojem, u pravilu, nije poznat broj koraka. Ciklus se izvršava sve dok vrijedi <uslov>

a b: Pridruµzivanje koje se µcita "na lokaciju varijable a (odredište) upisati vrijed-nost varijable b".

(7)

2 Linijski i cikliµcni algoritmi

2.1

Uvod

Linijski algoritmi su oni koji se izvršavaju sukcesivno odnosno oni u kojima se svaki korak izvršava samo jednom. Algoritam moµze sadrµzavati grananja ali se ne vrši povratak na bilo od kojih prethodnih koraka.

Cikliµcni algoritmi imaju dio koji se ponavlja. Broj ponavljanja se prati nekom varijablom koja je u funkciji brojaµca.

2.2

Zadaci

Zadatak. Napraviti algoritam rješavanja kvadratne jednaµcine.

Rješenje. Opšta kvadratna jednaµcina je data izrazom ax2 + bx + c = 0. Ulazne veliµcine za algoritam su a; b; c. Najprije se ispituje da li je a 6= 0 : provjera da li zadati para-metri uopšte mogu de…nisati kvadratnu jednaµcinu. Na narednom dijagramu je algoritam rješavanja kvadratne jednaµcine prikazan gra…µcki.

Postupak rješavanja kvadratne jednaµcine

Na dijagramu je vidljiv tok odozgo naniµze, uz dva grananja odnosno mjesta na kojima se ispituje uslov i donosi odgovaraju´ca odluka o nastavku. Ovaj isti algoritam se moµze predstaviti pseudokodom koji je u nastavku.

(8)

Algoritam : Kvadratna jednacina Ulaz : a,b,c

// Najprije se ispituje da li je a = 0 ili ne Ako je a=0 tada Kraj

// Izraµcunavanje diskriminante D b2 4ac

Ako je D > 0 tada {

// Rješenja su realna i razliµcita x1 -b 2a -p D 2a x2 -b 2a+ p D 2a } Inaµce {

//Da li je diskriminanta negativna Ako je D<0 tada { //Rješenja su kompleksna Re - b 2a Im -p D 2a x1 (Re; Im) x2 (Re; Im) } Inaµce { //Rješenja su jednaka x1=x2 -b 2a } }

(9)

Pseudokod je napisan na naµcin da pojedine naredbe odnosno grupe naredbi odgovaraju sadrµzaju simbola na gra…konu. Ovdje je simbolom oznaµceno da se vrijednost sa desne strane znaka smješta na lokaciju na kojoj se nalazi veliµcina sa lijeve strane znaka.

Zadatak. Napraviti algoritam za raµcunanje sume : S = n X i=1 i2 i + 1

Rješenje. Jedina ulazna veliµcina u ovom sluµcaju je n. Sumiranje se vrši u veliµcinu S što podrazumijeva potrebu njene inicijalizacije. Kad je u pitanju sumiranje najprirodniji naµcin inicijalizacije je S = 0. Jedna od varijanti algoritma je u nastavku.

Algoritam sumiranja

Na dijagramu je vidljivo da se operacija

S S + k

2

k + 1

ponavlja onoliko puta koliko k ima razliµcitih vrijednosti, u ovom sluµcaju n, koje se do-bijaju tako da se k u svakom koraku pove´ca za 1. Na taj naµcin k ima funkciju brojaµca. Pseudokod za ovaj algoritam je u nastavku.

Ovakav algoritam se naziva cikliµcni zbog µcinjenice da se jedan korak ponavlja. Pri tome to ponavljanje moµze biti unaprijed utvr†eno (kao u ovom sluµcaju) ili se operacija obavlja dok se ne postigne odre†eni uslov, npr. taµcnost raµcunanja.

Pitanje: Koliko puta se obavi operacija sumiranja S S + k

2

k + 1 ?

(10)

Sumiranje - varijanta 1 //Raµcunanje konaµcne sume Ulaz : n //Inicijalizacija sume S 0 Za k = 1 do n { S S + k 2 k + 1 } Izlaz : S Sumiranje - varijanta 2 Ulaz : n //Inicijalizacija sume S 0 1 k a:S S + k 2 k + 1 k k + 1

Ako je k n Idi na korak a: Izlaz : S

U ovom algoritmu je najinteresantniji korak u kojem se ispituje da li je k n. Ovo je potencijalno najve´ci (i najµceš´ci) izvor greške. Druga karakteristika je (bezuslovni) skok na labelu koja je oznaµcena sa a:. µCitaocu se prepušta da napravi odgovaraju´ci pseudokod. Zadatak. Izraµcunati vrijednost izraza

S = 2x4 3x3+ 4x2 5x + 6

ne koriste´ci više od 4 operacije sabiranja, mnoµzenja i oduzimanja.

Rješenje. Da bi broj operacija mogao biti maksimalno smanjen dati izraz se napiše u obliku:

S = (((2x 3) x + 4) x 5) x + 6

Raµcunanje poµcinje iz prve zagrade. Mnoµzenja koja se koriste se mogu simboliµcki prikazati na sljede´ci naµcin:

a 2 x 3

b a x + 4

c b x 5

S c x + 6

Ovakav naµcin korištenja varijabli je neracionalan ako se ima u vidu da se svaka od njih koristi samo jednom. Ako se traµzi suma onda se ta ista varijabla moµze iskoristiti za svaki korak na naµcin da se prethodni sadrµzaj briše i upiše nova vrijednost. Simboliµcki, to se piše na sljede´ci naµcin:

S 2 x 3

S S x + 4

(11)

S S x + 6

Ovdje je vidljivo da se prvi red raµcuna na jedan a ostala tri reda na drugi naµcin. Ovo se moµze promijeniti na naµcin da se u svim koracima koristi isti obrazac sumiranja i mnoµzenja: S 0 S S x + 2 S S x 3 S S x + 4 S S x 5 S S x + 6

U ovom naµcinu rada se u svakom izrazu koe…cijenti polinoma pojavljuju kao sabirci. Uopšteno se ovo moµze zapisati na sljede´ci naµcin:

S 0;

S S x + ak; k = n; 1; 1

Ovdje k = n; 1; 1 ima znaµcenje : k se mijenja od n do 1 sa korakom 1. To znaµci da se uzimaju koe…cijenti polinoma opadaju´cim redom indeksa poµcev od koe…cijenta za najve´ci stepen. Najvaµznije u datoj relaciji je da se koriste samo dvije operacije; prva od njih je dodjela vrijednosti a druga sadrµzi jedno mnoµzenje i jedno sabiranje. Na ovaj naµcin se moµze opisati raµcunanje vrijednosti polinoma proizvoljnog stepena. Na narednom dijagramu je dat opisani algoritam.

Raµcunanje polinoma

U nastavku je pseudokod za ovaj algoritam.

Pitanje : Koliko puta se izvrši korak u kojem se raµcuna S S x + ak ?

Zadatak. Napraviti algoritam za raµcunanje prvog izvoda polinoma stepena n. Rješenje. Neka je polinom dat u opštem obliku

(12)

Racunanje polinoma

//Raµcunanje vrijednosti polinoma Ulaz : fakg ; k = 0; n Ulaz : x //Inicijalizacija S 0 Za k = n do 0 korak 1 { S S x + ak } Izlaz : S P0(x) = na nxn 1+ (n 1) an 1xn 2+ ::: + 2a2x + a1

Najlakši naµcin raµcunanja vrijednosti ovog polinoma za datu vrijednost x je sljede´ci: P0(x) = (::: (nan x + (n 1) an 1) x + ::: + 2a2) x + a1

Sliµcno kao u prethodnom primjeru, kalkulacija se provodi korištenjem dvije osnovne op-eracije

S 0

S S x + k ak; k = n; 0; 1

Opisani algoritam je dat na sljede´cem dijagramu.

Raµcunanje prvog izvoda polinoma

Jedina razlika u odnosu na prethodni algoritam je vidljiva u koraku S S x + k ak.

Pitanje 1 : U sluµcaju da se traµzi izvod bilo kojeg reda datog polinoma šta bi bio prvi korak u dizajniranju ovog algoritma ?

Pitanje 2 : Da li je i na koji naµcin pove´can broj operacija koje se obavljaju prilikom raµcunanja prvog izvoda ?

(13)

2.3

Zadaci za samostalni rad

Zadatak. Dati su realni brojevi x; y. Ne koriste´ci druge operacije osim sabiranja, oduz-imanja i mnoµzenja izraµcunati vrijednost izraza

3x2y2 2xy2 7x2y 4y2+ 15xy + 2x2 3x + 10y + 6

Ne koristiti više od osam mnoµzenja, oduzimanja i sabiranja.

Zadatak. Dat je realan broj a. Koriste´ci se samo mnoµzenjem izraµcunati a4, sa dvije operacije a6, sa tri operacije a7, sa µcetiri operacije a8, sa tri operacije a9, sa µcetiri operacije a10, sa µcetiri operacije a13, sa pet operacija a13, sa pet operacija a21, sa šest operacija a28, sa pet operacija a64, sa šest operacija

Zadatak. Dat je prirodan broj n. Izraµcunati: 1 + 1 12 1 + 1 22 ::: 1 + 1 n2 Exercise 1 1 sin 1+ 1 sin 1 + sin 2+ 1

sin 1 + sin 2 + sin 3+:::+

1

sin 1 + sin 2 + ::: + sin n r 2 + q 2 + ::: +p2 | {z } n korijena cos 1 sin 1 + cos 1 + cos 2 sin 1 + sin 2 +

cos 1 + cos 2 + cos 3

sin 1 + sin 2 + sin 3 + ::: +

cos 1 + cos 2 + ::: + cos n sin 1 + sin 2 + ::: + sin n v u u t3 + s 6 + r 9 + ::: + q 3 (n 1) +p3n

(14)

(x 2) (x 4) ::: (x 64) (x 1) (x 3) ::: (x 63)

Zadatak. Dat je realan broj a i prirodni broj n. Izraµcunati: an Exercise 2 a (a + 1) (a + 2) ::: (a + n 1) 1 a + 1 a (a + 1) + ::: + 1 a (a + 1) ::: (a + n) 1 a + 1 a2 + 1 a4 + ::: + 1 a2n a (a n) (a 2n) ::: (a n2)

Zadatak. Za dati prirodni broj n izraµcunati

n X k=1 1 k n X k=1 1 k5 n X k=1 1 (1 + 2k)2 n X k=1 ( 1)k (2k + 1) k n X k=1 ( 1)k+1 (k + 1) k n X k=1 ( 1)k(k + 1) k! n X k=1 k! 1 2 + 1 3 + ::: + 1 k + 1

(15)

3 Cikliµcni algoritmi i algoritmi sa uslovom taµcnosti

Algoritmi sa uslovom taµcnosti su oni u kojima je kriterij zaustavljanja odre†eni stepen raµcunske taµcnosti koja se postiµze na dva naµcina :

Pore†enjem dvije uzastopne parcijalne sume

Pore†enjem sa nekom vrijednosti koja je referenetna (npr. najbliµzi cijeli broj)

3.1

Zadaci

Zadatak. Napraviti algoritam za raµcunanje sljede´cih vrijednosti : minfx; yg

maxfx; yg

minfx; yg ; max fx; yg

Rješenje. Ulazne veliµcine za ovaj algoritam su x; y. Ako se traµzi minimum rezultat ne bi trebao biti samo odgovor koji od dva broja je manji ve´c broj koji se kao rezultat ispitivanja moµze iskoristiti za neku drugu funkciju, operaciju ili sliµcno. Drugim rijeµcima, traµzi se da rezultat bude u obliku

M in min fx; yg Analogno treba vrijediti i za maksimalnu vrijednost.

Algoritam za nalaµzenje minimalnog od dva data broja je na sljede´cem dijagramu.

Nalaµzenje minimalnog od dva data broja

U nastavku je pseudokod za ovaj algoritam.

(16)

Algoritam : Nalazenje minimalnog od dva broja Ulaz : x; y Min x Ako je y < M in tada { M in y } Izlaz : M in

Nalaµzenje ve´ceg od dva data broja

U nastavku je pseudokod za ovaj algoritam. Algoritam : Nalazenje maksimalnog od dva broja Ulaz : x; y M ax x Ako je y < M ax tada { M ax y } Izlaz : M ax

Algoritam za istovremeno nalaµzenje najmanjeg i najve´ceg od dva data broja je na sljede´cem dijagramu.

(17)

Algoritam za istovremeno nalaµzenje i minimalnog i maksimalnog od dva data broja

Pseudokod za ovaj algoritam je u nastavku.

Algoritam : Nalazenje i minimalnog i maksimalnog broja Ulaz : x; y M in x M ax y Ako je y < M in tada { M in y } Ako je x > M ax tada { M ax x } Izlaz : M in; M ax

Ono što je karakteristika ovog algoritma je da se rezultat dobija jedino pore†enjem datih veliµcina.

Zadatak. Neka je dat niz brojeva fxkg ; k = 1; n. Napraviti algoritam koji ´ce raµcunati :

najmanji od datih brojeva najve´ci od datih brojeva

i najmanji i najve´ci od datih brojeva

Rješenje. Zadatak ´ce biti riješen za sluµcaj nalaµzenja minimalnog od datih brojeva. Kao i u prethodnom zadatku, rezultat, npr. veliµcina M in, bi trebao biti broj koji se moµze koristiti kao argument za neku drugu funkciju, operaciju i sliµcno. Prvi problem je inicijalizacija. Logiµcno rješenje je da se kao inicijalna vrijednost uzme prvi µclan datog niza koji se poredi sa preostalim µclanovima. Opisani algoritam je na sljede´cem dijagramu.

(18)

Nalaµzenje minimalnog broja u datom nisu

Pseudo kod za ovaj algoritam je dat u nastavku. Algoritam : Nalazenje minimalnog broja u nizu Ulaz : x; y M in x1 Za k = 1 do n { Ako je xk < M in tada { M in xk } } Izlaz : M in µ

Citaocu se prepušta da napravi odgovaraju´ci algoritam za nalaµzenje najve´ceg broja datog niza.

Za nalaµzenje istovremeno i najve´ceg i najmanjeg µclana datog niza brojeva potrebno je raditi kao i u prethodnom zadatku sa manjom izmjenom u segmenu ispitivanja.

(19)

Istovremeno nalaµzenje minimalnog i maksimalnog elementa iz niza brojeva

Pseudokod za ovaj algoritam je dat u nastavku.

Algoritam : Istovremeno nalazenje minimalnog i maksimalnog broja u nizu Ulaz : x; y M in x1 M ax x1 Za k = 1 do n { Ako je xk < M in tada { M in xk } Inaµce { Ako je xk > M ax tada { M ax xk } } } Izlaz : M in; M ax

Zadatak. Napraviti algoritam za raµcunanje sume S = 1 X i=1 1 i3

(20)

al-parcijalne sume. Ako je ta razlika manja od nekog unaprijed zadatog broja " postupak sumiranja se zaustavlja jer dodavanje novih µclanova ne pove´cava bitno ili nikako taµcnost raµcunanja :

jSk+1 Skj < "

Ovo znaµci da je u dizajnu algoritma na svakom koraku potrebno imati dvije parcijalne sume koje se porede. Ulazni parametar za ovaj algoritam, koji je dat na narednom dijagramu, je broj ", odabrani nivo taµcnosti raµcunanja.

Sumiranje redova - varijanta 1

Pseudo kod za ovaj algoritam je dat u nastavku. Algoritam : Sumiranje redova - varijanta 1 Ulaz : " k 1 S1 k a: S2 S1 + 1 k3 Ako je jS2 S1j < " tada { Završiti } Inaµce { S1 S2 k k + 1 Idi na a: } Izlaz : Suma

(21)

Algoritam : Sumiranje redova - varijanta 1a Ulaz : " k 1 S1 k a: S2 S1 + 1 k3

Ako je jS2 S1j < " tada Izlaz:

// Ako ne vrijedi gornji uslov nastavljaju se naredbe nakon uslova "Ako ..."

S1 S2

k k + 1 Idi na a: Izlaz : Suma

Ovakav dizajn je pogodan u sluµcajevima kada programski jezik omogu´cava realizaciju naredbe bezuslovnog skoka "Idi na a:". µCeš´ci je dizajn dat na narednom dijagramu.

Sumiranje redova - varijanta 2

Pseudo kod za ovaj algoritam je dat u nastavku.

U oba sluµcaja, broj koraka u kojem se raµcuna suma je odre†en veliµcinom ".

Zadatak. Dat je realni broj x. Izraµcunati cijeli dio broja (najve´ci cijeli broj koji nije ve´ci od x), broj zaokruµzen do najbliµzeg cijelog broja, cjelobrojni dio broja bez decimalnog dijela. U matematici se ovaj broj obiljeµzava sa bxc (‡oor). Pri tome se treba koristiti standardnim operacijama (mnoµzenje, sabiranje, ...) odnosno smatra se da nisu raspoloµzive interne funkcije kao što je jxj i sliµcno.

Rješenje. Da bi se našao cjelobrojni dio najprije se mora na´ci broj cijelih mjesta. Nakon toga se traµzi cjelobrojni dio unatrag po pozicijama.

(22)

sis-Algoritam : Sumiranje reda - varijanta 2 Ulaz : " k 1 S1 0 S2 k SveDokJe(jS2 S1j > ") { k k + 1 S1 S2 S2 S1+ 1 k3 } Izlaz : S2

decimalnog zareza ulijevo za po jednu poziciju prilikom svakog dijeljenja. Algoritam je dat na sljede´cem dijagramu. Funkciju brojaµca cifara ima varijabla k.

Raµcunanje broja cifara realnog brojax

Pseudo kod je dat u nastavku

Algoritam : Nalazenje broja cifara realnog broja Ulaz : " k 0 a x SveDokJe(a > 1) { k k + 1 a a=10 } Izlaz : k

Jedno od vaµznijih pitanja na ovom mjestu je : koliko puta se obavlja dijeljenje sa 10 da bi se dobio broj cifara ? Ako se podsjetimo da je karakteristika logaritma realnog broja

(23)

jednaka broju cifara cjelobrojnog dijela umanjen za 1 onda je odgovor jasan : da bi se dobio broj cifara realnog broja potrebno je blog xc + 1 dijeljenja.

Drugi dio problema, nalaµzenje cjelobrojnog dijela, je nešto kompleksniji jer je mnoµzenje i upore†ivanje jedini mehanizam. Da bi se problem riješio potrebno je pripremiti radnu varijablu, nazovimo je cj, i k puta uraditi sljede´ce :

- Vrijednost a pomnoµziti sa 10

- Vrijednost cj postaviti na (cj + 1) 10

- Umanjivati cj za po 1 i na svakom koraku ispitivati da li je cj a; ako taj uslov vrijedi našli smo cijeli broj koji nije ve´ci od a; ovakvih oduzimanja na svakom koraku moµze biti najviše 10

Opisani algoritam je na narednom dijagramu

Nalaµzenje cjelobrojnog dijela realnog brojax Pseudo kod ovog algoritma je u nastavku

(24)

Algoritam : Nalazenje cjelobrojnog dijela decimalnog broja Ulaz : " k 0 a x SveDokJe(a > 1) { k k + 1 a a=10 } cj 0 Za i = 1 do k { a a 10 cj (cj + 1) 10 1 m SveDokJe(m 10) { cj cj 1

Ako je cj a tada IdiNa b: }

b: }

Izlaz : k

xM: Mantisa, broj xM 2 [0; 1)

xE: Eksponent, cijeli (pozitivni ili negativni) broj

Prema najnovijim standardima, koji su izdati od strane IEEE, termin "mantisa" u gorn-jem zapisu je zamijenjen terminom "signi…kand" kako bi se izbjegle terminološke nejas-no´ce koje se mogu pojaviti zbog znaµcenja kojeg termin "mantisa" ima za logaritme. U jednom broju tekstova se uzima da signi…kand ima vrijednosti u intervalu [1; 10) ali je znaµcenje potpuno identiµcno

3.2

Zadaci za samostalni rad

Zadatak. Dati su pozitivni realni brojevi x; a; ".U nizu y1; y2; ::: koji je formiran po

pravilu y0 = a; yk = 1 2 yi 1+ x yi 1

na´ci prvi n za koji vrijedi nejednakost y2

i y2i 1 < ". Zadatak. Neka je x0 = 1; xk = 2 x3 k 1 5

(25)

Na´ci prvi µclan xn za koji vrijedi jxn xn 1j < 10 5.

Zadatak. Neka je

y0 = 0; yk =

yk 1+ 1

yk 1+ 2

Za dati realni broj " > 0 na´ci prvi µclan yn za kojeg vrijedi yn yn 1 < ".

Zadatak. Dat je realni broj a > 0. Formiran je niz

x0 = 8 > > < > > : minf2a; 0:95g a 1 a 5 1 < a < 25 a 25 inaµce xn = 4 5xn 1+ a 5x4 n 1 ; n = 1; 2; :::

Na´ci prvi µclan xn za koji vrijedi

5

4ajxn+1 xnj < 10

6. Za prona†enu vrijednost µclana

xn na´ci razliku a x5n.

Zadatak. Za dati realni broj x i prirodni broj n izraµcunati xn2

=2n

Exercise 3 xn3

=3n

Zadatak. Za date realne brojeve a; b (b > a) i prirodni broj n izraµcunati (f1+ f2+ ::: + fn)

h gdje je h = b a n fi = a + i 1 2 h 1 + a + i 1 2 h 2; i = 1; 2; :::; n

Zadatak. Izraµcunati beskonaµcne sume sa datim nivoom taµcnosti " > 0. Smatrati da je potrebna taµcnost dostignuta ako se suma na nekom koraku razlikuje za manje od " od prethodne sume. 1 X i=1 1 i2 1 X i=1 1 i (i + 1) 1 X( 1)i

(26)

1 X i=1 ( 2)i i! 1 X i=1 ( 1)i+1 i (i + 1) (i + 2) 1 X i=1 1 4i+ 5i+2

Zadatak. Dati su prirodan broj n i realan broj a > 0. Niz x0; x1; x2; ::: je formiran po

pravilu x0 = a; xk = k 1 k xi 1+ a xk 1i 1

(27)

4 Analiza kompleksnosti algoritama na primjerima

4.1

Uvod

U ovom dijelu ´ce biti naveden jedan broj primjera analize sloµzenosti algoritama na naµcin da se na†e što je mogu´ce taµcniji broj koraka. Na taj se dobija podatak o vremenskoj sloµzenosti programa odnosno pokazatelju o mogu´cem vremenu trajanja odre†enog algo-ritma.

4.2

Zadaci

Primjer. Sekvencijalno sumiranje

U nastavku je pseudo kod za jednostavan sluµcaj sekvencijalnog sumiranja.

# Sumiranje Opis

1 Sumiraj(a,n) Ulaz : niz [a] duµzine n

2 Suma 0 Inicijalizacija

3 Za i = 1 do n { Poµcetak petlje

4 Suma Suma + a [i] Sumiranje

5 }

6 }

Table 1: Sekvencijalno sumiranje

Korak na liniji 2 se izvršava jednom. Petlja sa poµcetkom na liniji 3 se izvršava n puta; na svakom koraku te petlje se izvršavaju dvije operacije na liniji 4 što znaµci da je okvirni broj koraka dat sa F (n) = 2n + 1.

Primjer. Ugnjeµzdena petlja

U ovom primjeru je prezentirana analiza sluµcaja kada je jedna petlja unutar druge (ugn-jeµzdena petlja).

# Sumiranje Opis

1 Sumiraj(a,n) Ulaz : niz [a] duµzine n

2 Za i = 1 do n { Poµcetak spoljne petlje

3 Suma 0 Inicijalizacija sume

4 Za j = 1 do i { Poµcetak unutrašnje petlje

5 Suma Suma + a [i] Sumiranje

6 }

7 Ispisati : Suma Ispisivanje me†u sume

8 }

Table 2: Sumiranje u ugnjezdenim petljama

Spoljašnja petlja, koja poµcinje na liniji 2, se izvršava n puta. U svakom koraku se izvršava inicijalizacija na liniji 2, rokoja se raµcuna kao jedan korak.

Unutrašnja petlja poµcinje na liniji 4. Ako je i = 1 ona se ponavlja n 1 puta; ako je i = 2 ona se ponavlja n 2 puta itd. U svakom od tih koraka se izvršava linija 5 koja sadrµzi dvije operacije. Linija 7 se izvršava jednom u svakom od n koraka. Ovo znaµci da

(28)

F (n) = 1 + 4n + n X i=1 2 (i 1) = = 1 + 4n + 2 n X i=1 (i 1) = 1 + 4n + 2 n (n 1) 2 F (n) = n2+ 3n + 1

Zakljuµcak je da ovaj algoritam ima kvadratnu brzinu : ako se obim niza pove´ca dva puta broj koraka se pove´ca barem 4 puta.

Primjer. Sumiranje

U sljede´cem primjeru je prezentirano sumiranje posljednjih pet µclanova odabranog niza.

# Sumiranje Opis

1 Sumiraj(a, n) Ulaz : niz [a] duµzine n

2 Za i = 5 do n { Poµcetak spoljne petlje

3 Suma a [i 4] Iniciranje sume µclanom a [i 4]

4 Za j = i 3do i { Poµcetak unutrašnje petlje

5 Suma Suma + a [j] Sumiranje

6 }

7 Ispisati Suma Ispisivanje Suma

8 }

Table 3: Sumiranje posljednjih 5 clanova

Spoljašnja petlja, koja poµcinje na liniji 2, se izvršava n 4 puta. U svakom koraku se izvršava inicijalizacija vrijednosti Suma i to sa µclanom koji je pet pozicija udaljen od pozicije µclana od kojeg poµcinje sabiranje. Ako je i = 5 tada je Suma a [1] itd. Ova op-eracija traje jedan korak. Petlja na liniji 4 se izvršava 4 puta, za a [i 3] ; a [i 2] ; a [i 1] i a [i]. U svakom koraku te petlje se izvode dvije operacije na liniji 5. Ispisivanje, na liniji 7, traje jedan korak. To znaµci da je okvirni broj operacija u ovom algoritmu

F (n) = 1 + 10 (n 4) = 10n 39 Zakljuµcak je da ovaj algoritam ima linearnu brzinu.

Primjer. Binarno pretraµzivanje

Ovo je jedan od veoma µcestih metoda pretraµzivanja. Polazna osnova je niz duµzine n koji je sortiran rastu´cim redoslijedom i u kojem se treba prona´ci vrijednost oznaµcena sa Kljuc. Naµcin na koji se obavlja ovaj posao je sljede´ci:

Na†e se "srednji" µclan niza i Kljuc uporedi sa tim µclanom

Ako je Kljuc manji od te vrijednosti tada se pretraµzuje prva polovina niza; u suprotnom pretraµzuje se gornja polovina niza

Ovaj postupak se nastavlja sve dok se broj µclanova za pretraµzivanje ne svede na 1 Opisani postupak je opisan sljede´cim pseudo kodom.

Ako je traµzena vrijednost u sredini (sortiranog) niza petlja, koja poµcinje na liniji 4, se izvršava samo jednom.

(29)

# Binarno pretraµzianje niza Opis

1 BinPret(a; n; Kljuc) Ulaz : niz [a], n i Kljuc

2 Lo 1 Inicijalna vrijednost za donju granicu

3 Hi n Inicijalna vrijednost za gornju granicu

4 SveDokJe(Lo Hi){

5 M id 1

2(Lo + Hi) Raµcunanje indeksa srednjeg µclana

6 Ako Je (Kljuc < a (M id)) tada { Ako je traµzeni element manji od a (M id) . . .

7 Hi Mid 1 M id postaje gornja granica donje polovine niza

8 }

9 Inaµce Ako Je (Kljuc > a (M id)) tada { Ako je traµzeni element ve´ci od a (M id). . .

10 Lo Mid + 1 M id postaje donja granica gornje polovine niza

11 }

12 Inaµce { Ako je traµzeni element jednak a (M id). . .

13 Poruka : Kljuc = a (M id) !Izlaz Prona†en je Kljuc

14 }

15 }

16 }

17 Poruka : Element nije prona†en Kljucnije prona†en

Table 4: Binarno pretrazivanje

U prvom prolazu se analizira niz duµzine n, u narednom koraku niz duµzine n=2, zatim niz duµzine n=2k i tako redom do duµzine 1. Ovdje k oznaµcava koliko puta je vršeno dijeljenje

sa 2. To znaµci da za posljednji korak mora vrijediti n

2k = 1) n = 2 m

) log n = m log 2 ) m = log n

log 2 = log2n := lg 2

Na ovaj naµcin je dobijena procjena maksimalnog broja koraka za postupak binarnog pretraµzivanja. Ako bi se broj elemenata pove´cao dva puta broj pretraµzivanja bi bio mnogo manji odnosno ne bi bio dvostruko ve´ci što je znaµcajna ušteda vremena rada.

4.3

Analiza kompleksnosti nekih tipova algoritama

4.3.1 Algoritmi konstantnog vremena

Primjer algoritma konstantnog vremena je izbor broja iz liste. Nije bitno koliko je lista dugaµcka. U jednom koraku se odabire jedan broj i posao se završava. Ako se ulaz pove´ca n puta vrijeme izvršenja se ne pove´cava odnosno "mijenja" se za faktor 1. U tom sluµcaju se kaµze da algoritam ima brzinu O (1).2

Prosta naredba ima (1)vrijeme što je i razlog za naziv. Niz mnogo jednostavnih naredbi još uvijek se izvršava u vremenu (1) :

Primjer iz realnog µzivota je izbor prvog dokumenta sa vrha gomile. Nije vaµzno kolika je gomila. Algoritmi sa konstantnim vremenom su najbolji mogu´ci algoritmi ukoliko vrijeme same operacije nije predugaµcko. Primjeri ovih algoritama su:

(30)

- Push i Pop operacije na stack-u (koji sadrµzi n elemenata); - Operacije umeatanja i uklanjanja u redu za izvršenje 4.3.2 Algoritmi u linearnom vremenu

Primjeri ovih algoritama su:

- Prolazak kroz listu (povezane liste ili niza) sa n elemenata

- Nalaµzenje maksimalnog ili minimalnog elementa u listi ili sekvencijalno pretraµzivanje nesortirane liste od n elemenata

- Prolazak stabla sa n µcvorova

- Iterativno raµcunanje faktorijela broja n; - Iterativno nalaµzenje n-tog Fibonaµcijevog broja - Utvr†ivanje da li je broj paran ili ne

Linearni algoritmi su veoma uobiµcajeni u programiranju i generalno su prihva´ceni kao e…kasni ako ne postoji bolji poznati naµcin za njegovo ubrzanje.

Primjer programskog koda je : for (int i = 0; i < n; i += c) // O(n)

statement(s);

Dodavanje konstante c brojaµcu petlje znaµci da vrijeme trajanja petlje raste linearno u odnosu na maksimalnu vrijednost za n. U ovom sluµcaju se petlja izvršava taµcno n=c puta. Analogno vrijedi ako se brojaµc i smanjuje za konstantu c.

4.3.3 Algoritmi sa kvadratnim vremenom Primjeri ovih algoritama su :

- Neki jednostavniji algoritmi sortiranja npr. selection sort n elemenata - Pore†enje dva dvodimenzinalna niza od po n n elemenata

- Nalaµzenje duplikata u nesortiranoj listi od n elemenata (implementirano sa dvije ugn-jeµzdene petlje)

Broj operacija, u oznaci O (n2), je proporcionalan kvadratu dimenzije resursa sa kojim

se radi.

Primjer programskog koda je :

for (int i = 0; i < n * n; i += c) // O(n2)

statement(s);

Maksimum petlje je n2 tako da je vrijeme izvršenja kvadratiµcno. U ovom sluµcaju petlja

se izvršava taµcno n2=c puta. Primjer ugnjeµzdene petlje je :

for (int i = 0; i < n; i += c) { // O(n2)

for (int j = 0; j < n; i += c) {

statement(s); }

}

Primjeri algoritama brzine O (nc), c > 1 su:

- Parsiranje putem stablasto udruµzenih gramatika (tree-adjoining grammar parsing), - Maksimalno poklapanje (matching) dva bipartitna grafa

(31)

4.3.4 Algoritmi sa logaritamskim vremenom Primjeri ovih algoritama su

- Binarno pretraµzivanje sortirane liste od n elemenata

- Operacije umetanja i nalaµzenja binarnog stabla sa n µcvorova - Operacije umetanja i uklanjanja u skupu (heap) sa n µcvorova

Brzina ovih algoritama, u oznaci O (log n), raste sporije od veliµcine ulaza. Ako se ulaz udvostruµci vrijeme izvo†enja se samo malo produµzi. Klasiµcan primjer algoritma u logari-tamskom vremenu je binarno pretraµzivanje. Primjer je poznata igra "poga†anje brojeva". U toj igri jedan igraµc mora pogoditi broj koji zamisli drugi igraµc. Na svakom koraku se vrši poga†anje na naµcin da saigraµc kaµze da li je predloµzeni broj ve´ci ili manji. Ako je broj izme†u 1 i 100 prvi prijedlog je 50. Time se prostor poga†anja smanjuje za polovinu. Naredni korak je predlaganje broja koji je u polovini odgovaraju´ceg intervala µcime se (grubo) suµzava krug brojeva za poga†anje. Ako se u toj igri poµcetni opseg udvostruµci broj poga†anja se ne udvostruµcava. Ako se ulaz pove´ca n puta potrebno je log2n lg n koraka dok se ne do†e do inicijalnog opsega.

Primjer programskog koda je :

for (int i = 1; i < n; i *= c) // O(log n) statement(s);

Mnoµzenje brojaµca petlje konstantom c znaµci da maksimalna vrijednost za n mora rasti eksponencijalno kako bi se vrijeme izvršenja petlje pove´cavalo linearno pa je iz tog razloga vrijeme izvršenja logaritamsko. U ovom sluµcaju je ck = n, gdje je k broj prolaza. Na

osnovu ovoga je k = logcn. Analogno vrijedi ako se brojaµc smanjuje za konstantni faktor

c.

Brzinu O (n log n) = O (log n!) (linearitamsko, loglinear, quasilinear) imaju operacije provo†enja Furijeove transformacije, algoritmi sortiranja, kao što su quick sort, merge sort heap sort.

4.3.5 Algoritmi brzine pn

Ovi algoritmi se izvršavaju proporcionalno kvadratnom korijenu od n (veliµcina ulaza). U ovom sluµcaju se izvršava petlja u kojoj i poµcinje naprimjer od 1 i pravi se korak koji se multiplikativno pove´cava za konstantu dok se ne postigne uslov i i < n. Ova petlja se ne´ce izvršiti svih n puta ve´c ´ce se zaustaviti kada i dostigne pn. Stoga ona ima vrijeme

(pn).

Primjer ovog algoritma je traµzenje odgovora na pitanje da li je broj n prost. Odgovor se moµze dobiti tako da se provjerava da li je djeljiv sa svim brojevima koji su manji od njega. Ako je n = 100 tada se moµze stati ako je djelilac ve´ci od 10 koji je p100.

4.3.6 Algoritmi sa eksponencijalnim vremenom Primjeri ovih algoritama su:

- Problem trgovaµckog putnika

- Rekurzivna implementacija generisanja Fibonaµcijevih brojeva - Hanojski tornjevi

(32)

- Raµcunanje determinante putem raµcunanja minora

Baš kao što postoje algoritmi na koje pove´canje obima ulaza nema uticaja postoje al-goritmi za koje se µcini da vrijeme izvršenja eksplodira. Kaµze se da se eksponencijalni algoritmi izvršavaju u O (an) ili eksponencijalnom vremenu.

Klasiµcni primjer algoritma sa eksponencijalnim vremenom izvršenja je Problem trgov-aµckog putnika (Traveling Salesman Problem - TSP), koji je do sada najviše izuµcavan u teoriji algoritama. Zadatak je jednostavan. Dato je n gradova; trgovaµcki putnik mora obi´ci svaki grad taµcno jednom prije nego ode ku´ci. Cilj je to uµciniti na najbolji mogu´ci naµcin bilo da je u pitanju najjeftiniji ili najkra´ci put. Pod najopštijim pretpostavkama, jedini poznati naµcin pouzdanog rješavanja problema je da se ispita svaki mogu´ci put i da se odabere najbolja. Ne postoji poznati naµcin da se eliminiše razumni dio putanja bez provjere svake od njih. Broj putanja je n!.

Algoritme sa eskponencijalnim vremenom izvršenja je potrebno izbjegavati što je više mogu´ce. Umjesto direktnog rješavanja traµze se "heuristike" koje su kra´ci naµcini da se dobiju dobri rezultati ali to nije garancija da su oni i najbolji mogu´ci. Heuristika za problem trgovaµckog putnika moµze biti : idi na najbliµzi neposje´ceni grad; zatim poveµzi par najbliµzih gradova. Dobra heuristika moµze biti teška ali je dobit u programskom rješenju. Postoje bitne razlike izme†u pojedinih eksponencijalni algoritama.

Formalno gledano, vrijedi sljede´ci odnos brzina algoritama

O (1) < O (log log n) < O (log n) < O (n) < O (n log n) < O (n2) < O (n2log n) < O (n3) < ::: <

O (an) <

O (n!) < O (nn)

4.3.7 Kombinacije algoritama

Nizovi naredbi. Za sekvence naredbi, ukljuµcuju´ci mogu´ce cijele blokova naredbi, uzima se najgore mogu´ce vrijeme izvršenja od svih naredbi. Naprimjer, blok vremena log n iza kojeg slijedi linearni blok ima ukupno vrijeme koje je linearno; efekat log n petlje naprosto išµcezava. Ne treba previše brinuti. Stara engleska izreka kaµze : brini o dolarima a centi ´ce se brinuti sami za sebe.

Konstrukcije Ako ... inaµce ... Za ove konstrukcije se uvijek uzima najgori mogu´ci sluµcaj ako ne postoji sigurnost šta ´ce se desiti. Najgori sluµcaj u bilo kojoj konstrukciji ovog tipa je da se izvršava bilo Ako bilo inaµce dio, koji god da je od njih najgori. Iz praktiµcnih razloga se uzima kako da se dešavaju obje strane.

U izboru najgoreg mogu´ceg sluµcaja mogu se slijediti dva prosta pravila.

1. Ako vrijeme ukljuµcuje stepen od n kao što je n2 ili n1=2 tada je blok sa ve´cim stepenom

od n gori

2. Ako su stepeni od n jednaki ili ako nema stepena od n blok sa više log n je lošiji Naprimjer, ako se poredi npn lg n sa lg3n prvi broj ima stepen n1;5 dok drugi ima 0 kao

stepen za n. Dakle, prvi od njih je lošiji.

Petlje. Vrijeme izvršenja jednostavne petlje (koja sadrµzi samo jednostavne naredbe) zavisi od toga koliko puta se petlja izvršava. Vrijeme petlji u nizu se sabira što znaµci da dominira petlja sa ve´cim vremenom izvršenja. Primjer je :

(33)

for (int i = 0; i < n; i += c) { // O(n) statement;

}

for (int i = 0; i < n; i += c) { // O(n log n) for (int j = 0; j < n; i *= c) {

statement; }

}

Ugnjeµzdeni blokovi. Ako je blok ugra†en unutar drugog bloka efekti se multipliciraju. Ukupno vrijeme izvršenja postaje (n2). Primjer je pore†enje dvije nesortirane liste

kako bi se vidjelo da li je neka stavka sadrµzana u obje liste. Uzima se element prve liste i poredi sa svakim elementom druge liste što uzima vrijeme reda n. S obzirom da se posao ponavlja za n elemenata druge liste obavlja se n n = n2operacija pore†enja. Dupliranje

(34)

5 Euklidov algoritam

5.1

Uvod

Euklidov algoritam je dobio je ime po starogrµckom matematiµcaru Euklidu. To je na-je…kasniji algoritam za odre†ivanje najve´ceg zajedniµckog djelitelja dva ili više brojeva. Prvi poznati saµcuvani opis Euklidovog algoritma se nalazi u Elementima (oko 300. go-dine p.n.e.), što ga µcini najstarijim numeriµckim algoritmom koji se još uvijek aktivno koristi. U originalu, objašnjen je samo za prirodne brojeve i geometrijske duµzine (re-alne brojeve), ali je u 19. stolje´cu primjenjen na polinome i na Gaussove cijele brojeve, što je dovelo do razvoja novih pojmova apstraktne algebre. Euklidov algoritam je dalje primjenjivan na drugim matematiµckim strukturama, poput µcvorova i polinoma.

Euklidov algoritam ima široku terijsku i praktiµcnu primenu. Predstavlja kljuµcni element RSA algoritma, metode asimetriµcne kriptogra…je koja se u znaµcajnoj meri primenjuje u elektronskom poslovanju. Moµze se upotrijebiti za konstruiranje veriµznih razlomaka, u Sturmovoj metodi za odre†ivanje realnih nula polinoma i još nekoliko suvremenih al-goritama za faktorizaciju prirodnih brojeva. Na kraju, Euklidov algoritam je osnovno sredstvo za dokazivanje teorema moderne teorije brojeva, kao što su Lagrangeova teo-rem o µcetiri kvadrata i osnovna teoteo-rema aritmetike o jedinstvenoj faktorizaciji prirodnih brojeva. Euklidov algoritam je e…kasan naµcin za odre†ivanje NZD velikih brojeva zbog toga što mu ne treba više koraka od petostrukog broja cifara manjeg broja zapisanog sa osnovom 10, što je dokazao Gabrijel Lame 1844. godine i time oznaµcio poµcetak teorije kompleksnosti.

U 20. stolje´cu su razvijene metode za poboljšanje e…kasnosti Euklidovog algoritma.

5.2

Kako radi Euklidov algoritam ?

Teorem (Euklidov algoritam)

Neka su a; b 2 Z gdje je a; b > 0; a > b. Pretpostavimo da je uzastopnom primjenom teorema o dijeljenju ostatkom dobijen niz jednakosti

a = b q1+ r1; 0 < r1 < b

b = r1 q2 + r2; 0 < r2 < r1

...

rj 2 = rj 1 qj+ rj; 0 < rj < rj 1

rj 1= rj qj+1

Tada je (a; b) = rj odnosno najve´ci zajedniµcki djelitelj je jednak posljednjem ostatku koji

je razliµcit od nule u Euklidovom algoritmu

Do situacije rj+1 = 0 se dolazi u konaµcno mnogo koraka jer rj+1 = 0 implicira da je

N ZD (a; b) = N ZD (c; r1) = ::: = N ZD (rj 1; rj) = rj.

(35)

Euklidov algoritam za nalaµzenje najve´ceg zajedniµckog djelioca dva broja

Primjer. Euklidovim algoritmom na´ci najve´ci zajedniµcki djelitelj brojeva 3102 i 4002. 4002 = 1 3102 + 900 3102 = 3 900 + 402 900 = 2 402 + 96 402 = 4 96 + 18 96 = 5 18 + 6 18 = 3 6 ) NZD (4002; 3102) = 6

Pokazuje se da sloµzenost Euklidovog algoritma zavisi o logaritamski manjem broju b i to nezavisno od a b.

Pojedine jednadµzbe u postupku Euklidovog algoritma, kao u prethodnom primjeru, ´cemo zvati Euklidske jednadµzbe. Kako se vidi, provedeno je ukupno 10 dijeljenja. Ostaci su tako†e Fibonaµcijevi brojevi. Ovo je jasno jer iz jednakosti Fn = 1 Fn 1+ Fn 2 slijedi

da se dijeljenjem broja Fn sa Fn 1 u svakom koraku dobije kvocijent 1 i ostatak Fn 2. Iz

ovoga generalno vrijedi

Teorem (Euklidov algoritam). Neka su r0 = ai r1 = b cijeli brojevi takvi da je a; b > 0.

Ako se sukcesivnom primjenom algoritma o dijeljenju cijelih brojeva dobije rj = rj+1 qj+1+ rj+2; 0 < rj+2 < rj+1 (j = 0; 1; :::; n 2) i rn+1 = 0

tada je N ZD (a; b) = rn tj. posljednji nenulti ostatak je N ZD (a; b).

Algoritam izloµzen u navedenom teoremu naziva se Euklidov algoritam. Propozicija. U Euklidovom algoritmu za svako i vrijedi ri+2 <

1 2ri.

(36)

Dokaz. Ako je ri+1

1

2ri tada je ri+2 < ri+1 1

2ri. Neka je ri+1 > 1

2ri. Tada je ri < 2ri+1. Tada iz ri = qi+2 ri+1+ ri+2 slijedi qi+2= 1 tj. ri = ri+1+ ri+2. Odavdje je

ri+2= ri ri+1<

1

2ri. Dakle, tvrdnja vrijedi i u ovom sluµcaju

Ovaj algoritam vrijedi i za Fibonaµcijeve brojeve što ´ce biti ilustrovano na dva Fibonaµcijeva broja F11= 89 i F12 = 144 144 = 1 89 + 55 89 = 1 55 + 34 55 = 1 34 + 21 34 = 1 21 + 13 21 = 1 13 + 8 13 = 1 8 + 5 8 = 1 5 + 3 5 = 1 3 + 2 3 = 1 2 + 1 2 = 1 2 + 0

Teorem. Neka je f1 = 1; f2 = 1; fn = fn 1+ fn 2 (n 3) Fibonaµcijev niz brojeva Za

svako n 2Euklidov algoritam uzima taµcno n dijeljenja za odre†ivanje GCD (fn+1; fn+2).

Dokaz. Polaze´ci od rekurzivne jednakosti fi+2= fi+1+ fi (i = 1; 2;) dobijamo

fn+2= fn+1 1 + fn

fn+1= fn 1 + fn 1

::: f4 = f3 1 + f2

f3 = f2 2

Dakle, Euklidov algoritam za odre†ivanje GCD (fn+2; fn+1) uzima taµcno n dijeljenja i

vrijedi GCD (fn+2; fn+1) f2 1.

Teorem (Lame-ov teorem). Broj dijeljenja potrebnih za odre†ivanje najve´ceg zajed-niµckog djelioca prirodnih brojeva a i b ne prelazi petostruku vrijednost broja decimalnih cifara manjeg od ta dva broja.

Dokaz. Neka je a > b. Kada se primijeni Euklidov algoritam za odre†ivanje najve´ceg zajedniµckog djelioca brojeva a = r0 i b = r1 dobija se sljede´ci niz relacija:

r0 = r1 q1+ r2; 0 < r2 < r1

r1 = r2 q2 + r3; 0 < r3 < r2

:::

rn 2 = rn 1 qn 1+ rn; 0 < rn< rn 1

rn 1 = rn qn

Koristi se n dijeljenja. Potrebno je primijetiti da su svi koe…cijenti q1; q2; :::; qn 1 ve´ci ili

jednaki 1 i da je qn 2 jer je rn< rn 1. Zbog toga je

rn 1 = f2

rn 1 2rn 2f2 = f3

rn 2 rn 1+ rn f3+ f2 = f4

(37)

:::

r2 r3+ r4 fn 1+ fn 2= fn

b = r1 r2+ r3 fn+ fn 1 = fn+1

Dakle, ako imamo n dijeljenja u Euklidovom algoritmu tada je min fa; bg fn+1. Neka

je = 1 + p

5

2 . Tada je

2 = + 1. Matematiµckom indukcijom se jednostavno dokazuje

da je fn > n 2 za svako n 2 N, n 3. Zbog toga je b fn+1 > n 1 tj. log b >

(n 1) log . Kako je log > 1

5 to je log b >

n 1

5 . Dakle, n 1 < 5 log b. Ako b ima k cifara u decimalnom zapisu onda je b < 10k pa je log b < k. To znaµci da je n < 1 + 5k

odnosno n 5k.

5.3

Zadaci za samostalni rad

Zadatak. Dati su prirodni brojevi m; n1; n2; :::; nm(m 2). Izraµcunati N ZD (n1; n2; :::; nm)

koriste´ci se relacijom N ZD (n1; n2; :::; nk) = N ZD (N ZD (n1; n2; :::; nk 1) ; nk) i

algorit-mom Euklida.

Zadatak. Dati su prirodni brojevi m i n. Korištenjem Euklidovog algoritma na´ci: Najve´ci zajedniµcki djelitelj (NZD) brojeva m i n

Najmanji zajedniµcki sadrµzalac brojeva m i n

(38)

6 Asimptotska procjena sloµzenosti algoritma

6.1

Uvod

µ

Cesto je teško, pa i nemogu´ce, izvesti egzaktnu formulu za broj operacija nekog algoritma. Zato se prouµcava asimptotsko ponašanje broja operacija kad veliµcina ulaznih podataka neograniµceno raste. Najpoznatije asimpotske notacije sloµzenosti algoritma su: -notacija, O-notacija i -notacija.

6.1.1 -notacija

De…nicija. Neka je g (n) funkcija de…nisana na nekom podskupu skupa prirodnih brojeva i µciji je skup vrijednosti neki podskup skupa realnih brojeva. Sa (g (n)) se oznaµcava skup funkcija f (n) takvih da postoje pozitivne konstante c1, c2 i prirodan broj n0 takvi

da je

0 c1g (n) f (n) c2g (n) za svako n n0

Ovdje oznaµcava klasu funkcija a f (n) = (g (n)) je oznaka za inkluziju f (n) 2 (g (n)).

Primjer 1. Neka je f (n) = 23n2 n, n 2 N. Tada je f (n) = (n2). Najprije, vrijedi c1n2 23n2 n c2n2 za svako n0 n ako i samo ako c1 23 n1 c2 za svako

n0 n. Odavdje slijedi da mora biti c2 23. Kako c1 mora biti pozitivan broj to mora

biti 23 1n 0. To znaµci da je dovoljno uzeti n0 = 3. Iz c1 23 13 slijedi c1 13. Dakle,

vrijedi da je 1 3n

2 f (n) 2

3n

2 za svako n 3.

Primjer 2. Neka je f (n) = an2 + bn + c gdje su a; b; c konstante i a > 0. Da li je

f (n) = (n2) ? Potrebno je odrediti konstante c1 i c2 i prirodan broj n0 takve da je

c1n2 an2+ bn + c c2n2 za svako n > n0. Neka je c1 < ai c2 > a. Tada su nejednaµcine

(a c1) n2+ bn + c 0 i (c2 a) n2+ bn + c 0zadovoljene za sve prirodne brojeve n0

takve da je n0 > maxfx1; x2; y1; y2g gdje su x1 i x2 nule polinoma (a c1) n2+ bn + c a y1

i y2 nule polinoma (c2 a) n2+ bn + c ako postoje; ako ne postoje onda je n0 = 1. znaµci,

vrijedi f (n) 2 (n2). Tako†e, ako je f (n) polinom stepena m µciji je vode´ci koe…cijent

pozitivan onda je f (n) = (nm). 6.1.2 O-notacija

De…nicija. Neka je g (n) realna funkcija de…nisana na nekom podskupu skupa prirod-nih brojeva. Sa O (g (n)) se oznaµcava skup realprirod-nih funkcija f (n) de…nisaprirod-nih na nekom podskupu skupa realnih brojeva takvih da postoji pozitivna konstanta c i prirodan broj n0 takvi da je

0 f (n) c g (n) ; za svako n n0

Ovdje O oznaµcava klasu funkcija a f (n) = O (g (n)) je oznaka za inkluziju f (n) 2 O (g (n)). Treba primijetiti da f (n) = (g (n)) povlaµci f (n) = O (g (n)).

Veliµcina O ( ) se tumaµci tako da je g (n) gornja granica za f (n). U tom smislu, oznaka f (n) =O (g (n)) se tumaµci da "f ne raste brµze od g".

(39)

Notacija Veliko-O (O) ima dvije glavne oblasti primjene. U matematici se obiµcno koristi da opiše koliko blisko konaµcni niz aproksimira datu funkciju, posebno u sluµcaju skra´cenog (truncated) Tejlorovog niza ili asimptotske ekspanzije. U kompjuterskoj nauci je korisna za analizu algoritama. U obje vrste primjene funkcija koja se pojavljuje unutar O ( ) tipiµcno se bira da bude što je mogu´ce jednostavnija, pri µcemu se izostavljaju konstantni faktori i µclanovi manjeg reda.

Postoje dva formalno bliska ali bitno razliµcita korištenja ove notacije: beskonaµcna (in…-nite) i in…nitezimalna asimptotika. Ova razlika je jedino u primjeni ali nije i principijelna. Formalna de…nicija za O ( ) je jednaka u oba sluµcaja sa razliµcitim limitima za argumente funkcije.

U nastavku ´ce biti navedeno nekoliko jednostavnih ali znaµcajnih osobina O notacije. 1. Ako je f (n) = O (g (n)) tada je a f (n) = O (g (n)) za svaku pozitivnu konstantu a. 2. Ako je fi(n) =O (gi(n)), i = 1; 2; :::; k tada je f1(n) + f2(n) + ::: + fk(n) =O ((g1+ g2+ ::: + gk) (n)) 3. Ako je fi(n) =O (g (n)), i = 1; 2; :::; k tada je f1(n) + f2(n) + ::: + fk(n) =O (g (n)) 4. Ako je fi(n) =O (gi(n)), i = 1; 2; :::; k tada je f1(n) f2(n) ::: fk(n) =O (g1(n) g2(n) ::: gk(n))

Ako je f (n) monotono rastu´ca funkcija koja nije ograniµcena, a > 1 i c > 0, tada f (n)c =O af (n) Za f (n) = n dobija se nc = O (an) a za f (n) = log an dobija se (logan) c =O alogan =

O (n) što znaµci da proizvoljan stepen logaritamske funkcije raste spporije od linearne funkcije. Primjer. Kako je lim n!1 ln n n = 0

za svako > 0 tada vrijedi da je ln n = O (n ) za svako > 0.

Primjer. Neka je f (n) broj bita broja n. Tada je f (n) = [log2n] + 1. Kako je

lim

n!1

f (n) log2n = 1

tada vrijedi da je f (n) = O (log2n). S obzirom da je log2n = ln nln 2 to je f (n) = O (ln n).

6.1.3 -notacija

De…nicija. Neka je g (n) realna funkcija de…nisana na nekom podskupu prirodnih bro-jeva. Sa (g (n))se oznaµcava skup realnih funkcija f (n) de…nisanih na nekom podskupu skupa realnih brojeva takvih da postoji konstanta c > 0 i prirodan broj n0 takvi da vrijedi

0 c g (n) f (n) za svako n n0.

Ovdje ( ) oznaµcava klasu funkcija a f (n) = (g (n)) je oznaka za inkluziju f (n) 2 (g (n)).

(40)

Veliµcina ( ) se tumaµci tako da je g (n) donja granica za f (n). U tom smislu, oznaka f (n) = (g (n)) se tumaµci da "f raste najmanje kako raste g".

Iz de…nicije asimpotskih notacija direktno slijedi naredni teorem.

Teorem. Za bilo koje dvije funkcije f (n) i g (n) vrijedi f (n) = (g (n))ako i samo ako je f (n) = O (g (n)) i f (n) = (g (n)).

6.1.4 Primjeri raµcunanja sloµzenosti

Primjer 1. Sabiranje ili oduzimanje dva n-bitna cijela broja ima kompleksnost O (n). Za analizu kompleksnosti mnoµzenja dva broja potreban je kratki prikaz postupka. Jedan od mogu´cih naµcina mnoµzenja dva cijela n-bitna broja je tzv. digitalni metod. Neka su a = (a2n 1a2n 2:::a1a0)2

b = (b2n 1b2n 2:::b1b0)2

Moµze se staviti

A1 = (a2n 1a2n 2:::an+1an)2; A0 = (an 1an 2:::a1a0)2

B1 = (b2n 1b2n 2:::bn+1bn)2; B0 = (bn 1bn 2:::b1b0)2

Tada se moµze staviti a = 2n A1+ A0 i b = 2n B1+ B0. Odavdje je

a b = (22n+ 2n) A

1B1+ 2n(A1 A0) (B0 B1) + (2n+ 1) A0B0

Ovo znaµci da se za proizvod dva 2n-bitna broja moraju izraµcunati dvije razlike A1 A0

i B0 B1 dva n-bitna broja, tri proizvoda A1B1, (A1 A0) (B0 B1), A0B0 a zatim

izvršiti pomjeranje ulijevo i sabiranje.

Ako se sa M (n) oznaµci broj bit operacija potrebnih za mnoµzenje dva n-bitna cijela broja onda vrijedi

M (2n) 3 M (n) + C n

gdje je C konstanta. Naime, svako mnoµzenje dva n-bitna cijela broja zahtijeva M (n) bitnih operacija a sabiranje, oduzimanje i pomjeranje ulijevo su operacije reda O (n). Odavdje se dobija relacija

M 2k D 3k 2k

gdje je D = max fM (2) ; Cg.

Teorem. Mnoµzenje dva n-bitna cijela broja moµze biti izvedeno korištenjem O nlog23

bit operacija.

Dokaz. Za mnoµzenje dva n-bitna broja je potrebno M (n) bit operacija. Na osnovu prethodnih relacija vrijedi:

M (n) = M 2log2n M 2[log2n]+1

D 3[log2n]+1 2[log2n]+1 < D 3[log2n]+1

3 D 3[log2n] 3D 3[log2n] = (3D) nlog23

Odavdje imamo da je M (n) = O nlog23 .

Primjer 2. Na´ci O (n!).

Rješenje. Kako je n! = 1 2 ::: n = (::: ((2 3) 4) 5:::) n, za raµcunanje broja n! je potrebno n 2 mnoµzenja. Najprije se mnoµzi 2 3 pa se dobijeni proizvod pomnoµzi sa 4, novi rezultat sa 5 itd dok se ne do†e do mnoµzenja sa n. U koraku (i 1) se i! mnoµzi sa i + 1 pa je stoga broj mnoµzenja jednak n 2. Za odre†ivanje broja bit operacija treba se podsjetiti µcinjenice da je broj cifara proizvoda dva binarna broja jednak sumi cifara faktora ili je za 1 manji od te sume. Neka broj n ima k bita. Svaki broj manji od n ima

(41)

najviše k bita. Stoga je n!, kao proizvod n brojeva sa najviše k bita, najviše nk bitni broj. Broj bita broja n! je manji ili jednak sumi bita svakog faktora što je manje ili jednako nk. Zbog toga je, za svaki prirodan broj i n, broj i! najviše n k-bitni. Za mnoµzenje i! sa i potrebno je najviše (nk)k = nk2 bit operacija. Kako ovakvih mnoµzenja ima (n 2)

to je za izraµcunavanje n! potrebno najviše

(n 2) (nk2) = n (n 2) (1 +blog2nc)2 = n (n 2) (lg n)2 =O (n lg n)2 bit operacija.

(42)

7 Analiza kompleksnosti - nastavak

7.1

Uvod

Cilj analize algoritama je da se predvidi njegovo ponašanje, posebno brzina izvršavanja, bez realizacije na nekom (konkretnom) raµcunaru. Ideja je da se procijeni brzina rada bez realizacije samog algoritma tako da procjena vrijedi za svaki raµcunar.

Taµcno ponašanje algoritma je nemogu´ce predvidjeti osim u najjednostavnijim sluµcaje-vima. Na ponašanje utiµce mnogo faktora pa se u obzir uzimaju samo glavne karakteristike a zanemaruju se detalji vezani za taµcnu realizaciju. Iz tog razloga analiza algoritma je pri-bliµzna. Na taj naµcin se, ipak, dobijaju znaµcajne informacije o algoritmu koje omogu´cavaju upore†ivanje razliµcitih algoritama za rješavanje istog problema.

Logiµcan korak je da se zanemare konstantni faktori jer se brzine izvršavanja algoritama na raznim raµcunarima razlikuju pribliµzno za konstantan faktor. Od interesa je ocjena algoritma kada ulazna veliµcina teµzi beskonaµcnosti.

U analizi algoritama se za svaki ulaz odre†uje njegova veliµcina (dimenzija) n. Veliµcina ulaza nije striktno de…nisana; obiµcno je to mjera veliµcine memorijskog prostora potrebnog za smještanje ulaza.

Ocjena vremenske sloµzenosti algoritma se sastoji u brojanju raµcunskih koraka koje treba izvršiti. Termin "raµcunska operacija" moµze obuhvatiti više tipova operacija kao što je sabiranje i mnoµzenje. Vrijeme izvršavanja zavisi od konkretnog raµcunara, odabranog programskog jezika i sliµcno. Stoga se u algoritmu izdvaja korak koji se ponavlja i koji na taj naµcin postaje osnova analize. Naprimjer, u sortiranju je to upore†ivanje.

Osnovna pravila za kalkulisanje sloµzenosti algoritama su :

Svaka instrukcija u sekvenci se broji kao 1 bez obzira na to koliko je izraz sloµzen i koliko se stvarno koristi mašinskih instrukcija

Konstrukcija "Za Svaki <>..." se broji n + 1 puta ako se tijelo petlje izvrši n puta Konstrukcija "Za svaki <>" se broji n + 1 puta ako se tijelo petlje izvrši n puta Konstrukcija "Ako <>" se broji kao 1 svaki put kad se "postavi pitanje" a ono što uslovljava naredba "Ako ..." broji se onoliko puta koliko to zahtijeva konkretni sluµcaj

Konstrukcija "SveDok(<uslov>)" se broji n + 1 puta ako se tijelo petlje izvrši n puta

(43)

# Sekvencijalno traµzenje Broj Opis

1 TraziSek(a; n; Kljuc) Ulaz : niz [a] duµzine n i Kljuc

2 N asao ? 1 Inicijalizacija radne promjenljive

3 Za sve i = 1 do n { n + 1 Poµcetak unutrašnje petlje 4 Ako je a [i] = Kljuc tada { n Postavljanje upita

5 N asao > q Postavljanje na drugu vrijednost

6 }

7 }

Table 5: Sekvencijalno pretrazivanje

7.2

Zadaci

Primjer. Sekvencijalno pretraµzivanje.

U ovom primjeru je prezentirana metoda sekvencijalnog pretraµzivanja niza u kojem se traµzi vrijednost Kljuc.

Ovdje je q oznaka da li se realizovao uslov "Ako ...". Na osnovu ovoga se moµze zakljuµciti da se sloµzenost ovog algoritma izraµzava izrazom

F (n) = 2n + 2

Ovo je vrijednost za najgori sluµcaj, kada se uslov na liniji 3 izvrši n puta. Na taj naµcin se zakljuµcuje da algoritam ima linearnu brzinu odnosno F (n) = O (n). Drugim rijeµcima, linearno pove´canje broja elemenata koji se ispituju znaµci linearno pove´canje vremena za njegovo izvršenje.

Primjer. Bubble sort

U ovom primjeru je data analiza sloµzenosti algoritma tzv. Bubble sorta.

# Sortiranje Broj Opis

1 BubbleSort(a [n]) Sortiranje niza a [n]

2 Za i = 1 do n 1 { n Poµcetak vanjske petlje

3 Za j = n 1 do i korak 1 { Poµcetak unutrašnje petlje

4 Ako je (a [j] > a [j + 1]) tada { Upit

5 b a [j] Zamjena vrijednosti 6 a [j] a [j + 1] 7 a [j + 1] b 8 } 9 } 10 }

Table 6: Analiza Bubble sort metode

Korak na liniji 2 se izvodi n puta. Korak na liniji 3 se za i = 1 izvodi n puta, za i = 2 izvodi n 1 puta, ..., sve do i = n 1kada se izvodi 2 puta. Korak na liniji 4 se izvodi sekvencijalno n 1; n 2; :::; 1puta za i = 1; n 1. Koraci na linijama 5, 6 i 7 se izvode isti broj puta kao i korak (upit) na liniji 4. To znaµci da je ukupan broj koraka ovog

(44)

F (n) = n + (1 + 2 + 3 + ::: + n 1) + 4 (1 + 2 + ::: + (n 1)) F (n) = n + n (n + 1) 2 1 + 4 n (n 1) 2 F (n) = n (5n 6) 2

Ovo je broj za najgori sluµcaj : kada je poµcetni niz sortiran opadaju´cim redom. Zakljuµcak je da je F (n) = O (n2) odnosno da se algoritam izvodi u kvadratnom vremenu.

Primjer. Sumiranje sa pove´canjem inkrementa

Sljede´ci primjer ilustruje kompleksnost u sluµcaju kada se u svakom koraku gornja granica brojaµca pove´cava dva puta.

# Korak Broj Opis

1 Sumiraj(n) Ulaz : broj iteracija (n)

2 k 1 1 Inicijalizacija

3 Suma 0 1 Inicijalizacija sume

4 Za i = 1 do n { n + 1 Poµcetak spoljne petlje

5 Za j = 1 do k { Poµcetak unutrašnje petlje

6 Suma Suma + i j 2n 1 Sumiranje

7 }

8 k k + k n Dupliranje varijable k

9 }

Table 7: Sumiranje sa rastucim inkrementom

Najprije ´cemo napraviti analizu šta ovaj algoritam radi. Ako je i = 1 tada se vrši jedno sumiranje na liniji 6. Ako je i = 2 tada se vrše 4 sumiranja na liniji 6. Razlog je u µcinjenici da se linija 8, na kojoj se vrijednost za k udvostruµcava, izvršava onoliko puta koliko se promijeni i odnosno n puta. Na taj naµcin unutrašnja petlja vrši uzastopno sumiranje 1; 2; 4; :::; 2n 1 µclanova. Ne treba izgubiti iz vida da se unutrašnja petlja izvršava 2k+ 1 puta. Na osnovu toga, broj koraka izvršenja ovog algoritma je

F (n) = 1 + 1 + (n + 1) + (1 + 2 + ::: + 2n 1+ n 1) + (2n 1) + n

F (n) = 3n + 1 + 2 (2n 1) = 2n+1+ 3n 1

Zakljuµcak je da je F (n) = O (2n) s obzirom da je 2n+1 = 2n 2.

Zadatak. Dokazati da je vrijeme T (n) = n3+ 20n + 1 jednako O (n3).

Dokaz. Prema de…niciji O notacije, T (n) = O (n3) ako je T (n) c n3 za neko n n 0.

Ako je n3 + 20n + 1 c n3 tada 1 + 20

n2 +

1

n3 c. Ovo vrijedi za svako n n0 = 1 i

c 22. Za ve´ce vrijednosti n0 potreban je manji broj c (npr. za n0 = 10 je c 1:201)

ali u svakom sluµcaju vrijedi traµzena nejednakost.

Zadatak. Pokazati da vrijeme T (n) = n3+ 20n + 1 nije O (n2).

Dokaz. Prema de…niciji O notacije, T (n) = O (n3) ako je T (n) c n3 za neko n n 0.

Ako je n3+ 20n + 1 c n3 tada 1 +20

n2 +

1

(45)

raste neograniµceno tako da ne postoji konstanta c. Stoga, O uslov ne moµze vrijediti u ovom sluµcaju.

Zadatak. Pokazati da je vrijeme T (n) = n3+ 20n + 1 jednako O (n4).

Dokaz. Prema de…niciji O notacije, T (n) = O (n4) ako je T (n) c n4 za neko n n 0. Ako je n3+ 20n + 1 c n3 tada 1 n + 20 n3 + 1

n4 c. Ovo vrijedi za svako n n0 = 1 i

c 22. Za ve´ce vrijednosti n0 potreban je manji broj c (npr. za n0 = 10 je c 1:201)

ali u svakom sluµcaju vrijedi traµzena nejednakost.

Zadatak. Pokazati da je vrijeme T (n) = n3+ 20n jednako (n2).

Dokaz. Prema de…niciji notacije, T (n) = (n2) ako je T (n) c n2 za neko n n 0.

Ako je n3+ 20n + 1 c n2 tada n +20

n c. Lijeva strana nejednakosti ima minimalnu vrijednost 8:94 za n = p20. Stoga uslov za vrijedi za svako n n0 = 5 i c 9. Za

ve´ce vrijednosti n0 potreban je ve´ci broj c (npr. za n0 = 10 je c 12:01) ali u svakom

sluµcaju vrijedi traµzena nejednakost.

7.3

Zadaci za samostalni rad

Zadatak. Napraviti algoritam i ispitati sloµzenost u sljede´cim sluµcajevima

100 X i=1 50 X j=1 1 i + j2 100 X i=1 60 X j=1 sin (i3+ j4) 100 X i=1 100 X j=1 j i + 1 i + j 100 X i=1 i X j=1 1 2j + i n X k=1 k (k + 1) :: k2 n X k=1 kk n X k=1 1 (k2)! n X k=1 ( 1)k(2k2+ 1)!

(46)

bi = n X j=1 a2ij bi = n X j=1 ( 1)i+jaij bi = n Y j=1 aij bi = n X j=1 jajij bi = n Y j=1 aij, gdje je 1 < aji n bi = max aij 1 j n ; bi = min aji 1 j n

Figure

Actualización...

Referencias

Actualización...

Related subjects :