Algoritmi i programiranje

151
JU UNIVERZITET U TUZLI Prirodno matematički fakultet Odsjek matematika II godina studija Matematike ALGORITMI I PROGRAMIRANJE Radni materijal za vježbe Autori : Dr.sc. Esmir Pilav Zoran Jasak, Mr.sci.math. Decembar 2013. godine

description

Skripta iz predmeta Algoritmi i programiranje

Transcript of Algoritmi i programiranje

Page 1: Algoritmi i programiranje

JU UNIVERZITET U TUZLI

Prirodno matematički fakultet

Odsjek matematika

II godina studija Matematike

ALGORITMI

I

PROGRAMIRANJE Radni materijal za vježbe

Autori :

Dr.sc. Esmir Pilav

Zoran Jasak, Mr.sci.math.

Decembar 2013. godine

Page 2: Algoritmi i programiranje

Uvod

Ovaj tekst je namijenjen studentima druge godine dodiplomskog studija Prirodno

matematičkog fakulteta u Tuzli na Odsjeku za matematiku kao dio materijala za predmet

Algoritmi i programiranje u zimskom semestru akademske 2013/2014. godine. Namjena

teksta je da pruži osnovne informacije iz ove oblasti kao podloga za dalji samostalni rad

studenata.

Tekst obuhvata teorijski dio poglavlja koja su predviđena planom ovog predmeta. Tekst ne

obuhvata zadatke koji su rađeni kao praktični primjeri pojedinih vrsta algoritama. Njihova

namjena je bila izgraditi analitički pristup u rješavanju praktičnih matematičkih problema.

NAPOMENA : Tekst i dijelovi teksta ne mogu biti reprodukovani ili preuzimani bez znanja i

saglasnosti autora.

Autori :

Esmir Pilav, Dr.sci.,

Zoran Jasak, Mr.sci.math.,

[email protected]

Page 3: Algoritmi i programiranje

Sadrµzaj

1 Op�ti pojmovi o algoritmima 11.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 Linijski i algoritmi i algoritmi grananja 62.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3 Zadaci za vjeµzbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3 Cikliµcni algoritmi 153.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.2 Nizovi i matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.3 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.4 Zadaci za vjeµzbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4 Analiza kompleksnosti algoritama na primjerima 414.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.3 Analiza kompleksnosti nekih tipova algoritama . . . . . . . . . . . . . . . 43

4.3.1 Algoritmi konstantnog vremena . . . . . . . . . . . . . . . . . . . 434.3.2 Algoritmi u linearnom vremenu . . . . . . . . . . . . . . . . . . . 444.3.3 Algoritmi sa kvadratnim vremenom . . . . . . . . . . . . . . . . . 444.3.4 Algoritmi sa logaritamskim vremenom . . . . . . . . . . . . . . . 454.3.5 Algoritmi brzine

pn . . . . . . . . . . . . . . . . . . . . . . . . . 45

4.3.6 Algoritmi sa eksponencijalnim vremenom . . . . . . . . . . . . . . 464.3.7 Kombinacije algoritama . . . . . . . . . . . . . . . . . . . . . . . 46

5 Asimptotska procjena sloµzenosti algoritma 485.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

5.1.1 �-notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.1.2 O-notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.1.3 -notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.1.4 Primjeri raµcunanja sloµzenosti . . . . . . . . . . . . . . . . . . . . 50

6 Analiza kompleksnosti - nastavak 526.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.3 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

7 Rekurzije 567.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587.3 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

8 Euklidov algoritam 658.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658.2 Kako radi Euklidov algoritam ? . . . . . . . . . . . . . . . . . . . . . . . 658.3 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

i

Page 4: Algoritmi i programiranje

9 Tjuringova ma�ina 699.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699.2 Alan Tjuring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699.3 Alfabet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709.4 Neformalni opis Tjuringove ma�ine . . . . . . . . . . . . . . . . . . . . . 709.5 Formalni opis Tjuringove ma�ine . . . . . . . . . . . . . . . . . . . . . . 729.6 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

10 Sortiranja 8110.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8110.2 Sortiranje nizova - osnovne metode . . . . . . . . . . . . . . . . . . . . . 81

10.2.1 Sortiranje putem umetanja (Insertion sort) . . . . . . . . . . . . . 8210.2.2 Shell sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8510.2.3 Sortiranje putem direktne podjele (Selection sort) . . . . . . . . . 8810.2.4 Sortiranje putem zamjene (Bubble sort) . . . . . . . . . . . . . . 91

10.3 Pobolj�ane metode (sloµzenost n log n) . . . . . . . . . . . . . . . . . . . . 9610.3.1 Merge sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9610.3.2 Quick sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

11 Grafovski algoritmi 10411.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10411.2 Algoritmi pretraµzivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10511.3 Algoritmi najkraceg puta . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

11.3.1 Dijkstra algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . 10711.4 Pohlepni algoritmi na grafovima . . . . . . . . . . . . . . . . . . . . . . . 109

11.4.1 Kruskalov algoritam . . . . . . . . . . . . . . . . . . . . . . . . . 11111.4.2 Primov algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

11.5 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11411.6 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

12 Programski jezik C++ 12412.1 Rad sa datotekama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12412.2 Klase i objektno programiranje . . . . . . . . . . . . . . . . . . . . . . . 12512.3 Zakljuµcak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

13 NP kompleksnost 13513.1 Problemi odluµcivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13613.2 Problemi prepoznavanja jezika . . . . . . . . . . . . . . . . . . . . . . . . 13713.3 Veri�kacija polinomijalnog vremena i certi�kati . . . . . . . . . . . . . . 139

13.3.1 NP klasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14013.3.2 Problem tri boje . . . . . . . . . . . . . . . . . . . . . . . . . . . 14113.3.3 Clique pokrivaµc (cover) (CCov) . . . . . . . . . . . . . . . . . . . 14213.3.4 Redukcija na polinomijalno vrijeme . . . . . . . . . . . . . . . . . 143

13.4 NP kompletnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

14 Literatura 147

ii

Page 5: Algoritmi i programiranje

1 Op�ti pojmovi o algoritmima

1.1 Uvod

1.01. Termin "algoritam" je nastao po latinskom prevodu imena matematiµcara iz deve-tog vijeka, Abu Jafar Muhammad Ibn Musu Al-Khowarizmi, koji se bavio trigonometri-jom, astronomijom, geogra�jom, kartogra�jom, a smatra se ocem algebre jer je de�niraoosnovna pravila rje�avanja linearnih i kvadratnih jednadµzbi. Njegovi radovi su osnovarazvoja 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 ovogasmatra prvom programerkom, a raµcunao je Bernoullijeve brojeve. Raµcunar za koji jenapisan je bio analitiµcki stroj koji je zamislio, ali nikad u potpunosti proveo u djelo, EnglezCharles Babbage. Analitiµcki stroj je trebao biti prvi programabilni raµcunar, sastavljenu potpunosti od mehaniµckih dijelova. Mehaniµcki dijelovi i �ziµcka glomaznost su glavnirazlozi 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 putemma�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 (modelizraµ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 naredbiza ostvarenje zadatka, koji ce za dato poµcetno stanje zavr�iti u de�nisanom konaµcnomstanju.

Iz datih de�nicija se moµze zakljuµciti da je algoritam skup koraka odnosno postupak kojimse odre�eni problem rje�ava u konaµcnom broju koraka. Istorijski gledano, svi problemi surje�avani nekim vidom algoritma ali je proteklo puno vremena da se napravi odgovarajucaformalizacija.

1.02. Koncept algoritma je potekao kao sredstvo zapisivanja postupaka za rje�avanjematematiµckih problema, poput pronalaµzenja zajedniµckog djelitelja dva broja ili mnoµzenjadva broja. Koncept je formaliziran 1936. u vidu Turingovog stroja Alana Turinga ilambda 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 Euklidovalgoritam za raµcunanje najveceg zajedniµckog djelioca dva cijela broja.

1.03. Algoritmi imaju slijedeca svojstva:1Prije nekoliko godina su britanski inµzinjeri uspjeli sastaviti potpuno funkcionalan ure�aj koji je

zamislio Charles Babbage.

1

Page 6: Algoritmi i programiranje

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

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

� determiniranost : za iste ulazne podatke algoritam uvijek daje iste rezultate

� masovnost : algoritam je primjenjiv na veci 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 seproblem mogao rije�iti. Problem se de�ni�e tekstualno i/ili izrazom. De�nicija problematreba biti egzaktna i nedvosmislena.

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

Radne veliµcine su promjenljive koje se koriste u postupku rje�avanja problema. Madase koncept razlikuje po jezicima, svima im je zajedniµcko da zahtijevaju deklaraciju iinicijalizaciju radnih veliµcina.

Deklaracija de�ni�e tip promjenljive a samim tim i njene moguce vrijednosti.

Incijalizacija je postupak davanja poµcetnih vrijednosti promjenljivim. Ovo je posebnovaµzno u cikliµcnim algoritmima. U nekim sluµcajevima inicijalizacija se vr�i prvom dodjelomvrijednosti.

Postupak rje�avanja de�ni�e svaki pojedini korak koji je potreban za rje�enje problema,ukljuµcujuci 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, svakaprocedura 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 veceg algoritma odnoso uslova zanaredne korake. Funkcija mora imati vrijednost i moµze biti µclan u operacijama.

1.04. Programski jezik C++. U programskom jeziku C++ svaka veliµcina koja sekoristi u programu mora biti deklarisana prije same upotrebe. Deklaracija ukljuµcuje tipi naziv promjenljive. Osnovni tipovi promjenljivih u C++ su :

2

Page 7: Algoritmi i programiranje

� int : cijeli broj

� short int : cijeli broj koji za zapis koristi polovinu prostora od tipa int

� long int : cijeli broj koji za zapis koristi dva puta vi�e prostora od tipa int

� long long int : cijeli broj koji za zapis koristi µcetiri puta vi�e prostora od tipa int

� float : realni broj u formi pokretnog zareza obiµcne taµcnosti odnosno u oblikux = m � 10t gdje je m 2 (0; 1) a t 2 Z. Dosada�nji uobiµcajeni naziv za m je do sadabio mantisa. U cilju izbjegavanja pogre�nih terminolo�kih tumaµcenja prihvacen jetermin signi�kand

� double : realni broj u formi pokretnog zareza dvostruke taµcnosti tj. koristi dvaputa vi�e prostora za signi�kand od tipa �oat

� long double : realni broj u formi pokretnog zareza dvostruke taµcnosti tj. koristitri puta vi�e prostora za signi�kand od tipa �oat

� char : promjenljiva koja se uzima kao tekstualni simbol (engleski : character) a nebroj

Ispred numeriµckih tipova se moµze dodati rijeµc unsigned kojom se oznaµcava da broj nemoµze biti negativan. Prostor koji zauzima pojedini numeriµcki tip zavisi od raµcunara iinstalacije C++ kompajlera. Da bi se dobio taj podatak potrebno je pokrenuti sljedeciprogram :

// Primjer 1.1. Podatak o duµzinama tipova promjenljivih u programskom jeziku C++#include <iostream>using namespace std;int main(){

cout << "Tip char zauzima " << sizeof(char) << " bajtann";cout << "Tip short zauzima " << sizeof(short) << " bajtann";cout << "Tip int zauzima " << sizeof(int) << " bajtann";cout << "Tip long zauzima " << sizeof(long) << " bajtann";cout << "Tip long long zauzima " << sizeof(long long) << "

bajtann";cout << "Tip float zauzima " << sizeof(float) << " bajtann";cout << "Tip double zauzima " << sizeof(double) << " bajtann";cout << "Tip long double zauzima " << sizeof(long double) << "

bajtann";system("PAUSE");

}

U programskom jeziku C++ tip se moµze promijeniti u toku izvr�enja koraka unutarprograma. Moguce je napisati npr. x=sqrt(float(a)). Ovo znaµci da ako je broj a bionpr. cjelobrojan tada se sa float(a) pretvara u broj u pokretnom zarezu a zatim seizvr�ava naredba sqrt().

Inicijalizacija se u programskom jeziku C++ vr�i na nekoliko naµcina od kojih su neki :

3

Page 8: Algoritmi i programiranje

� dodjelom vrijednosti u okviru deklaracije : int i=1;

� dodjelom vrijednosti van deklaracije : i=1;

� stavljanjem vrijednosti neke druge promjenljive u toku realizacije : i=k;

� dodjelom vrijednosti neke funkcije : x=sin(x);

Inicijalizacija je veoma vaµzan korak jer operacija nad promjenljivom koja nije iniciranadaje potpuno neizvjestan rezultat.

Svaka promjenljiva dobija naziv koji moµze biti bilo kakva kombinacija slova, brojeva iodre�enih znakova, jedini je uslov da prvi simbol mora biti slovo.

Programski jezik C++ pravi razliku izme�u velikih i malih slova. Tako su promjenljiveJedanBroj, jedanbroj, Jedanbroj, jedanBroj sa stanovi�a C++ jezika potpuno razliµcitepromjenljive.

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

1.05. Algoritme je moguce klasi�cirati po raznim kriterijima:

Klasi�kacija s obzirom na tok

� Linijski algoritmi se izvr�avaju korak po korak, bez vracanja na neki od prethod-nih koraka niti se neki od koraka ili grupa koraka ponavlja u bilo kom smislu. Ovialgoritmi mogu sadrµzavati i grananja, mjesta na kojima se postupak nastavlja nakonispitivanja odre�enog uslova.

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

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

- Putem uslova za koji se ne zna unaprijed koliko puta ce se izvr�iti. Ovo je sluµcajnpr. kada se µzeli postici odre�ena taµcnost u raµcunanju; najµce�ce nije poznato kolikokoraka treba napraviti da bi se taµcnost postigla pa se traµzi drugi naµcin.

Najveca opasnost cikliµcnih algoritama je formiranje tzv. vjeµcitih petlji jer uslov zavr�etkanije dobro de�nisan.

Klasi�kacija prema implementaciji

� Rekurzivni ili iterativni: Rekurzivni algoritam je algoritam koji poziva samogsebe sve dok se ne postigne odre�en uslov. Rekurzivni algoritmi su vrlo µcestousko vezani uz implementaciju pojedine matematiµcke funkcije na primjer raµcunanjeFibbonaµcijevih brojeva. Iterativni algoritmi su algoritmi koji ne pozivaju samogsebe vec se oslanjaju na konstrukcije poput petlji i dodatne strukture podatakada bi se rije�io problem. Vaµzno je napomenuti da je svaki rekurzivni algoritammoguce pretvoriti u iterativni, i da je svaki iterativni algoritam moguce pretvoritiu rekurzivni, iako ponekad to pretvaranje moµze biti vrlo kompleksno.

4

Page 9: Algoritmi i programiranje

� Serijski ili paralelni: Vecina dana�njih raµcunara sadrµzi samo jedan procesor testoga obavlja naredbe jednu po jednu, to jest serijski. Algoritmi koji su dizajniranisa namjerom da se izvr�avaju u takvom okruµzenju shodno tome se nazivaju serijskialgoritmi. Suprotno njima su paralelni algoritmi koji sa sve vecim brojem vi�eproce-sorskih raµcunara dobivaju sve vecu vaµznost. Paralelni algoritmi koriste mogucnostvi�eprocesorskog sistema na naµcin da problem podijele na vi�e malih potproblemakoje svaki procesor rje�ava zasebno te se zatim rezultati spajaju. Paralelni algoritmiuz resurse potrebne za obradu podataka tako�er imaju i malu potro�nju resursa nakomunkaciju izme�u vi�e procesora. Algoritmi za sortiranje su jedan od primjeraalgoritama koje je moguce znatno pobolj�ati upotrebom paralelnih procesora, dokje neke probleme sasvim nemoguce rije�iti paralelnim algoritmom.

� Deterministiµcki ili stohastiµcki: Deterministiµcki algoritam je algoritam koji cepri svakom izvr�avanju u bilo kojim uslovima od istog unosa doci do istog izlazana naµcin da svaki put slijedi identiµcan niz naredbi. Stohashiµcki algoritam barem ujednom dijelu izvr�avanja donosi neku odluku sluµcajnim odabirom.

� 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�enjenemoguce naci.

Klasi�kacija prema strategiji rje�avanja

� Brute force algoritmi - raµcunar "µcistom silom" isprobava sve mogucnosti i traµziodgovarajuce 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 kojegje jednostavno rije�iti (obiµcno rekurzijom).

� Dinamiµcki algoritmi - Metodama dinamiµckog programiranja rje�avaju se vi�efazniprocesi, tj. procesi u kojima se donosi niz me�usobno zavisnih odluka. Dinamiµckoprogramiranje poznato je i pod nazivom metoda dono�enja vi�efaznih odluka.

� Pohlepni algoritmi (greedy) - Pohlepni algoritam koristi metaheuristiku zarje�avanje problema, takvu da u svakom koraku bira lokalno najbolje rje�enje, unadi da ce tako iznaci globalni optimum. Ovi algoritmi µcesto ne daju najboljerje�enje vec brzu aproksimaciju najboljeg rje�enja.

� Algoritmi za sortiranje i pobrojavanje (search and enumeration) - Algoritmisortiranja sluµze za brzo sortiranje podataka, npr. niza brojeva. Mnogi se problemimogu rje�avati teorijom grafova.

1.06. 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 dijagrampravi tako da ide odozgo prema dolje s lijeva na desno.

5

Page 10: Algoritmi i programiranje

Tekstualno predstavljanjemoµze biti putem pseudokoda ili putem odabranog program-skog jezika. Pseudokod nije vezan ni za jedan speci�µcan programski jezik. U radu cemokoristiti sljedece formulacije pseudokoda :

� Blokovi odnosno logiµcki povezani skupovi naredbi se ograniµcavaju parom zagrada{...}

� a b: Pridruµzivanje koje se µcita "na lokaciju promjenljive a (odredi�te) upisativrijednost promjenljive b". u C++ programskom jeziku to se pi�e kao "a=b" i znaµcida se na lokaciju promjenljive a smje�ta sadrµzaj promjenljive b. Ovo se razliku jeod forme a==b koja znaµci ispitivanje uslova "da li je a jednako b".

� Ako je <uslov> tada <operacija> : Ispituje se <uslov> i ako je zadovoljen real-izuje se <operacija>; u suprotnom se realizuje alternativni blok. U programskomjeziku C++ se prepoznaje kao struktura

if(...){...}

else{...}

� Za <promjenljiva> od <g1> do <g2> korak <g3> : Poµcetak ciklusa u kojem<promjenljiva> mijenja vrijednosti od <g1> do <g2> sa korakom <g3>. Ako jeg1<g2 tada korak mora biti pozitivan, u suprotnom je negativan. U programskomjeziku C++ for ovo je struktura

for(promjenljiva=g1;promjenljiva�g2;g2=g2+g3)Primjer :for(i=1;i�100;i++)znaµci da ce se promjenljiva i imati poµcetnu vrijednost 1 (i = 1), da ce se u svakom korakupovecavati za 1 (i + +, posebna konvencija C++ jezika) sve dok se ne dobije vrijednostmanja ili jednaka 100.

� SveDokJe (<uslov>) : poµcetak ciklusa u kojem, u pravilu, nije poznat broj koraka.Ciklus se izvr�ava sve dok vrijedi <uslov>. U programskom jeziku C++ ovo jestruktura while(...){...}

� IdiNa <labela> : Bezuslovni skok. U programskomm jeziku C++ je to gotonaredba

2 Linijski i algoritmi i algoritmi grananja

2.1 Uvod

2.01. Linijski algoritmi su oni koji se izvr�avaju sukcesivno odnosno oni u kojima se svakikorak izvr�ava samo jednom. Algoritam moµze sadrµzavati grananja ali se ne vr�i povratakna bilo od kojih prethodnih koraka.

2.2 Zadaci

Zad. 2.01. Napraviti algoritam za raµcunanje sljedecih vrijednosti :

6

Page 11: Algoritmi i programiranje

� min fx; yg

� max fx; yg

� min fx; yg ;max fx; yg

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

Min min fx; yg

Analogno treba vrijediti i za maksimalnu vrijednost.

Algoritam za nalaµzenje minimalnog od dva data broja je na sljedecem dijagramu.

Nalaµzenje minimalnog od dva data broja

U nastavku je pseudokod za ovaj algoritam.

Algoritam : Nalazenje minimalnog od dva brojaUlaz : x; yMin xAko je y < Min tada

{Min y

}Izlaz : Min

Analogni algoritam za nalaµzenje veceg od dva data broja je na sljedecem dijagramu.

7

Page 12: Algoritmi i programiranje

Nalaµzenje veceg od dva data broja

U nastavku je pseudokod za ovaj algoritam.

Algoritam : Nalazenje maksimalnog od dva brojaUlaz : x; yMax xAko je y < Max tada

{Max y

}Izlaz : Max

Algoritam za istovremeno nalaµzenje najmanjeg i najveceg od dva data broja je na sljedecemdijagramu.

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

Pseudokod za ovaj algoritam je u nastavku.

8

Page 13: Algoritmi i programiranje

Algoritam : Nalazenje i minimalnog i maksimalnog brojaUlaz : x; yMin xMax yAko je y < Min tada

{Min y

}Ako je x > Max tada

{Max x

}Izlaz : Min;Max

Ono �to je karakteristika ovog algoritma je da se rezultat dobija jedino pore�enjem datihveliµcina.

Zad. 2.02. Data su dva broja a i b. Ako je prvi broj veci od drugog zamijeniti ihme�usobno.

Rje�enje. Uobiµcajeni postupak njihove zamjene je da se koristi pomocna promjenljiva c.Pseudokod je dat u nastavku.

// Me�usobna zamjena dva brojaAkoJe (a > b) Tada{

c aa bb c

}

Istu operaciju je moguce napraviti bez pomocne promjenljive. Pseudokod je u nastavku.

// Me�usobna zamjena dva brojaAkoJe (a > b) Tada{

b a+ ba b� ab b� a

}

9

Page 14: Algoritmi i programiranje

Zad. 2.03. Napraviti algoritam rje�avanja kvadratne jednaµcine.Rje�enje. Neka je op�ta kvadratna jednaµcina data izrazom ax2 + bx + c = 0. Ulazneveliµcine za algoritam su a; b; c. Najprije se ispituje da li je a 6= 0 : provjera da li zadatiparametri uop�te mogu de�nisati kvadratnu jednaµcinu. Ako je a > 0 prelazi se na raµcu-nanje diskriminante. Znak diskriminante odre�uje prirodu i broj rje�enja. Na narednomdijagramu je gra�µcki prikazan algoritam rje�avanja kvadratne jednaµcine.

Postupak rje�avanja kvadratne jednaµcine

Na dijagramu je vidljiv tok odozgo naniµze, uz dva grananja odnosno mjesta na kojimase ispituje uslov i donosi odgovarajuca odluka o nastavku. Ovaj isti algoritam se moµzepredstaviti pseudokodom koji je u algoritmu Kvadratna jednaµcina, V.1..

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

Isti algoritam je mogao biti ispisan na naµcin da se koriste labele, kao �to je prikazano naverziji 2.

Tekst programa napisan u programskom jeziku C++ je dat na priloµzenom algoritmu.

10

Page 15: Algoritmi i programiranje

Algoritam : Kvadratna jednacina, V.1Ulaz : a,b,c// Najprije se ispituje da li je a = 0 ili neAko je a=0 tada Kraj// Izraµcunavanje diskriminanteD b2�4acAko je D > 0 tada

{// Rje�enja su realna i razliµcita

x1 -b

2a-

pD

2a

x2 -b

2a+

pD

2aIdiNa Ispis}

Inaµce{

//Da li je diskriminanta negativnaAko je D<0 tada

{//Rje�enja su kompleksna

Re - b2a

Im -p�D2a

x1 (Re; Im)x2 (Re;� Im)

IdiNa Ispis}

Inaµce{

//Rje�enja su jednaka

x1=x2 -b

2aIdiNa Ispis}

}Ispis : Rje�enja kvadratne jednaµcineKraj

11

Page 16: Algoritmi i programiranje

Algoritam : kvadratna jednacina, V.2.Ulaz : a,b,c// Najprije se ispituje da li je a = 0 ili neAko je a=0 tada Kraj// Izraµcunavanje diskriminanteD b2�4acAko je (D>0) IdiNa Korak1Ako je (D=0) IdiNa Korak2// Ako nije ni jedno ni drugo preostaje da je D<0

{//Rje�enja su kompleksna

Re - b2a

Im -p�D2a

x1 (Re; Im)x2 (Re;� Im)// Nakon raµcunanja idi na Ispis i Kraj

IdiNa Ispis}

Korak1:{

// Rje�enja su realna i razliµcita

x1 -b

2a-

pD

2a

x2 -b

2a+

pD

2aIdiNa Ispis}

Korak2:{

//Rje�enja su jednaka

x1=x2 -b

2aIdiNa Ispis

}Ispis : Rje�enja kvadratne jednaµcineKraj

12

Page 17: Algoritmi i programiranje

// Zadatak : Rje�avanje kvadratne jednaµcine#include <iostream>#include <conio.h>#include <cmath>using namespace std;int main(){

float a, b, c, D, real, imag, x1, x2;cout << "Unesite koeficijent a : " << endl;cin >> a;if(a==0){

cout << "Unijet je pogre�an podataknn" << endl;getch();return(0);

}cout << "Unesite koeficijent b : " << endl;cin >> b;cout << "Unesite koeficijent c : " << endl;cin >> c;D = pow(b,2)-4*a*c;if(D<0){

cout << "Jednaµcina ima kompleksne korijenenn" << endl;real = -b/(2*a);cout << "Realni dio jenn" << real << endl;imag = sqrt(-D)/(2*a);cout << "Imaginarni dio jenn" << imag << endl;

}else{

if(D==0){

cout << "Jednaµcina ima jednake korijenenn" << endl;x1 = -b/(2*a);cout << x1 << endl;

}else{

cout<<"Jednaµcina ima realne i razliµcite korijenenn"<<endl;x1 = (-b - sqrt(D))/(2*a);x2 = (-b + sqrt(D))/(2*a);cout << "Rje�enje broj 1 : " << x1 << endl;cout << "Rje�enje broj 2 : " << x2 << endl;

}}getch();return(0);

}

13

Page 18: Algoritmi i programiranje

2.3 Zadaci za vjeµzbu

Zad. V.2.01. Dati su realni brojevi x; y. Ne koristeci druge operacije osim sabiranja,oduzimanja i mnoµzenja izraµcunati vrijednost izraza3x2y2 � 2xy2 � 7x2y � 4y2 + 15xy + 2x2 � 3x+ 10y + 6Ne koristiti vi�e od osam mnoµzenja, oduzimanja i sabiranja.

Zad. V.2.02. Dat je realan broj a. Koristeci 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

Zad. V.2.03. Data su tri realna broja a; b; c. Napraviti algoritam koji daje odgovor dali je moguce konstruisati trougao sa stranama µcije su duµzine dati brojevi. Ako je mogucekonstruisati trougao dati odgovor na pitanje da li je trougao o�trougli.

Zad. V.2.04. Napraviti algoritam i napisati program kojim se rje�ava bikvadratnajednaµcina

ax4 + bx2 + c = 0

Zad. V.2.05. Napraviti algoritam i program kojim se raµcunaju vrijednosti sljedecihfunkcija

f (x) =

(x2 + 4x+ 5 x 2 [�2; 2]

1

x2 + 4x+ 5x 6= [�2; 2]

f (x) =

8<:0 x � 0x2x 0 < x � 1x2 � sin (�x2) x > 1

Zad. V.2.06. Za dati prirodni broj n � 99 provjeriti da li je n2 jednak kubu sume svojihcifara.

Zad. V.2.07. Za dati prirodni broj n � 1000 provjeriti koliko ima cifara, kolika je sumacifara, koja je cifra posljednja.

Zad. V.2.08. Satna kazaljka obrazuje ugao ' sa duµzi koja prolazi kroz centar i taµckukoja oznaµcava 12 sati. Izraµcunati ugao koji obrazuje minutna kazaljka i vrijeme kojepokazuju te kazaljke (sa cijelim brojem minuta).

14

Page 19: Algoritmi i programiranje

3 Cikliµcni algoritmi

3.1 Uvod

3.1.01. Cikliµcni algoritmi su u kojima postoji skup operacija koji se ponavlja. Primjer jeraµcunanje vrijednosti polinoma jer se mora osigurati da se iskoriste svi koe�cijenti. Zbogpotrebe konaµcnosti algoritma, mora se osigurati uslov zavr�etka. Kod cikliµcnih algoritamataj uslov se osigurava ili putem brojaµca koraka ili nekog od uslova, od kojih je najµce�ciuslov taµcnosti.

3.1.02. Ako se koristi brojaµc koraka mora postojati cjelobrojna veliµcina koja ima startnuvrijednost, graniµcnu vrijednost i korak povecanja ili smanjenja. Ako je brojaµc npr.veliµcina k tada se u pseudokodu koristi jedna od sljedece dvije varijante :

� Za <promjenljiva> od <g1> do <g2> korak <g3> : Poµcetak ciklusa u kojem<promjenljiva> mijenja vrijednosti od <g1> do <g2> sa korakom <g3>. Ako jeg1<g2 tada korak mora biti pozitivan, u suprotnom je negativan. U programskomjeziku C++ for ovo je struktura

for(promjenljiva=g1;promjenljiva�g2;g2=g2+g3)

Primjerfor(i=1;i�100;i++)znaµci da ce se promjenljiva i imati poµcetnu vrijednost 1 (i = 1), da ce se u svakom korakupovecavati za 1 (i + +, posebna konvencija C++ jezika) sve dok se ne dobije vrijednostveca ili jednaka 100. Sliµcno :for(i=100;i�1;i--)znaµci da ce se promjenljiva i imati poµcetnu vrijednost 100 (i = 100), da ce se u svakomkoraku smanjivati za 1 (i � �, posebna konvencija C++ jezika) sve dok se ne dobijevrijednost manja ili jednaka 1. Poseban sluµcaj je struktura

for(;;)koja znaµci da se uslov nalazi unutar petlje odnosno skupa naredbi koje oznaµcava ovanaredba.

3.1.03. Jedna od varijanti ciklusa je da se ciklus odvija dok se ne zadovolji neki uslovzavr�etka. U pseudokodu ovo se oznaµcava strukturom

SveDokJe (<uslov>){...}

poµcetak ciklusa u kojem, u pravilu, nije poznat broj koraka. Ciklus se izvr�ava sve dokvrijedi <uslov>. U programskom jeziku C++ ovo je struktura

while(...){...}Primjer je uslov taµcnosti ali to moµze biti bilo koji drugi uslov. Algoritmi sa uslovomtaµcnosti su oni u kojima je kriterij zaustavljanja µzeljeni stepen raµcunske taµcnosti koja sepostiµze :

� Pore�enjem dvije uzastopne parcijalne sume

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

ili na neki drugi naµcin.

Ako postoji potreba da se petlja napusti prije zadatog uslova koristi se naredba break.

15

Page 20: Algoritmi i programiranje

3.2 Nizovi i matrice

3.2.01. U cikliµcnim algoritmima se µcesto koriste nizovi. Niz je konaµcni skup vrijednostijedne promjenljive u kojem svaki µclan ima svoj �redni broj�odnosno indeks koji oznaµcavadimenziju niza.

Niz se deklari�e imenom i dimenzijom. Tako, deklaracije :int a[25];float indeksi[12];

znaµce da je deklarisan niz cijelih brojeva pod nazivom a koji ima 25 elemenata i niz realnihbrojeva pod nazivom indeksi koji ima 12 elemenata. U ovakvom naµcinu deklarisanjamora se navesti dimenzija niza u zagradi. To znaµci da dizajner mora unaprijed znati ilipretpostaviti najvecu mogucu dimenziju niza.

U C++ jeziku se koristi tzv. relativno referenciranje. U tom sistemu prvi µclan nizaima indeks 0 a svi ostali, drugi µclan indeks 1 itd. Drugim rijeµcima, indeks svakog µclanaodgovara �rastojanju�od prvog (nultog) µclana.

3.2.02. µCest praktiµcni problem je kako unijeti µclanove niza, posebno kada je u pitanjuveci broj. Ovaj problem se rje�ava na nekoliko naµcina:

� Uno�enjem µclan po µclan, putem interaktivnog programa

� De�nisanjem svih µclanova niza unutar programa

� Preuzimanjem iz nekog izvora, najµce�ce iz neke datoteke

U nastavku je primjer (potpuno funkcionalnog) programa kojim se vr�i unos µclanova nizasa proizvoljnim brojem µclanova.Niz se moµze inicirati nabrajanjem tako da npr.

int a[] ={-2,3,1,6,-3};

predstavlja niz od 5 cijelih brojeva. Referenciranje se vr�i navo�enjem indeksa. S obziromna relativno indeksiranje a[3]predstavlja broj 6 tj. a[3]=6; tako�e je a[0]=-2 itd.Umjesto indeksa se moµze navesti raµcunska operacija koja za rezultat daje indeks nekogod µclanova tog niza, npr. a[2*n-1]. Sliµcno

int mjeseci[]={31,28,31,30,31,30,31,31,30,31,30,31}

predstavlja niz koji predstavlja broj dana po mjesecima u godini. Ovakvom deklaraci-jom se odre�uje i dimenzija niza koja nije navedena u de�niciji vec program odre�ujedimenziju nakon uµcitavanja.

Ako se u deklaraciji navede dimenzija niza i nabroji manje elemenata od te dimenzijenedostajuci elementi se inicijaliziraju na nulu. Primjer je niz:

int a[8] ={-2,3,1,6,-3};

U ovom nizu ce posljednja tri µclana biti inicijalizirana na nulu.

Primjer unosa µclanova niza iz datoteke ce biti obja�njen kasnije.

16

Page 21: Algoritmi i programiranje

// Algoritam za unos prizvoljnog broja µclanova niza#include <iostream>#include <cmath>using namespace std;int main(){

// Broj µclanova nizaint n;// Brojaµc na uµcitavanjuint k;// Deklaracija niza; uzeto je da je niz cjelobrojniint niz[100];n=100;cout << "Unesite broj µclanova (najvi�e 100) : nn" << endl;cin >> n;if(n>100){

cout << "Upisani broj je prevelik...nn" << endl;return(0);

}for(k=1;k<=n;k++){

// Unos, µclan po µclancout << "µClan broj " << k << " je : " << endl;cin >> niz[k];

}cout << "Ispisuje se upisani niz " << endl;for(k=1;k<=n;k++){

cout << niz[k] << "nt";}cout << "nn";system("PAUSE");

}

17

Page 22: Algoritmi i programiranje

3.2.03. Matrice su dvodimenzionalni nizovi tako da vrijede ista pravila u pogledu refer-enciranja. Ako se matrica inicijalizira nabrajanjem tada se inicijalizacijska lista sastojiod listi kojima se deklari�e svaki red posebno. Primjer je deklaracija

int a[3][4] = {{3, 4, 2, 5}, {4, 1, 2, 3}, {3, 1, 0, 2}};

U ovom sluµcaju su jasno naznaµcene grupe brojeva koje predstavljaju pojedine redove.Ako se neki red ne deklari�e stavljaju se zagrade bez sadrµzaja. Primjer je deklaracija

int a[3][4] = {{3, 4, 2, 5}, {}, {3, 1, 0, 2}};

Prilikom inicijaliziranih dvodimenzionalnih nizova, prva dimenzija se moµze izostaviti, priµcemu se tada ona automatski odre�uje na osnovu broja podlisti za inicijalizaciju redovaunutar inicijalizacione liste. Tako ce, u sljedecem primjeru, prva dimenzija niza bitiautomatski postavljena na 3:

int a[][4] = {{3, 4, 2, 5}, {4, 1, 2, 3}, {3, 1, 0, 2}};

Me�utim, druga dimenzija se ne smije izostaviti, tj. ne smije se pisati:int a[][] = {{3, 4, 2, 5}, {4, 1, 2, 3}, {3, 1, 0, 2}};

Zadatak. Program za unos nizova prilagoditi za unos dvodimenzionalne matrice formatam� n.

3.3 Zadaci

Zad. 3.01. Izraµcunati vrijednost izraza

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

ne koristeci 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 uobliku:

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

Raµcunanje poµcinje iz prve unutra�nje zagrade. Mnoµzenja koja se koriste se mogu sim-boliµcki prikazati na sljedeci naµcin:a 2 � x� 3b a � x+ 4c b � x� 5S c � x+ 6Ovakav naµcin kori�tenja promjenljivih je neracionalan ako se ima u vidu da se svaka odnjih koristi samo jednom. Ako se suma koja se traµzi obiljeµzi promjenljivom S tada se onamoµze iskoristiti tako da se na svakom koraku u nju upi�e nova vrijednost. Simboliµcki, tose pi�e na sljedeci naµcin:S 2 � x� 3S S � x+ 4S S � x� 5S S � x+ 6Ovdje je vidljivo da se prvi red raµcuna na jedan a ostala tri reda na drugi naµcin. Ovo semoµze promijeniti na naµcin da se u svim koracima koristi isti obrazac sumiranja i mnoµzenja:S 0

18

Page 23: Algoritmi i programiranje

S S � x+ 2S S � x� 3S S � x+ 4S S � x� 5S S � x+ 6Ovaj naµcin je bitan i po tome �to se prvom naredbom vr�i inicijalizacija promjenljive a usvakom narednom izrazu koe�cijenti polinoma se pojavljuju kao sabirci. Ako se uzme daje polinom napisan u sljedecem obliku

S = anxn + an�1x

n�1 + :::+ a1x+ a0

tada se opisani postupak uop�teno moµze zapisati na sljedeci naµcin:S 0;S S � x+ ak; k = n; 1;�1Ovdje k = n; 1;�1 ima znaµcenje : k se mijenja od n do 1 sa korakom �1. To znaµcida se uzimaju koe�cijenti polinoma opadajucim redom indeksa poµcev od koe�cijenta zanajveci stepen. Najvaµznije u datoj relaciji je da se koriste samo dvije operacije; prvaod njih je dodjela vrijednosti a druga sadrµzi jedno mnoµzenje i jedno sabiranje. Na ovajnaµcin se moµze opisati raµcunanje vrijednosti polinoma proizvoljnog stepena. Na narednomdijagramu je dat opisani algoritam.

Raµcunanje polinoma

U nastavku je pseudokod za ovaj algoritam.

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

Pitanje 2 : Kako bi izgledao algoritam ako bi polinom bio predstavljen u obliku

S = a0xn + a1x

n�1 + :::+ an�1x+ an

U nastavku je C++ program kojim se raµcuna vrijednost datog polinoma.

Zad. 3.02. Napraviti algoritam za raµcunanje sume :

19

Page 24: Algoritmi i programiranje

Racunanje polinoma//Raµcunanje vrijednosti polinomaUlaz : fakg ; k = 0; nUlaz : x//InicijalizacijaS 0Za k = n do 0 korak �1{

S S � x+ ak}Izlaz : S

// Raµcunanje vrijednosti polinoma// Zadatak u skripti#include <iostream>using namespace std;int main(){

// Deklaracija i inicijalizacija nizaint koef[]={2,-3,4,-5,6}, k;float x, S;cout << "Unesite broj x :";cin >> x;// Inicijalizacija promjenljive SS=koef[4];for(k=3;k>=0;k--){

S=S*x+koef[k];}cout << "Vrijednost polinoma je : " << S << endl;system("PAUSE");

}

S =

nXi=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 najprirodnijinaµcin inicijalizacije je S = 0. Jedna od varijanti algoritma je u nastavku.

20

Page 25: Algoritmi i programiranje

Algoritam sumiranja

Na dijagramu je vidljivo da se operacija

S S +k2

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 poveca za 1. Na taj naµcin k ima funkciju brojaµca.Pseudokod za ovaj algoritam je u nastavku.

Sumiranje - varijanta 1//Raµcunanje konaµcne sumeUlaz : n//Inicijalizacija sumeS 0Za k = 1 do n{

S S +k2

k + 1}Izlaz : S

Ovakav algoritam se naziva cikliµcni zbog µcinjenice da se jedan korak ponavlja odre�enbroj puta. 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 +k2

k + 1?

Isti algoritam je mogao biti napravljen na naµcin da se u svakom ciklusu ispituje uslov, uovom sluµcaju da li je k dostigao traµzenu vrijednost.U ovom algoritmu je najinteresantniji korak u kojem se ispituje da li je k � n. Ovoje potencijalno najveci (i najµce�ci) izvor gre�ke. Ovaj uslov nece nikada vrijediti ako jen � 0, jer tekuca promjenljiva k ide od 1 i u svakom koraku postaje veca, ali je realno da,pod odre�enim uslovima, parametar n bude inicijalno zadat kao n = 0. Da bi se otklonioovaj rizik potrebno je odmah provjeriti da li je n � 0 ili ne.

21

Page 26: Algoritmi i programiranje

Sumiranje - varijanta 2Ulaz : n//Inicijalizacija sumeS 01 k

a:S S +k2

k + 1k k + 1Ako je k � n Idi na korak a:Izlaz : S

Raµcunanje sume

µCitaocu se prepu�ta da napi�e pseudokod. Tekst programa napisan u programskom jezikuC++ je dat na sljedecem algoritmu.

NAPOMENA : U tekstu priloµzenog C++ programa bitan je korak m=float(k). Ovimpostupkom se cijeli broj pretvara u broj u pokretnom zarezu. Bez ovoga se k2= (k + 1)raµcuna kao cjelobrojni koliµcnik �to je (veliki) gubitak taµcnosti. Naprimjer, rezultat cjelo-brojnog dijeljenja 25=6 daje rezultat 4 dok dijeljenje u realnoj taµcnosti daje drugaµcijirezultat. Ako se program pokrene bez ove konverzije za n = 15 dobije se rezultat S = 105(za�to ?) dok se sa konvezijom dobija rezultat S = 107:381. U pseudokodu ova µcinjenicanije igrala bitnu ulogu ali u realnom programiranju ovo je veoma vaµzan aspekt rada uC++ programskom jeziku o kojem se treba voditi raµcuna jer je µcest izvor gre�aka.

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

P (x) = anxn + an�1x

n�1 + :::+ a1x+ a0

Prvi izvod ovog polinoma je

P 0 (x) = nanxn�1 + (n� 1) an�1xn�2 + :::+ 2a2x+ a1

22

Page 27: Algoritmi i programiranje

#include <iostream>using namespace std;int main(){

int n, k;float m, S;cout << "Unesite broj za sumu :";cin >> n;// Inicijalizacija promjenljive SS=0;if(n<=0){

cout << "Broj n je pogre�an" << endl;system("PAUSE");

}for(k=1;k<=n;k++){

// Konvertovanje cijelog broja u broj u pokretnom zarezum = float(k);S = S+(k*k)/(k+1);

}cout << "Traµzena suma je : " << S << endl;system("PAUSE");

}

Najlak�i naµcin raµcunanja vrijednosti ovog polinoma za datu vrijednost x je sljedeci:

P 0 (x) = (::: (nan � x+ (n� 1) an�1)x+ :::+ 2a2)x+ a1Sliµcno kao u prethodnom primjeru, kalkulacija se provodi kori�tenjem dvije osnovne op-eracijeS 0S S � x+ k � ak; k = n; 0;�1

Opisani algoritam je dat na sljedecem dijagramu.

Raµcunanje prvog izvoda polinoma

23

Page 28: Algoritmi i programiranje

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 prvikorak u dizajniranju ovog algoritma ?

Pitanje 2 : Da li je i na koji naµcin povecan broj operacija koje se obavljaju prilikomraµcunanja prvog izvoda ?

Zad. 3.04. Napraviti algoritam i napisati pseudokod za nalaµzenje sume

S =1

sin 1+

1

sin 1 + sin 2+

1

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

1

sin 1 + sin 2 + :::+ sinn

Rje�enje. U ovom sluµcaju se radi o dvije sume. Jedna suma se formira u imeniocimasvakog od sabiraka a druga suma se formira putem sabiranja datih razlomaka. Ovo znaµcii odgovarajuce inicijalizacije za dvije sume; neka su to R za imenioce i S za sabirkekonaµcne sume. Suma u imeniocu se formira izrazom R R + sin i, pri µcemu i uzimavrijednost od 1 do n, koje se unaprijed zadaje. Ovo implicira da n ne bi trebalo bitimanje od 1 tako da se na samom poµcetku treba ispitivati vrijednost za n. Algoritam jedat na sljedecem dijagramu.

Algoritam sumiranja

Kritiµcan korak na dijagramu je S S + 1=R; s obzirom da R moµze imati i veomamale vrijednosti tada koliµcnik 1=R moµze imati vrijednosti koje prelaze �ziµcke mogucnostizapisa, �to se mora izbjeci. Iz tog razloga se uvodi korak u kojem se ispituje da li je

24

Page 29: Algoritmi i programiranje

R < "; ako jeste ne raµcuna se vrijednost na sljedecem koraku. Ovo je samo jedan odmogucih izbora, koji moµze zavisiti od konkretnog problema u okviru kojeg se algoritampravi. Zbog toga se kao ulazna veliµcina treba uzeti broj " > 0 kojim se odre�uje kriterijtaµcnost. Na sljedecem dijagramu je, iz tehniµckih razloga, ova veliµcina oznaµcena sa e.

Raµcunanje sume

Pseudokod za ovaj algoritam je dat u nastavku.

Tekst programa napisan u programskom jeziku C++ je dat na priloµzenom algoritmu.

U ovom algoritmu je vr�ena konverzija k=� jer argumenti trigonometrijskih funkcija uC++ jeziku moraju biti izraµzeni u radijanima. Potpuno drugaµcija bi se vrijednost dobilaako bi na tom mjestu umjesto float(k)/PI stajalo float(k/PI). U drugom sluµcaju bise konverzija u tip float vr�ila nakon izraµcunavanja koliµcnika k=�. U ovoj verziji nijekori�tena veliµcina ".

Zad. 3.05. Neka je dat niz brojeva fxkg ; k = 1; n. Napraviti algoritam koji raµcuna :

� najmanji od datih brojeva

� najveci od datih brojeva

� i najmanji i najveci od datih brojeva

25

Page 30: Algoritmi i programiranje

Racunanje suma razlomaka u kojima su imenioci sume sinusa cijelih brojeva, V.2Ulaz : N, "//Provjeriti vrijednost za nAkoJe (n < 1) Tada Kraj//InicijalizacijaR 0S 0Za k = 1 Do n Korak 1 Raditi{

R R + sin iAko je (jRj � ") Tada

{S S + 1=R

}}Prikazati SKraj

Rje�enje. Zadatak ce biti rije�en za sluµcaj nalaµzenja minimalnog od datih brojeva. Kao i uprethodnom zadatku, rezultat, npr. veliµcinaMin, bi trebao biti broj koji se moµze koristitikao 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 poredisa preostalim µclanovima. Opisani algoritam je na sljedecem dijagramu.

Nalaµzenje minimalnog broja u datom nisu

Pseudo kod za ovaj algoritam je dat u nastavku.µCitaocu se prepu�ta da napravi odgovarajuci algoritam za nalaµzenje najveceg broja datogniza.

Za nalaµzenje istovremeno i najveceg i najmanjeg µclana datog niza brojeva potrebno jeraditi kao i u prethodnom zadatku sa manjom izmjenom u segmentu ispitivanja.

26

Page 31: Algoritmi i programiranje

// Zad. 3.04. Raµcunanje sume#include <iostream>#include <cmath>using namespace std;int main(){

// De�nisanje konstante PIconst double PI(3.141592654);int n, k;float R, S;cout << "Unesite broj za sumu :";cin >> n;R=0;S=0;if(n<=0){

cout << "Broj n je pogre�an" << endl;system("PAUSE");

}for(k=1;k<=n;k++){

// Najprije se izraµcuna nova vrijednost sume u imeniocu...R=R+sin(float(k)/PI);// ...a zatim se raµcuna suma SS=S+1/R;

}cout << "Traµzena suma je : " << S << endl;system("PAUSE");

}

Algoritam : Nalazenje minimalnog broja u nizuUlaz : x; yMin x1Za k = 1 do n{

Ako je xk < Min tada{

Min xk}

}Izlaz : Min

27

Page 32: Algoritmi i programiranje

Istovremeno nalaµzenje minimalnog i maksimalnog elementa iz niza brojeva

Pseudokod za ovaj algoritam je priloµzen.

Algoritam : Istovremeno nalazenje minimalnog i maksimalnog broja u nizuUlaz : x; yMin x1Max x1Za k = 1 do n{

Ako je xk < Min tada{

Min xk}Inaµce{

Ako je xk > Max tada{

Max xk}

}}Izlaz : Min;Max

Listing C++ programa za rje�avanje ovog problema je u nastavku.

Zad. 3.06. Napraviti algoritam za raµcunanje sume

S =

1Xi=1

1

i3

28

Page 33: Algoritmi i programiranje

// Nalaµzenje minimalnog i maksimalnog elementa datog niza.#include <iostream>using namespace std;int main(){

int x[]={2,-3,7,1,14,4,8,-1,9,12}int Mak, Min;int k;Mak=x[0];Min=x[0];for(k=1;k<10;k++){

if(Mak<x[k]){

Mak=x[k];}if(Min>x[k]){

Min=x[k];}

}// Sada treba dati odgovarajuce porukecout << "Najveci broj je : " << Mak << endl;cout << "Najmanji broj je : " << Min << endl;system("PAUSE");

}

29

Page 34: Algoritmi i programiranje

Rje�enje. U ovom zadatku je osnovni problem kriterij zaustavljanja zbog principa kon-aµcnosti - algoritam koji traje beskonaµcno je besmislen. Kad su u pitanju algoritmi sumi-ranja redova, osnovni kriterij zaustavljanja je razlika izme�u dvije uzastopne parcijalnesume. Ako je ta razlika manja od nekog unaprijed zadatog broja " postupak sumiranjase zaustavlja jer dodavanje novih µclanova ne povecava bitno taµcnost raµcunanja :

jSk+1 � Skj < "

Ovo znaµci da je u dizajnu algoritma na svakom koraku potrebno imati dvije uzastopneparcijalne sume koje se porede. Ulazni parametar za ovaj algoritam, dat na narednomdijagramu, 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 1Ulaz : "k 1S1 k

a: S2 S1 +1

k3Ako je jS2 � S1j < " tada

{Zavr�iti

}Inaµce

{S1 S2k k + 1Idi na a:

}Izlaz : Suma

Alternativni izgled ovog algoritma je u nastavku.

30

Page 35: Algoritmi i programiranje

Algoritam : Sumiranje redova - varijanta 1aUlaz : "k 1S1 k

a: S2 S1 +1

k3Ako je jS2 � S1j < " tada Izlaz:// Ako ne vrijedi gornji uslov nastavljaju se naredbe nakon uslova "Ako ..."S1 S2k k + 1Idi na a:Izlaz : Suma

Ovakav dizajn je pogodan u sluµcajevima kada programski jezik omogucava realizacijunaredbe 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 ".

Zad. 3.07. Dat je realni broj x. Izraµcunati cijeli dio broja (najveci cijeli broj koji nijeveci od x), broj zaokruµzen do najbliµzeg cijelog broja, cjelobrojni dio broja bez decimalnogdijela. U matematici se ovaj broj obiljeµzava sa bxc (�oor). Pri tome se treba koristitistandardnim operacijama (mnoµzenje, sabiranje, ...) odnosno smatra se da nisu raspoloµziveinterne funkcije kao �to je jxj i sliµcno.Rje�enje. Da bi se na�ao cjelobrojni dio najprije se mora naci broj cijelih mjesta. Nakontoga se traµzi cjelobrojni dio unatrag po pozicijama.

Prvi dio zadatka se rje�ava tako da se broj dijeli sa 10 (odnosno osnovom brojnog sis-tema) dok se ne do�e do broja koji je manji od 1. Ovo je ekvivalentno pomjeranju

31

Page 36: Algoritmi i programiranje

Algoritam : Sumiranje reda - varijanta 2Ulaz : "k 1S1 0S2 kSveDokJe(jS2 � S1j > "){

k k + 1S1 S2

S2 S1 +1

k3}Izlaz : S2

decimalnog zareza ulijevo za po jednu poziciju prilikom svakog dijeljenja. Algoritam jedat na sljedecem dijagramu. Funkciju brojaµca cifara ima promjenljiva k.

Raµcunanje broja cifara realnog broja x

Pseudo kod je dat u nastavku

Algoritam : Nalazenje broja cifara realnog brojaUlaz : "k 0a xSveDokJe(a > 1){

k k + 1a a=10

}Izlaz : k

Jedno od vaµznijih pitanja na ovom mjestu je : koliko puta se obavlja dijeljenje sa 10 dabi se dobio broj cifara ? Ako se podsjetimo da je karakteristika logaritma realnog brojajednaka broju cifara cjelobrojnog dijela umanjen za 1 onda je odgovor jasan : da bi sedobio broj cifara realnog broja potrebno je blog xc+ 1 dijeljenja.

32

Page 37: Algoritmi i programiranje

Drugi dio problema, nalaµzenje cjelobrojnog dijela, je ne�to kompleksniji jer su mnoµzenjei upore�ivanje jedini mehanizam. Da bi se problem rije�io potrebno je pripremiti radnupromjenljivu, nazovimo je cj, i k puta uraditi sljedece :- 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 vrijedina�li smo cijeli broj koji nije veci od a; ovakvih oduzimanja na svakom koraku moµze bitinajvi�e 10

Opisani algoritam je na narednom dijagramu

Nalaµzenje cjelobrojnog dijela realnog broja x

Pseudo kod ovog algoritma je u nastavkuNAPOMENA. Realni broj x se u raµcunaru zapisuje u formatu pokretnog zareza odnosnou formatu koji odgovara zapisu x = xM � 10xE gdje su :

� xM : Signi�kand, broj xM 2 [0; 1)

� xE: Eksponent, cijeli (pozitivni ili negativni) broj

U skladu sa standardima, koji su izdati od strane IEEE, u ovoj de�niciji je termin "man-tisa" zamijenjen terminom "signi�kand" kako bi se izbjegle terminolo�ke nejasnoce kojese mogu pojaviti zbog znaµcenja kojeg termin "mantisa" ima za logaritme. U jednombroju tekstova se uzima da signi�kand ima vrijednosti u intervalu [1; 10) ali je znaµcenjeidentiµcno.

Zad. 3.08. Napraviti program za raµcunanje proizvoda matrica

33

Page 38: Algoritmi i programiranje

Algoritam : Nalazenje cjelobrojnog dijela decimalnog brojaUlaz : "k 0a xSveDokJe(a > 1){

k k + 1a a=10

}cj 0Za i = 1 do k{

a a � 10cj (cj + 1) � 101 mSveDokJe(m � 10){

cj cj � 1Ako je cj � a tada IdiNa b:

}b:

}Izlaz : k

Am�n �Bn�p = Cm�p

Rje�enje. Dijagram za ovaj problem je dat u nastavku.

34

Page 39: Algoritmi i programiranje

Ilustracija uz zadatak 3.0. Proizvod matrica

U ovom sluµcaju je i brojaµc za redove prve matrice, j je brojaµc za kolone druge matrice ak je brojaµc za elemente u skalarnom proizvodu (kolone prve matrice). Treba uoµciti korakinicijalizacije c (i; j) = 0 zbira proizvoda. Pseudo kod je lako napraviti na osnovu ovogdijagrama. U nastavku je C++ program.

3.4 Zadaci za vjeµzbu

Zad. V.3.01. Dat je prirodan broj n. Izraµcunati:

� S =�1 +

1

12

��1 +

1

22

�:::

�1 +

1

n2

� S =

r2 +

q2 + :::+

p2| {z }

n korijena

� S = 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 + :::+ cosn

sin 1 + sin 2 + :::+ sinn

� S =

vuut3 +

s6 +

r9 + :::+

q3 (n� 1) +

p3n

35

Page 40: Algoritmi i programiranje

// Proizvod matrica#include <iostream>#include <cmath>using namespace std;int main(){

// De�nisanje matricaint a[3][4]={{2,7,3,8},{-2,-1,5,4},{0,-3,7,-2}};int b[4][2]={{1,3},{-2,-5},{8,-3},{9,4}};int c[3][2]={{},{},{}};// Brojaµci na uµcitavanjuint i, j, k;// Deklaracija niza; uzeto je da je niz cjelobrojnicout << "Najprije cemo izlistati matrice A i Bnn" << endl;cout << "Matrica A je : nn" << endl;for(i=0;i<3;i++){

for(j=0;j<4;j++)// Ispis jednog reda; µclanovi se odvajaju znakom tab{

cout << a[i][j] << "nt";}// Novi red nakon ispisanog redacout << "nn";

}// Prelazak na novi redcout << "nn" << endl;// Saµcekaj dok se ne pritisne tastersystem("PAUSE");cout << "Matrica B je : nn" << endl;for(i=0;i<4;i++){

for(j=0;j<2;j++)// Ispis jednog reda; µclanovi se odvajaju znakom tab{

cout << b[i][j] << "nt";}// Novi red nakon ispisanog redacout << "nn" << endl;

}// Prelazak na novi redcout << "nn" << endl;// Saµcekaj dok se ne pritisne tastersystem("PAUSE");

// Nastavak na sljedecoj strani ....

36

Page 41: Algoritmi i programiranje

// Nastavak sa prethodne strane// Sada poµcinje zabava// Za svaki red matrice A...for(i=1;i<3;i++){

// ...uzimamo jedan red matrice B...for(j=1;i<2;i++){

// ...iniciramo sumu...c[i][j]=0;

for(k=0;k<4;k++){

// Raµcunamo element c(i,j)c[i][j]=c[i][j]+a[i][k]*b[k][j];

}}

}cout << "Matrica C je : nn" << endl;for(i=0;i<3;i++){

for(j=0;j<2;j++)// Ispis jednog reda; µclanovi se odvajaju znakom tab{

cout << c[i][j] << "nt";}// Novi red nakon ispisanog redacout << "nn" << endl;

}// Prelazak na novi redcout << "nn" << endl;// Saµcekamo da vidimo je li sve u redusystem("PAUSE");

}

37

Page 42: Algoritmi i programiranje

Zad. V.3.02. Dat je realni broj x. Izraµcunati

R =(x� 2) (x� 4) � ::: � (x� 64)(x� 1) (x� 3) � ::: � (x� 63)

Zad. V.3.03. Dat je realan broj a i prirodni broj n. Izraµcunati:

� E = an

� P = a (a+ 1) (a+ 2) � ::: � (a+ n� 1)

� S = 1

a+

1

a (a+ 1)+ :::+

1

a (a+ 1) ::: (a+ n)

� S = 1

a+1

a2+1

a4+ :::+

1

a2n

� P = a (a� n) (a� 2n) � ::: � (a� n2)

Zad. V.3.04. Za dati prirodni broj n izraµcunati

� S =nXk=1

1

k

� S =nXk=1

1

k5

� S =nXk=1

1

(1 + 2k)2

� S =nXk=1

(�1)k

(2k + 1) k

� S =nXk=1

(�1)k+1

(k + 1) k

� S =nXk=1

(�1)k (k + 1)k!

� S =nXk=1

k!1

2+1

3+ :::+

1

k + 1

Zad. V.3.05. Dati su pozitivni realni brojevi x; a; ".U nizu y1; y2; ::: koji je formiran popravilu

y0 = a; yk =1

2

�yi�1 +

x

yi�1

�naci prvi n za koji vrijedi nejednakost

��y2i � y2i�1�� < ".Zad. V.3.06. Neka je

x0 = 1; xk =2� x3k�1

5

Naci prvi µclan xn za koji vrijedi jxn � xn�1j < 10�5.

Zad. V.3.07. Neka je

y0 = 0; yk =yk�1 + 1

yk�1 + 2

38

Page 43: Algoritmi i programiranje

Za dati realni broj " > 0 naci prvi µclan yn za kojeg vrijedi yn � yn�1 < ".

Zad. V.3.08. Dat je realni broj a > 0. Formiran je niz

x0 =

8>><>>:min f2a; 0:95g a � 1

a

51 < a < 25

a

25inaµce

xn =4

5xn�1 +

a

5x4n�1; n = 1; 2; :::

Naci prvi µclan xn za koji vrijedi5

4a jxn+1 � xnj < 10�6. Za prona�enu vrijednost µclana

xn naci razliku a� x5n.Zad. V.3.09. Za dati realni broj x i prirodni broj n izraµcunati

� xn2=2n

� xn3=3n

Zad. V.3.10. Za date realne brojeve a; b (b > a) i prirodni broj n izraµcunati (f1 + f2 + :::+ fn)�h gdje je

h =b� an

fi =

a+

�i� 1

2

�h

1 +

�a+

�i� 1

2

�h

�2 ; i = 1; 2; :::; n

Zad. V.3.11. Izraµcunati beskonaµcne sume sa datim nivoom taµcnosti " > 0. Smatratida je potrebna taµcnost dostignuta ako se suma na nekom koraku razlikuje za manje od "od prethodne sume.

�1Xi=1

1

i2

�1Xi=1

1

i (i+ 1)

�1Xi=1

(�1)i

i!

�1Xi=1

(�2)i

i!

�1Xi=1

(�1)i+1

i (i+ 1) (i+ 2)

�1Xi=1

1

4i + 5i+2

Zad. V.3.12. Dati su prirodan broj n i realan broj a > 0. Niz x0; x1; x2; ::: je formiranpo pravilu

x0 = a; xk =k � 1kxi�1 +

a

xk�1i�1

Naci prvu vrijednost xn za koju je��xkn � a�� < 10�4 (Niz fxigi2N konvergira ka k

pa).

Zad. V.3.13. Dat je realan broj a. Naci:

39

Page 44: Algoritmi i programiranje

� Prvi od brojeva

1; 1 +1

2; 1 +

1

2+1

3; :::

koji je veci od a.

� Najmanje n za koje vrijedi da je

1 +1

2+1

3+ :::+

1

n> a

Zad. V.3.14. Dati su prirodan broj n i realni broj x. Izraµcunati sume :

� S = sinx+ sin2 x+ sin3 x+ :::+ sinn x

� S = sinx+ sin (x2) + sin (x3) + :::+ sin (xn)

� S = sinx+ sin sinx+ :::+ sin sin ::: sin x(u posljednjem µclanu funkcija sin se primjenjuje n puta).

Zad. V.3.15. Izraµcunati sljedece proizvode.

� P =nYk=1

�1 +

sin (kx)

k!

� P =nYk=1

(1� x)k+1 + 1((k � 1)! + 1)2

Zad. V.3.16. Sumu

1� 12+1

3� :::+ 1

9999� 1

10000na sljedeca µcetiri naµcina:

� slijeva udesno µclan po µclan

� slijeva udesno tako da se najprije izraµcuna suma neparnih µclanova

1 +1

3+1

5+ :::+

1

9999zatim suma parnih µclanova

1

2+1

4+1

6+ :::+

1

9998+

1

10000a zatim napravi razlika te dvije sume.

� zdesna na lijevo µclan po µclan

� zdesna na lijevo sume pod taµckom b a zatim te dvije sume oduzmu.

Da li se i za�to dobijaju razliµciti rezultati ?

Zad. V.3.17. Napraviti algoritam koji ce tabelirati vrijednost polinoma

Pn (x) = a0 + a1x+ :::+ an�1xn�1 + anxn

za vrijednosti argumenta x koji se mijenjaju intervalu (xa; xb) sa korakom �x.

Zad. V.3.18. Napraviti algoritam koji za zadate brojeve n i k raµcuna veliµcinu�n

k

�=

n!

k! � (n� k)!

40

Page 45: Algoritmi i programiranje

4 Analiza kompleksnosti algoritama na primjerima

4.1 Uvod

U ovom dijelu ce biti naveden jedan broj primjera analize sloµzenosti algoritama na naµcinda se na�e �to je moguce taµcniji broj koraka. Na taj se dobija podatak o vremenskojsloµzenosti programa odnosno pokazatelju o mogucem vremenu trajanja odre�enog algo-ritma.

4.2 Zadaci

Primjer. Sekvencijalno sumiranjeU nastavku je pseudo kod za jednostavan sluµcaj sekvencijalnog sumiranja.

# Sumiranje Opis1 Sumiraj(a,n) Ulaz : niz [a] duµzine n2 Suma 0 Inicijalizacija3 Za i = 1 do n { Poµcetak petlje4 Suma Suma+ a [i] Sumiranje5 }

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 okvirnibroj koraka dat sa F (n) = 2n+ 1.

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

# Sumiranje Opis1 Sumiraj(a,n) Ulaz : niz [a] duµzine n2 Za i = 1 do n { Poµcetak spoljne petlje3 Suma 0 Inicijalizacija sume4 Za j = i+ 1 do n { Poµcetak unutra�nje petlje5 Suma Suma+ a [i] Sumiranje6 }7 Ispisati : Suma Ispisivanje me�u sume8 }

Spolja�nja petlja, koja poµcinje na liniji 2, se izvr�ava n puta. U svakom koraku se izvr�avainicijalizacija 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 jei = 2 ona se ponavlja n � 2 puta itd. U svakom od tih koraka se izvr�ava linija 5 kojasadrµzi dvije operacije. Linija 7 se izvr�ava jednom u svakom od n koraka. Ovo znaµci daje broj operacija u ovom algoritmu

F (n) = 1 + 4n+nXi=1

2 (i� 1) =

41

Page 46: Algoritmi i programiranje

= 1 + 4n+ 2 �nXi=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 poveca dva putabroj koraka se poveca barem 4 puta.

Primjer. SumiranjeU sljedecem primjeru je prezentirano sumiranje posljednjih pet µclanova odabranog niza.

# Sumiranje Opis1 Sumiraj(a, n) Ulaz : niz [a] duµzine n2 Za i = 5 do n { Poµcetak spoljne petlje3 Suma a [i� 4] Iniciranje sume µclanom a [i� 4]4 Za j = i� 3 do i { Poµcetak unutra�nje petlje5 Suma Suma+ a [j] Sumiranje6 }7 Ispisati Suma Ispisivanje Suma8 }

Spolja�nja petlja, koja poµcinje na liniji 2, se izvr�ava n � 4 puta. U svakom koraku seizvr�ava inicijalizacija vrijednosti Suma i to sa µclanom koji je pet pozicija udaljen odpozicije µ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 liniji7, 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µzivanjeOvo je jedan od veoma µcestih metoda pretraµzivanja. Polazna osnova je niz duµzine nkoji je sortiran rastucim redoslijedom i u kojem se treba pronaci vrijednost oznaµcena saKljuc. Naµcin na koji se obavlja ovaj posao je sljedeci:

� 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; usuprotnom 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 sljedecim pseudo kodom.

42

Page 47: Algoritmi i programiranje

# Binarno pretraµzianje niza Opis1 BinPret(a; n;Kljuc) Ulaz : niz [a], n i Kljuc2 Lo 1 Inicijalna vrijednost za donju granicu3 Hi n Inicijalna vrijednost za gornju granicu4 SveDokJe(Lo � Hi){5 Mid 1

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

6 Ako Je (Kljuc < a (Mid)) tada { Ako je traµzeni element manji od a (Mid) . . .7 Hi Mid� 1 Mid postaje gornja granica donje polovine niza8 }9 Inaµce Ako Je (Kljuc > a (Mid)) tada { Ako je traµzeni element veci od a (Mid). . .10 Lo Mid+ 1 Mid postaje donja granica gornje polovine niza11 }12 Inaµce { Ako je traµzeni element jednak a (Mid). . .13 Poruka : Kljuc = a (Mid)!Izlaz Prona�en je Kljuc14 }15 }16 }17 Poruka : Element nije prona�en Kljuc nije prona�en

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

U prvom prolazu se analizira niz duµzine n, u narednom koraku niz duµzine n=2, zatim nizduµzine n=2k i tako redom do duµzine 1. Ovdje k oznaµcava koliko puta je vr�eno dijeljenjesa 2. To znaµci da za posljednji korak mora vrijediti

n

2k= 1) n = 2m

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

log 2= log2 n := lg 2

Na ovaj naµcin je dobijena procjena maksimalnog broja koraka za postupak binarnogpretraµzivanja. Ako bi se broj elemenata povecao dva puta broj pretraµzivanja bi biomnogo manji odnosno ne bi bio dvostruko veci �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 listadugaµcka. U jednom koraku se odabire jedan broj i posao se zavr�ava. Ako se ulaz povecan puta vrijeme izvr�enja se ne povecava odnosno "mijenja" se za faktor 1. U tom sluµcajuse kaµze da algoritam ima brzinu O (1).2

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

2Znaµcenje ce biti dato u poglavlju o asimptotskoj procjeni kompleksnosti

43

Page 48: Algoritmi i programiranje

Primjer iz realnog µzivota je izbor prvog dokumenta sa vrha gomile. Nije vaµzno kolika jegomila. Algoritmi sa konstantnim vremenom su najbolji moguci algoritmi ukoliko vrijemesame operacije nije predugaµcko. Primjeri ovih algoritama su:- 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µzivanjenesortirane 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 prihvaceni kaoe�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)

naredba(s);Dodavanje konstante c brojaµcu petlje znaµci da vrijeme trajanja petlje raste linearno uodnosu 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 kojimse radi.

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

naredba(s);Maksimum petlje je n2 tako da je vrijeme izvr�enja kvadratiµcno. U ovom sluµcaju petljase 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){

naredba(s);}

44

Page 49: Algoritmi i programiranje

}Primjeri algoritama brzine O (nc), c > 1 su:- Parsiranje putem stablasto udruµzenih gramatika (tree-adjoining grammar parsing),- Maksimalno poklapanje (matching) dva bipartitna grafa

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 ulazudvostruµ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 sevr�i poga�anje na naµcin da saigraµc kaµze da li je predloµzeni broj veci ili manji. Ako je brojizme�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 odgovarajuceg intervala µcime se(grubo) suµzava krug brojeva za poga�anje. Ako se u toj igri poµcetni opseg udvostruµcibroj poga�anja se ne udvostruµcava. Ako se ulaz poveca n puta potrebno je log2 n � lg nkoraka dok se ne do�e do inicijalnog opsega.

Primjer programskog koda je :for (int i = 1; i < n; i *= c) // O(log n)

naredba(s);Mnoµzenje brojaµca petlje konstantom c znaµci da maksimalna vrijednost za n mora rastieksponencijalno kako bi se vrijeme izvr�enja petlje povecavalo linearno pa je iz tog razlogavrijeme izvr�enja logaritamsko. U ovom sluµcaju je ck = n, gdje je k broj prolaza. Naosnovu ovoga je k = logc n. Analogno vrijedi ako se brojaµc smanjuje za konstantni faktorc.

Brzinu O (n log n) = O (log n!) (linearitamsko, loglinear, quasilinear) imaju operacijeprovo�enja Furijeove transformacije, algoritmi sortiranja, kao �to su quick sort, mergesort heap sort.

4.3.5 Algoritmi brzinepn

Ovi algoritmi se izvr�avaju proporcionalno kvadratnom korijenu od n (veliµcina ulaza). Uovom sluµcaju se izvr�ava petlja u kojoj i poµcinje naprimjer od 1 i pravi se korak koji semultiplikativno povecava za konstantu dok se ne postigne uslov i � i < n. Ova petlja senece izvr�iti svih n puta vec 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. Odgovorse moµze dobiti tako da se provjerava da li je djeljiv sa svim brojevima koji su manji odnjega. Ako je n = 100 tada se moµze stati ako je djelilac veci od 10 koji je

p100.

45

Page 50: Algoritmi i programiranje

4.3.6 Algoritmi sa eksponencijalnim vremenom

Primjeri ovih algoritama su:- Problem trgovaµckog putnika- Rekurzivna implementacija generisanja Fibonaµcijevih brojeva- Hanojski tornjevi- Generisanje svih permutacija od n elemenata- Raµcunanje determinante putem raµcunanja minora

Ba� kao �to postoje algoritmi na koje povecanje obima ulaza nema uticaja postoje al-goritmi za koje se µcini da vrijeme izvr�enja eksplodira. Kaµze se da se eksponencijalnialgoritmi 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 uteoriji algoritama. Zadatak je jednostavan. Dato je n gradova; trgovaµcki putnik moraobici svaki grad taµcno jednom prije nego ode kuci. Cilj je to uµciniti na najbolji mogucinaµcin bilo da je u pitanju najjeftiniji ili najkraci put. Pod najop�tijim pretpostavkama,jedini poznati naµcin pouzdanog rje�avanja problema je da se ispita svaki moguci put i dase odabere najbolja. Ne postoji poznati naµcin da se elimini�e razumni dio putanja bezprovjere svake od njih. Broj putanja je n!.

Algoritme sa eskponencijalnim vremenom izvr�enja je potrebno izbjegavati �to je vi�emoguce. Umjesto direktnog rje�avanja traµze se "heuristike" koje su kraci naµcini da sedobiju dobri rezultati ali to nije garancija da su oni i najbolji moguci. Heuristika zaproblem trgovaµckog putnika moµze biti : idi na najbliµzi neposjeceni grad; zatim poveµzi parnajbliµ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 sljedeci odnos brzina algoritamaO (1) < O (log log n) < O (log n) < O (n) < O (n log n) < O (n2) < O (n2 log n) <O (n3) < ::: < O (an) < O (n!) < O (nn)

4.3.7 Kombinacije algoritama

Nizovi naredbi. Za sekvence naredbi, ukljuµcujuci moguce cijele blokova naredbi, uzimase najgore moguce vrijeme izvr�enja od svih naredbi. Naprimjer, blok vremena log n izakojeg slijedi linearni blok ima ukupno vrijeme koje je linearno; efekat log n petlje naprostoi�µcezava. Ne treba previ�e brinuti. Stara engleska izreka kaµze : brini o dolarima a centice se brinuti sami za sebe.

Konstrukcije Ako ... inaµce ... Za ove konstrukcije se uvijek uzima najgori mogucisluµcaj ako ne postoji sigurnost �ta ce se desiti. Najgori sluµcaj u bilo kojoj konstrukcijiovog tipa je da se izvr�ava bilo Ako bilo inaµce dio, koji god da je od njih najgori. Izpraktiµcnih razloga se uzima kako da se de�avaju obje strane.

U izboru najgoreg moguceg 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 vecim stepenomod n gori2. Ako su stepeni od n jednaki ili ako nema stepena od n blok sa vi�e log n je lo�iji

46

Page 51: Algoritmi i programiranje

Naprimjer, ako se poredi npn lg n sa lg3 n 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 dadominira petlja sa vecim vremenom izvr�enja. Primjer je :for (int i = 0; i < n; i += c) { // O(n)

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

for (int j = 0; j < n; i *= c) {naredba;}

}

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 listekako bi se vidjelo da li je neka stavka sadrµzana u obje liste. Uzima se element prve liste iporedi sa svakim elementom druge liste �to uzima vrijeme reda n. S obzirom da se posaoponavlja za n elemenata druge liste obavlja se n�n = n2 operacija pore�enja. Dupliranjeobima ulaza ima za posljedicu µcetiri puta duµze vrijeme izvr�enja.

47

Page 52: Algoritmi i programiranje

5 Asimptotska procjena sloµzenosti algoritma

5.1 UvodµCesto je te�ko, pa i nemoguce, izvesti egzaktnu formulu za broj operacija nekog algoritma.Zato se prouµcava asimptotsko pona�anje broja operacija kad veliµcina ulaznih podatakaneograniµceno raste. Najpoznatije asimpotske notacije sloµzenosti algoritma su: �-notacija,O-notacija i -notacija.

5.1.1 �-notacija

De�nicija. Neka je g (n) funkcija de�nisana na nekom podskupu skupa prirodnih brojevai µciji je skup vrijednosti neki podskup skupa realnih brojeva. Sa �(g (n)) se oznaµcavaskup funkcija f (n) takvih da postoje pozitivne konstante c1, c2 i prirodan broj n0 takvida 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 � 2

3n2 � n � c2n

2 za svako n0 � n ako i samo ako c1 � 23� 1

n� c2 za svako

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

biti 23� 1

n� 0. To znaµci da je dovoljno uzeti n0 = 3. Iz c1 � 2

3� 1

3slijedi c1 � 1

3. Dakle,

vrijedi da je 13n2 � f (n) � 2

3n2 za svako n � 3.

Primjer 2. Neka je f (n) = an2 + bn + c gdje su a; b; c konstante i a > 0. Da li jef (n) = � (n2) ? Potrebno je odrediti konstante c1 i c2 i prirodan broj n0 takve da jec1n

2 � an2+ bn+ c � c2n2 za svako n > n0. Neka je c1 < a i c2 > a. Tada su nejednaµcine(a� c1)n2 + bn+ c � 0 i (c2 � a)n2 + bn+ c � 0 zadovoljene za sve prirodne brojeve n0takve da je n0 > max fx1; x2; y1; y2g gdje su x1 i x2 nule polinoma (a� c1)n2+bn+c a y1i 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 vodeci koe�cijentpozitivan onda je f (n) = � (nm).

5.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 realnih funkcija f (n) de�nisanih na nekompodskupu skupa realnih brojeva takvih da postoji pozitivna konstanta c i prirodan brojn0 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) 2O (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, oznakaf (n) = O (g (n)) se tumaµci da "f ne raste brµze od g".

48

Page 53: Algoritmi i programiranje

Notacija Veliko-O (O) ima dvije glavne oblasti primjene. U matematici se obiµcno koristida opi�e koliko blisko konaµcni niz aproksimira datu funkciju, posebno u sluµcaju skracenog(truncated) Tejlorovog niza ili asimptotske ekspanzije. U kompjuterskoj nauci je korisnaza analizu algoritama. U obje vrste primjene funkcija koja se pojavljuje unutar O (�)tipiµcno se bira da bude �to je moguce jednostavnija, pri µcemu se izostavljaju konstantnifaktori 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 argumentefunkcije.

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 konstantu a > 02. Ako je fi (n) = O (gi (n)), i = 1; 2; :::; k tada jef1 (n) + f2 (n) + :::+ fk (n) = O ((g1 + g2 + :::+ gk) (n))3. Ako je fi (n) = O (g (n)), i = 1; 2; :::; k tada jef1 (n) + f2 (n) + :::+ fk (n) = O (g (n))4. Ako je fi (n) = O (gi (n)), i = 1; 2; :::; k tada jef1 (n) � f2 (n) � ::: � fk (n) = O (g1 (n) � g2 (n) � ::: � gk (n))Ako je f (n) monotono rastuca 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) = loga n dobija se (loga n)

c = O�aloga n

�=

O (n) �to znaµci da proizvoljan stepen logaritamske funkcije raste spporije od linearnefunkcije.

Primjer. Kako je

limn!1

lnn

n�= 0

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

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

limn!1

f (n)

log2 n= 1

tada vrijedi da je f (n) = O (log2 n). S obzirom da je log2 n =lnnln 2

to je f (n) = O (lnn).

5.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 podskupuskupa realnih brojeva takvih da postoji konstanta c > 0 i prirodan broj n0 takvi da vrijedi0 � 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)).

49

Page 54: Algoritmi i programiranje

Veliµcina (�) se tumaµci tako da je g (n) donja granica za f (n). U tom smislu, oznakaf (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 akoje f (n) = O (g (n)) i f (n) = (g (n)).

5.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. Jedanod mogucih naµcina mnoµzenja dva cijela n-bitna broja je tzv. digitalni metod. Neka su

a = (a2n�1a2n�2:::a1a0)2b = (b2n�1b2n�2:::b1b0)2

Moµze se staviti

A1 = (a2n�1a2n�2:::an+1an)2 ; A0 = (an�1an�2:::a1a0)2B1 = (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)A1B1 + 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 � A0i B0 � B1 dva n-bitna broja, tri proizvoda A1B1, (A1 � A0) (B0 �B1), A0B0 a zatimizvr�iti pomjeranje ulijevo i sabiranje.

Ako se saM (n) oznaµci broj bit operacija potrebnih za mnoµzenje dva n-bitna cijela brojaonda 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�nlog2 3

�bit operacija.

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

�2log2 n

��M

�2[log2 n]+1

�� D

�3[log2 n]+1 � 2[log2 n]+1

�< D � 3[log2 n]+1

� 3 �D ��3[log2 n]

�� 3D � 3[log2 n] = (3D)nlog2 3

50

Page 55: Algoritmi i programiranje

Odavdje imamo da je M (n) = O�nlog2 3

�.

Primjer 2. Naci O (n!).Rje�enje. Kako je n! = 1 � 2 � ::: � n = (::: ((2 � 3) � 4) � 5:::) � n, za raµcunanje broja n! jepotrebno 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 sai + 1 pa je stoga broj mnoµzenja jednak n � 2. Za odre�ivanje broja bit operacija trebase podsjetiti µcinjenice da je broj cifara proizvoda dva binarna broja jednak sumi cifarafaktora ili je za 1 manji od te sume. Neka broj n ima k bita. Svaki broj manji od n imanajvi�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 jednakonk. 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 + blog2 nc)2 = n (n� 2) (lg n)2 = O

�(n lg n)2

�bit operacija.

51

Page 56: Algoritmi i programiranje

6 Analiza kompleksnosti - nastavak

6.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 bezrealizacije samog algoritma tako da procjena vrijedi za svaki raµcunar.

Taµcno pona�anje algoritma je nemoguce predvidjeti osim u najjednostavnijim sluµcaje-vima. Na pona�anje utiµce mnogo faktora pa se u obzir uzimaju samo glavne karakteristikea 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 omogucavajuupore�ivanje razliµcitih algoritama za rje�avanje istog problema.

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

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

Ocjena vremenske sloµzenosti algoritma se sastoji u brojanju raµcunskih koraka koje trebaizvr�iti. Termin "raµcunska operacija" moµze obuhvatiti vi�e tipova operacija kao �to jesabiranje i mnoµzenje. Vrijeme izvr�avanja zavisi od konkretnog raµcunara, odabranogprogramskog jezika i sliµcno. Stoga se u algoritmu izdvaja korak koji se ponavlja i koji nataj 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 ikoliko se stvarno koristi ma�inskih instrukcija

� Konstrukcija "Za Svaki <>..." se broji n + 1 puta ako se tijelo petlje izvr�i nputa

� Konstrukcija "Ako Je <> Tada" se broji kao 1 svaki put kad se "postavi pitanje"a ono �to uslovljava naredba "Ako ..." broji se onoliko puta koliko to zahtijevakonkretni sluµcaj

� Konstrukcija "Sve Dok(<uslov>)" se broji n+ 1 puta ako se tijelo petlje izvr�i nputa

Na nekoliko narednih primjera ce biti pokazan naµcin kalkulisanja sloµzenosti.

6.2 Zadaci

Primjer. Sekvencijalno pretraµzivanje.U ovom primjeru je prezentirana metoda sekvencijalnog pretraµzivanja niza u kojem setraµzi vrijednost Kljuc.

52

Page 57: Algoritmi i programiranje

# Sekvencijalno traµzenje Broj Opis1 TraziSek(a; n;Kljuc) Ulaz : niz [a] duµzine n i Kljuc2 Nasao ? 1 Inicijalizacija radne promjenljive3 Za Sve i = 1 do n { n+ 1 Poµcetak unutra�nje petlje4 Ako je a [i] = Kljuc Tada { n Postavljanje upita5 Nasao > q Postavljanje na drugu vrijednost6 }7 }

Ovdje je q oznaka da li se realizovao uslov "Ako ...". Na osnovu ovoga se moµze zakljuµcitida 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µcinse zakljuµcuje da algoritam ima linearnu brzinu odnosno F (n) = O (n). Drugim rijeµcima,linearno povecanje broja elemenata koji se ispituju znaµci linearno povecanje vremena zanjegovo izvr�enje.

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

# Sortiranje Broj Opis1 BubbleSort(a [n]) Sortiranje niza a [n]2 Za i = 1 do n� 1 { n Poµcetak vanjske petlje3 Za j = n� 1 do i korak �1 { Poµcetak unutra�nje petlje4 Ako je (a [j] > a [j + 1]) Tada { Upit5 b a [j] Zamjena vrijednosti6 a [j] a [j + 1]7 a [j + 1] b8 }9 }10 }

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

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 opadajucim redom. Zakljuµcakje da je F (n) = O (n2) odnosno da se algoritam izvodi u kvadratnom vremenu.

Primjer. Sumiranje sa povecanjem inkrementaSljedeci primjer ilustruje kompleksnost u sluµcaju kada se u svakom koraku gornja granicabrojaµca povecava dva puta.

53

Page 58: Algoritmi i programiranje

# Korak Broj Opis1 Sumiraj(n) Ulaz : broj iteracija (n)2 k 1 1 Inicijalizacija3 Suma 0 1 Inicijalizacija sume4 Za i = 1 do n { n+ 1 Poµcetak spoljne petlje5 Za j = 1 do k { � Poµcetak unutra�nje petlje6 Suma Suma+ i � j 2n � 1 Sumiranje7 }8 k k + k n Dupliranje varijable k9 }

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

F (n) = 1 + 1 + (n+ 1) + (1 + 2 + :::+ 2n�1 + n� 1) + (2n � 1) + nF (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 � n0.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 vece 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 � n0.Ako je n3 + 20n+ 1 � c � n3 tada 1 + 20

n2+1

n3� c. Lijeva strana posljednje nejednakosti

raste neograniµceno tako da ne postoji konstanta c. Stoga, O uslov ne moµze vrijediti uovom 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 � n0.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 vece 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 � n0.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

vece vrijednosti n0 potreban je veci broj c (npr. za n0 = 10 je c � 12:01) ali u svakomsluµcaju vrijedi traµzena nejednakost.

54

Page 59: Algoritmi i programiranje

6.3 Zadaci za samostalni rad

Zadatak. Napraviti algoritam i ispitati sloµzenost u sljedecim sluµcajevima

�100Xi=1

50Xj=1

1

i+ j2

�100Xi=1

60Xj=1

sin (i3 + j4)

�100Xi=1

100Xj=1

j � i+ 1i+ j

�100Xi=1

iXj=1

1

2j + i

�nXk=1

k (k + 1) � :: � k2

�nXk=1

kk

�nXk=1

1

(k2)!

�nXk=1

(�1)k (2k2 + 1)!

Zadatak. Data je cjelobrojna matrica [aij];j=1;;n. Izraµcunati b1; b2; :::; bn gdje je

� bi =nXj=1

a2ij

� bi =nXj=1

(�1)i+j aij

� bi =nYj=1

aij

� bi =nXj=1

jajij

� bi =nYj=1

aij, gdje je 1 < aji � n

� bi = max aij1�j�n

; bi = min aji1�j�n

55

Page 60: Algoritmi i programiranje

7 Rekurzije

7.1 Uvod

Rekurzija je situacija kada je za raµcunanje u jednom koraku potreban rezultat prethodnogkoraka. Postoje brojni primjeri rekurzija u matematici. Primjeri su :

� De�nicija faktorijela : 0! = 1; n! = (n� 1)! � n

� Fibonaµcijevi brojevi: Fn = Fn�1 + Fn�2, pri µcemu je F1 = a i F2 = b.

U teoriji algoritama pojam rekurzije se odnosi na rutine (funkcije, procedure) koje pozi-vaju same sebe. One su tipiµcne za pristupe "podijeli pa vladaj" gdje funkcija ulaz dijelina manje dijelove i poziva se na svakom od tih dijelova. Primjer je binarno pretraµzivanje: u svakom koraku se traµzi polovina prostora koji je dobijen u prethodnom koraku (npr.sredina niza).

Ako za µclanove niza Fn, n = 1; 2; ::: vaµzi jednakost

Fn = f (Fn�1; Fn�2; :::; F1; n)

kaµze se da niz Fn zadovoljava diferentnu jednadµzbu ili rekurentni izraz. Specijalno, akose za neko k � 1 µclan Fn izraµzava preko k prethodnih µclanova niza

Fn = f (Fn�1; Fn�2; :::; Fn�k; n)

onda je k red te diferentne jednaµcine. Matematiµckom indukcijom se pokazuje da je ovajniz jednoznaµcno odre�en sa prvih k µclanova niza F1; F2; :::; Fk.

Jedna od najpoznatijih diferentnih jednaµcina je ona koja de�ni�e Fibonaµcijev niz

Fn = Fn�1 + Fn�2; F1 = F2 = 1

Za raµcunanje vrijednosti Fn potrebno je izvr�iti n� 2 koraka sabiranja �to je nepraktiµcnoza velike n.

Naµcin procjene brzine rekurzivnih algoritma ce biti prezentiran na jednom primjeru. Nekaje data rekurzivna relacija

T (n) = 2 � T (n=2) + n; T (1) = 1

Izraz kojim se izraµcunava svaki µclan niza koji se generi�e zove se rje�enje. U ovom sluµcajuje cilj procijeniti gornju granicu za koju je T (n) � f (n). Vrijedi:T (n) = 2 � T (n=2) + n =

= 2 � [2 � T (n=4) + n=2] + n == 4 � T (n=4) + 2n == 4 � [2 � T (n=8) + n=4] + 2n == 8 � T (n=8) + 3n= :::= 2k � T

�n=2k

�+ k � n

Zna se da je T (1) = 1 i to je naµcin da se posao nastavi. µZelja je da se na desnoj stranipojavi T (1) �to znaµci da je

56

Page 61: Algoritmi i programiranje

n=2k = 1) n = 2k ) k = log2 n

Na osnovu ovoga se nastavlja prethodna jednaµcina pa je:T (n) = 2log2 n � T (1) + n � log2 n =

= n+ n � log2 n = O (n lg n)

Op�te rje�enje kojim se daju uslovi procjene vremena rekurentnih algoritama daje Masterteorem, koji je formulisan i dokazan od strane Cormen, Leierson, Rivest i Stein u knjiziIntroduction to Algorithms. Generaliziranu formu Master teorema dali su Akra i Bazzi1998. godine i on se odnosi na mnogo �iru klasu rekuzivnih algoritama.

Teorema. Asimptotsko pona�anje niza T (n) rje�enja rekurentnog izraza

T (n) = a � T�nb

�+ f (n) (1)

u kojem je a � 1 i b > 1 konstante i f (n) asimptotski pozitivna funkcija, dato jejednako�cu

T (n) =

8<:��nlogb a

�f (n) = O

�nlogb a�"

�; " > 0

��nlogb a logk+1 n

�f (n) = �

�nlogb a logk n

�; k � 0

� (f (n)) f (n) = �nlogb a+"

�; " > 0

U posljednjem sluµcaju f (n) mora zadovoljavati uslov regularnosti a � f (n=b) � c � f (n)za neku konstantu c < 1 i dovoljno veliko n.

Jedna od varijanti formulacije ovog problema je cilj analiza algoritma A pri µcemu je brojoperacija T (n) za ulaz veliµcine n (vremenska sloµzenost) dat rekurentnim izrazom

T (n) = a � T�nb

�+ c � nk

pri µcemu je a; b; c; k > 0, b 6= 0 odnosno f (n) = c � nk i zadata je vrijednost T (1).Ovakva jednaµcina se dobija za algoritam kod kojeg se obrada ulaza veliµcine n svodi naobradu a ulaza veliµcine n=b poslije µcega je potrebno izvr�iti jo�c � nk koraka da bi se odparcijalnih rje�enja konstruisalo rje�enje kompletnog ulaza veliµcine n. Drugim rijeµcima,broj a je broj podproblema na koje se dijeli poµcetni problem. Za ove algoritme se kaµzeda su tipa "podijeli pa vladaj" (divide-and-conquer) �to je drugi naziv za algoritme kojisu zasnovani na dekompoziciji. Uobiµcajeno je da bude b 2 N.

Dokaz. Dokaz ce biti proveden samo za podniz n = bm gdje je m cijeli nenegativni broj.Mnoµzenjem izraza (1) sa a�m=c dobija se rekurentni izraz

tm = tm�1 + qm; t0 =

1

cT (1)

gdje je tm =1

ca�m � T (bm) i q = bk=a. Rje�enje je

tm = t0 +mXi=1

qi

57

Page 62: Algoritmi i programiranje

Za q 6= 1 jemXi=1

qi =1� qm+11� q � 1

pa se asimptotsko pona�anje niza tm opisuje sljedecim jednakostima

tm =

8<:O (m) q = 1O (1) 0 < q < 1O (qm) q > 1

S obzirom da je T (bm) = c � amtm, n = bm odnosno m = logb n redom se za 0 < q < 1(bk < a), q = 1 (bk = a odnosno k = logb a) i q > 1 (b

k > a) dobija

T (n) =

8<:O (am) = O

�bm logb a

�= O

�nlogb a

�a > bk

O (mam) = O�logb n � nlogb a

�= O

�nk log n

�a = bk

O ((aq)m) = O�bmk�= O

�nk�

a < bk

Pogodno je upamtiti neke od narednih relacija.

Rekurzija Algoritam O (�)T (n) = T (n=2) +O (1) Binarno pretraµzivanje O (log n)T (n) = T (n� 1) +O (1) Sekvencijalno pretraµzivanje O (n)T (n) = 2 � T (n=2) +O (1) Put po stablu O (n)T (n) = T (n� 1) +O (n) Selection sort O (n2)T (n) = 2 � T (n=2) +O (n) Merge sort O (n log n)

Table 1: Uporedni pregled brzina algoritama

7.2 Zadaci

Zadatak. Neka je T (n) = 8 � T�n2

�+ 1000n2.

Rje�enje. Ovdje je a = 8, b = 2, f (n) = 1000n2, logb a = log2 8 = 3. Sada se provjeravada li vrijedi

f (n) = O�nlogb a�"

�) 1000n2 = O (n3�")

Ako se izabere " = 1 tada se dobije 1000n2 = O (n2). S obzirom da ovo vrijedi koristi seprvi sluµcaj Master teoreme pa se zakljuµcuje da je

T (n) = ��nlogb a

�= �(n3)

Taµcno rje�enje ovog rekurentnog izraza je T (n) = 1001n3� 1000n2 sa uslovom T (1) = 1.

Zadatak. Neka je T (n) = 2 � T�n2

�+ 10n.

Rje�enje. Ovdje je a = 2, b = 2, k = 0, f (n) = 10n, logb a = log2 2 = 1. Sada seprovjerava da li vrijedi

f (n) = O�nlogb a

�) f (n) = O (n)

58

Page 63: Algoritmi i programiranje

Sada se koristi drugi sluµcaj Master teoreme pa se zakljuµcuje da je

T (n) = ��nlogb a logk+1 n

�= �(n log n)

Taµcno rje�enje ovog rekurentnog izraza je T (n) = n+10n � log2 n uz uslov da je T (1) = 1.

Zadatak. Neka je T (n) = 2 � T�n2

�+ n2.

Rje�enje. Ovdje je a = 2, b = 2, f (n) = n2, logb a = log2 2 = 1. Sada se provjerava da livrijedi

f (n) = �nlogb a+"

�= (n1+")

Ako se izabere " = 1 tada se dobije n2 = (n2). Koristi se treci sluµcaj Master teoreme,s tim da se najprije provjerava uslov regularnosti :

a � f�nb

�� c � f (n)) 2

�n2

�2� c � n2

Ako se izabere c = 1=2 tada je uslov zadovoljen 8n 2 N pa je T (n) = � (f (n)) odnosnoT (n) = � (n2). Taµcno rje�enje je T (n) = 2n2 � n uz uslov da je T (1) = 1.

Zadatak. Neka je T (n) = 6 � T�n3

�+ n2 log n.

Rje�enje. U ovom sluµcaju je

logb a = log3 6 = 1 + log3 2 < 2

Na osnovu ovoga je

f (n) = n2 log n = �n1+log3 2+"

�S obzirom da se radi o sluµcaju (3) Master teoreme provjerava se uslov regularnosti:

a � f�nb

�� c � f (n)

6 ��n3

�2log

n

3� c � n log n

2

3(log n� log 3) � c � log n)

) c � 23� log n� log 3

log n=2

3��1� log 3

log n

�Ovaj uslov vrijedi za dovoljno veliko n pa se moµze pisati da je

T (n) = � (f (n)) = � (n2 log n)

Zadatak. Za sljedece izraze, kori�tenjem Master teoreme, utvrditi da li su rje�ivi :

� T (n) = 3 � T�n2

�+ n2

� T (n) = 4 � T�n2

�+ n2

59

Page 64: Algoritmi i programiranje

� T (n) = T�n2

�+ 2n

� T (n) = 2n � T�n2

�+ nn

� T (n) = 16 � T�n4

�+ n

� T (n) = 2 � T�n2

�+ n log n

� T (n) = 2 � T�n2

�+

n

log n

� T (n) = 2 � T�n4

�+ n0:51

� T (n) = 1

2� T�n2

�+1

n

� T (n) = 16 � T�n4

�+ n!

� T (n) =p2 � T

�n4

�+ log n

� T (n) = 3 � T�n2

�+ n

� T (n) = 3 � T�n3

�+pn

� T (n) = 4 � T�n2

�+ cn

� T (n) = 3 � T�n4

�+ n log n

� T (n) = 3 � T�n3

�+n

2

� T (n) = 4 � T�n2

�+

n

log n

� T (n) = 64 � T�n8

�� n2 log n

� T (n) = 7 � T�n3

�+ n2

� T (n) = 4 � T�n2

�+ log n

� T (n) = T�n2

�+ n (2� cosn)

Rje�enje.

� T (n) = 3 � T�n2

�+ n2 ) T (n) = � (n2) (sluµcaj 3)

� T (n) = 4 � T�n2

�+ n2 ) T (n) = � (n2 log n) (sluµcaj 2)

60

Page 65: Algoritmi i programiranje

� T (n) = T�n2

�+ 2n ) T (n) = � (n2) (sluµcaj 3)

� T (n) = 2n � T�n2

�+ nn ) ne primjenjuje se (a nije konstanta)

� T (n) = 16 � T�n4

�+ n) T (n) = � (n2) (sluµcaj 1)

� T (n) = 2 � T�n2

�+ n log n) T (n) = �

�n log2 n

�(sluµcaj 2)

� T (n) = 2 �T�n2

�+

n

log n)ne primjenjuje se (nepolinomijalna razlika izme�u f (n)

i nlogb a)

� T (n) = 2 � T�n4

�+ n0:51 ) T (n) = � (n0:51) (sluµcaj 3)

� T (n) = 1

2� T�n2

�+1

n)ne primjenjuje se (a < 1)

� T (n) = 16 � T�n4

�+ n!) T (n) = � (n!) (sluµcaj 3)

� T (n) =p2 � T

�n4

�+ log n) T (n) = � (

pn) (sluµcaj 1)

� T (n) = 3 � T�n2

�+ n) T (n) = �

�nlg 3

�(sluµcaj 1)

� T (n) = 3 � T�n3

�+pn) T (n) = � (n) (sluµcaj 1)

� T (n) = 4 � T�n2

�+ c � n) T (n) = � (n2) (sluµcaj 1)

� T (n) = 3 � T�n4

�+ n log n) T (n) = � (n log n) (sluµcaj 3)

� T (n) = 3 � T�n3

�+n

2) T (n) = � (n log n) (sluµcaj 2)

� T (n) = 4 � T�n2

�+

n

log n) T (n) = � (n2) (sluµcaj 1)

� T (n) = 64 � T�n8

�� n2 log n)ne primjenjuje se jer f (n) nije pozitivna

� T (n) = 7 � T�n3

�+ n2 ) T (n) = � (n2) (sluµcaj 3)

� T (n) = 4 � T�n2

�+ log n) T (n) = � (n2) (sluµcaj 1)

� T (n) = T�n2

�+n (2� cosn))Ne primjenjuje se. Pripada sluµcaju 3 ali je naru�en

uslov regularnosti (pretpostavimo da je n = 2�k gdje je k neparan i proizvoljnoveliki. Za svaki takav izbor od n pokazuje se da je c � 3=2 pa je naru�en uslovregularnosti)

U primjeru 7 razlika izme�u f (n) i nlogb a se moµze prikazati kao koliµcnik

61

Page 66: Algoritmi i programiranje

f (n)

nlogb a=

n

log n

nlog2 2=

n

n � log n =1

log n

Jasno je da je1

log n< n" za bilo koje " > 0. Stoga razlika nije polinomijalna i ne moµze

se primijeniti Master teorema.

7.3 Zadaci za samostalni rad

Zadatak. Neka je

a0 = 1; ak = kak�1 + 1=k; k = 1; 2; ; ;

Za dati prirodni broj n naci an.

Zadatak. Neka je

v1 = v2 = 0; v3 = 1:5

vi =i+ 1

i2 + 1vi�1 � vi�2vi�3

Za dati prirodni broj n naci vn.

Zadatak. Neka je

x0 = c; x1 = dxk = q � xk�1 + r � xk�2 + b; k = 1; 2; :::

Za date realne brojeve q; r; c; d; b i prirodni broj n izraµcunati xn.

Zadatak. Neka je

u1 = u2 = 0; v1 = v2 = 1

ui =ui�1 � ui�2vi�1 � vi�21 + u2i�1 + v

2i�1

vi =ui�1 � v�i1

jui�2 + vi�1j+ 2; i = 3; 4; :::

Za dati prirodni broj n naci vn.

Zadatak. Neka je

a0 = a1 = 1

ai = ai�2 +ai�12i�1

; i = 2; 3; :::

Naci proizvod a0 � a1 � ::: � a14.

Zadatak. Neka je

a1 = b1 = 1

ak =1

2

�pbk�1 +

1

2

pak�1

�bk = 2a

2k�1 + bk�1; k = 2; 3; :::

62

Page 67: Algoritmi i programiranje

Za dati prirodni broj n naci sumunXk=1

akbk.

Zadatak. Neka je

x1 = y1 = 1;xi = 0:3 � xi�1

yi = xi�1 + yi�1; i = 2; 3; :::

Za dati prirodni broj n naci sumunXi=1

xi1 + jyij

.

Zadatak. Neka je

a1 = b1 = 1ak = 3bk�1 + 2ak�1

bk = 2ak�1 + bk�1; k = 2; 3; :::

Za dati prirodan broj n naci sumunXk=1

2k

(1 + a2k + b2k) � k!

Zadatak. Neka je

a1 = u; b1 = vak = 2bk�1 + ak�1

bk = 2a2k�1 + bk�1; k = 2; 3; :::

Za date realne brojeve u; v i prirodni broj n naci sumunXk=1

akbk(k + 1)!

Zadatak. Neka je

x1 = x2 = x3 = 1xi = xi�1 + xi�3; i = 4; 5; :::

Naci sumu100Xi=1

xi2j.

Zadatak. Dat je cijeli broj m > 1. Naci najveci cijeli broj k za koji je 4k < m.

Zadatak. Dat je prirodni broj n. Naci najmanji broj oblika 2r koji prelazi n.

Zadatak. Dat je prirodan broj n. Izraµcunati

1 � 2 + 2 � 3 � 4 + :::+ n � (n+ 1) � ::: � 2n

Zadatak. Izraµcunati

63

Page 68: Algoritmi i programiranje

1

1 +1

3 +1

5 +1

::::::

101 +1

103

Zadatak. Za dati realni broj x 6= 0 izraµcunatix

x2 +2

x2 +4

x2 +8

:::

::: x2 +256

x2

Zadatak. Za dati prirodni broj n i realni broj t izraµcunati(2t)n

n!!

��2

�[n=2].

Zadatak. Niz Fibonaµcijevih brojeva u0; u1; u2; ::: se formira po pravilu u0 = 0; u1 =1; ui = ui�1 + ui�2.

� Za dati prirodan broj n izraµcunati prvih n Fibonaµcijevih brojeva

� Niz f0; f2; ::: se formira po pravilu f0 = 0; f1 = 1; fi = fi�1 + fi�2 + ui�2. Za datiprirodan broj n generisati niz f0; f1; f2; :::; fn.

Zadatak. Za zadati prirodni broj n izraµcunati n!.

Zadatak. Formirati niz Fibonaµcijevih brojeva

� koristeci se neposredno formulom Fn = Fn�1 + Fn�2.

� koristeci se formulama za n-ti µclan

uk =1p5

1 +p5

2

!n� 1p

5

1�p5

2

!nZadatak. Dati su pozitivni cijeli brojevi m;n. Izraµcunati A (n;m) gdje je

A (n;m) =

8<:24 m+ 1 n = 0

A (n� 1; 1) n 6= 0;m = 0A (n� 1; A (n;m� 1)) n > 0:m > 0

35Zadatak. Niz polinoma je zadat na sljedeci naµcin T0 (x) = 1; T1 (x) = x; Tk (x) =2xTk�1 (x)� Tk�2 (x). Formirati niz T2; T3; :::; T8.

Zadatak. Niz polinoma je zadat na sljedeci naµcin H0 (x) = 1; H1 (x) = x;Hk (x) =xHk�1 (x)� (k � 2)Hk�2 (x).� Naci polinome H2; :::; H6� Za date realne brojeve a1; :::; a6 formirati polinom a0H0 (x) + :::+ a6H6 (x)

� Za dati realni broj a izraµcunati H0 (a) + :::+H6 (a)

64

Page 69: Algoritmi i programiranje

8 Euklidov algoritam

8.1 Uvod

Euklidov algoritam je dobio je ime po starogrµckom matematiµcaru Euklidu. To je na-je�kasniji algoritam za odre�ivanje najveceg 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 aktivnokoristi. U originalu, obja�njen je samo za prirodne brojeve i geometrijske duµzine (re-alne brojeve), ali je u 19. stoljecu primjenjen na polinome i na Gaussove cijele brojeve,�to je dovelo do razvoja novih pojmova apstraktne algebre. Euklidov algoritam je daljeprimjenjivan na drugim matematiµckim strukturama, poput µcvorova i polinoma.

Euklidov algoritam ima �iroku terijsku i praktiµcnu primenu. Predstavlja kljuµcni elementRSA algoritma, metode asimetriµcne kriptogra�je koja se u znaµcajnoj meri primenjujeu 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 osnovnosredstvo za dokazivanje teorema moderne teorije brojeva, kao �to su Lagrangeova teo-rem o µcetiri kvadrata i osnovna teorema aritmetike o jedinstvenoj faktorizaciji prirodnihbrojeva. Euklidov algoritam je e�kasan naµcin za odre�ivanje NZD velikih brojeva zbogtoga �to mu ne treba vi�e koraka od petostrukog broja cifara manjeg broja zapisanog saosnovom 10, �to je dokazao Gabrijel Lame 1844. godine i time oznaµcio poµcetak teorijekompleksnosti.

U 20. stoljecu su razvijene metode za pobolj�anje e�kasnosti Euklidovog algoritma.

8.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 primjenomteorema o dijeljenju ostatkom dobijen niz jednakosti

a = b � q1 + r1; 0 < r1 < bb = 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 najveci zajedniµcki djelitelj je jednak posljednjem ostatku kojije 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

NZD (a; b) = NZD (c; r1) = ::: = NZD (rj�1; rj) = rj.

Na narednom dijagramu je data op�ta �ema ovog algoritma

65

Page 70: Algoritmi i programiranje

Euklidov algoritam za nalaµzenje najveceg zajedniµckog djelioca dva broja

Primjer. Euklidovim algoritmom naci najveci zajedniµcki djelitelj brojeva 3102 i 4002.4002 = 1 � 3102 + 9003102 = 3 � 900 + 402900 = 2 � 402 + 96402 = 4 � 96 + 1896 = 5 � 18 + 618 = 3 � 6) NZD (4002; 3102) = 6Pokazuje se da sloµzenost Euklidovog algoritma zavisi o logaritamski manjem broju b i tonezavisno od a � b.

Pojedine jednadµzbe u postupku Euklidovog algoritma, kao u prethodnom primjeru, cemozvati Euklidske jednadµzbe. Kako se vidi, provedeno je ukupno 10 dijeljenja. Ostaci sutako�e Fibonaµcijevi brojevi. Ovo je jasno jer iz jednakosti Fn = 1 � Fn�1 + Fn�2 slijedida se dijeljenjem broja Fn sa Fn�1 u svakom koraku dobije kvocijent 1 i ostatak Fn�2. Izovoga generalno vrijedi

Teorem (Euklidov algoritam). Neka su r0 = a i r1 = b cijeli brojevi takvi da je a; b > 0.Ako se sukcesivnom primjenom algoritma o dijeljenju cijelih brojeva dobijerj = rj+1 � qj+1 + rj+2; 0 < rj+2 < rj+1 (j = 0; 1; :::; n� 2) i rn+1 = 0tada je NZD (a; b) = rn tj. posljednji nenulti ostatak je NZD (a; b).

Algoritam izloµzen u navedenom teoremu naziva se Euklidov algoritam.

Propozicija. U Euklidovom algoritmu za svako i vrijedi ri+2 <1

2ri.

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 jeri+2 = ri � ri+1 <

1

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

66

Page 71: Algoritmi i programiranje

Ovaj algoritam vrijedi i za Fibonaµcijeve brojeve �to ce biti ilustrovano na dva Fibonaµcijevabroja F11 = 89 i F12 = 144144 = 1 � 89 + 5589 = 1 � 55 + 3455 = 1 � 34 + 2134 = 1 � 21 + 1321 = 1 � 13 + 813 = 1 � 8 + 58 = 1 � 5 + 35 = 1 � 3 + 23 = 1 � 2 + 12 = 1 � 2 + 0Teorem. Neka je f1 = 1; f2 = 1; fn = fn�1 + fn�2 (n � 3) Fibonaµcijev niz brojeva Zasvako n � 2 Euklidov algoritam uzima taµcno n dijeljenja za odre�ivanjeGCD (fn+1; fn+2).Dokaz. Polazeci od rekurzivne jednakosti fi+2 = fi+1 + fi (i = 1; 2;) dobijamo

fn+2 = fn+1 � 1 + fnfn+1 = fn � 1 + fn�1

:::f4 = f3 � 1 + f2f3 = f2 � 2

Dakle, Euklidov algoritam za odre�ivanje GCD (fn+2; fn+1) uzima taµcno n dijeljenja ivrijedi GCD (fn+2; fn+1)� f2 � 1.

Teorem (Lame-ov teorem). Broj dijeljenja potrebnih za odre�ivanje najveceg zajed-niµckog djelioca prirodnih brojeva a i b ne prelazi petostruku vrijednost broja decimalnihcifara manjeg od ta dva broja.Dokaz. Neka je a > b. Kada se primijeni Euklidov algoritam za odre�ivanje najvecegzajedniµckog djelioca brojeva a = r0 i b = r1 dobija se sljedeci niz relacija:

r0 = r1 � q1 + r2; 0 < r2 < r1r1 = 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 veci ilijednaki 1 i da je qn � 2 jer je rn < rn�1. Zbog toga je

rn � 1 = f2rn�1 � 2rn � 2f2 = f3

rn�2 � rn�1 + rn � f3 + f2 = f4rn�3 � rn�2 + rn�1 � f4 + f3 = f5

:::r2 � r3 + r4 � fn�1 + fn�2 = fn

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

67

Page 72: Algoritmi i programiranje

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

je � =1 +p5

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

5to je log b >

n� 15. 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 + 5kodnosno n � 5k.

8.3 Zadaci za samostalni rad

Zadatak. Dati su prirodni brojevim;n1; n2; :::; nm (m � 2). IzraµcunatiNZD (n1; n2; :::; nm)koristeci se relacijom NZD (n1; n2; :::; nk) = NZD (NZD (n1; n2; :::; nk�1) ; nk) i algorit-mom Euklida.

Zadatak. Dati su prirodni brojevi m i n. Kori�tenjem Euklidovog algoritma naci:

� Najveci zajedniµcki djelitelj (NZD) brojeva m i n

� Najmanji zajedniµcki sadrµzalac brojeva m i n

� Brojeve p; q koji nemaju zajedniµckih sadrµzalaca za koje vrijedi m=n = p=q

68

Page 73: Algoritmi i programiranje

9 Tjuringova ma�ina

9.1 Uvod

Digitalni raµcunar se na apstraktnom nivou obiµcno prikazuje kao cjelina sastavljena odprocesora, memorije i ulazno-izlaznih ure�aja. Procesor iz memorije pribavlja naredbei podatke nad kojima se vr�i obrada u skladu sa znaµcenjem naredbi a dobijeni rezultatise vracaju u memoriju. Podaci koji ce biti obra�eni se, preko ulazno-izlaznih ure�aja,unose u memoriju odnosno iz memorije se preuzimaju rezultati obrade i prikazuju naodgovarajuci naµcin. Komunikacija djelova raµcunara se obavlja preko magistrala.

Tjuringova ma�ina je preteµca ovakvog modela raµcunara, pri µcemu su neka svojstva ideali-zovana. To se odnosi na memoriju za koju se pretpostavlja da je potencijalno beskonaµcna.Preciznije, na poµcetku izvr�avanja Tjuringove ma�ine zauzet je samo konaµcan broj mem-orijskih registara, a isto vaµzi i u svakom koraku izraµcunavanja. Ne postoji ograniµcenjekoliki je taj konaµcan broj registara. U svakom koraku izraµcunavanja moguce je i zahti-jevati novi, do tada neiskori�teni memorijski registar i svaki takav zahtjev se ispunjava.Sa druge strane, Tjuringova ma�ina je restrikcija koncepta savremenog raµcunara u smisluoperacija koje je u stanju izvr�avati a koje su elementarne. Zanimljivo je da su te op-eracije ipak dovoljne za opisivanje proizvoljnih algoritama. Njihova prednost u odnosuna bogatije programske jezike je upravo u jednostavnosti koja olak�ava analizu.

9.2 Alan Tjuring

Alan Mathison Turing je bio engleski matematiµcar, logiµcar, kriptoanalitiµcar i kompjuter-ski nauµcnik. Ostvari je veliki uticaj na kompjutersku nauku time �to je dao formal-izaciju koncepata "algoritma" i "izraµcunavanja" putem Tjuringove ma�ine, koja je odi-grala znaµcajnu ulogu u kreiranju modernih kompjutera. Za Tjuringa se smatra da jeotac kompjuterske nauke i vje�taµcke inteligencije. U �ziµckom smislu, imao je mnogekarakteristike koje upucuju da je imao Aspergerov sindrom3.

Tokom drugog svjetskog rata Tjuring je radio za vladinu �kolu za kriptogra�ju (GCCS)u Bletchley Park, Britanskom centru za de�ifrovanje. Vremenom je postao vo�a sekcijekoja je bila odgovorna za razbijanje �ifara njemaµcke mornarice. Razvio je niz tehnika zarazbijanje njemaµckih �ifara, ukljuµcujuci i metod Bombe, elektromehaniµcke ma�ine koja jemogla pronaci postavke ma�ine Enigma.

Nakon rata je radio za National Physical Laboratory gdje je kreirao jedan od prvih diza-jna raµcunara sa pohranjenim programom, ACE. Godine 1948 se do�ao u Max Newman�sComputing Laboratory na Manchester University gdje je pomagao u razvoju Manchesterkompjutera i gdje se zainteresovao za matematiµcku biologiju. Napisao je µclanak o hemi-jskoj osnovi morfogeneze i predvidio oscilatorne hemijske reakcije kao �to su reakcijaBjelousov-µZabotinski (Belousov-Zhabotinsky oscilating reaction) koja je prvi put uoµcena1960. godine.

3To je poremecaj iz spektra autizma (autism spectrum disorder - ASD) kojeg karakteri�u znaµcajnete�koce u socijalnoj interakciji, skupa sa ograniµcenim i repetitivnim obrascima pona�anja i interesa.Od drugih tipova autizma se razlikuje po relativno visokom stepenu oµcuvanja lingvistiµckog i kognitivngrazvoja. Mada se ne uzima kao element dijagnoze, µcesto se pojavljuju sluµcajevi �ziµcke "trapaovosti" iatipiµcnog kori�tenja jezika.

69

Page 74: Algoritmi i programiranje

Tjuringva homoseksualnost je rezultirala kriminalnim progonom godine 1952 kada je ho-moseksualnost bila ilegalna u Velikoj Britaniji. Prihvatio je tretman µzenskim hormonima(hemijska kastracija) kao alternativu za zatvor. Umro je 1954, nekoliko sedmica prijesvog 42-og ro�endana, od trovanja cijanidom (gljivama). Istraga je utvrdila da je tobilo samoubistvo; njegova majka i neki drugi su vjerovali da je umro nesretnim sluµcajem.Dana 10.09.2009. godine, nakon Internetske kampanje, Britanski premijer Gordon Brownje objavio javno izvinjenje u ime Britanske vlade zbog naµcina na koji je Alan Tjuring biotretiran nakon rata.

9.3 Alfabet

Svaki problem se izraµzava u nekom jeziku. Alfabet je skup znakova koji su nedjeljivecjeline. Rijeµc na nekom alfabetu je bilo koja konaµcna sekvenca znakova tog alfabeta.Sekvenca od nula znakova se naziva prazna rijeµc. Rijeµci se razdvajaju znakom blankokoji se ne smatra dijelom alfabeta vec pomocnim simbolom.

Jezik je neki poskup skupa svih rijeµci odgovarajuceg alfabeta. Rijeµc t je podrijeµc rijeµci qako postoje, moµzda i prazne, rijeµci u i v tako da je q = utv.

Alfabet je obiµcno konaµcan skup znakova jer sve �to se moµze iskazati beskonaµcnim pre-brojivim alfabetom fa1; a2; :::g moµze se iskazati i najjednostavnijim, unarnim, alfabetomA = f1g. Rijeµci alfabeta f1; 11; 111; :::g se mogu identi�kovati sa znacima proizvoljnogbeskonaµcnog alfabeta. Ako se posebno ne naglasi, u nastavku ce biti kori�ten unarnialfabet A = f1g. Pored simbola 1 ce biti kori�ten i blanko znak za µcije oznaµcavanje ce,radi preglednosti, biti kori�ten znak 0.

9.4 Neformalni opis Tjuringove ma�ine

Tjuringova ma�ina se sastoji od :

� Trake, koja je podijena u celije, memorijske registre, koja se neograniµceno pruµzalijevo i desno; broj celija (tj. duµzina trake) je neograniµcen; sadrµzaj svake celije je iliznak 1 ili blanko znak (znak 0),

� Glave, koja se uvijek nalazi nad taµcno jednom celijom trake i moµze:

- proµcitati sadrµzaj celije nad kojom se nalazi i

- upisati u celiju nad kojom se nalazi znak 1 ili 0 (blanko znak, tj. obrisati celiju)ili se pomjeriti za jedan korak u lijevo ili u desno u odnosu na trenutnu poziciju,

� Indikatora stanja ma�ine

Tjuringova ma�ina se u svakom trenutku nalazi u taµcno jednom od konaµcno mnogo stanjakoje se eventualno mijenja nakon svakog koraka izraµcunavanja. Skup svih stanja ma�inece biti oznaµcen sa S = fq1; q2; :::g. Izvr�avanje ma�ine se izvodi pod dejstvom programakoji µcini neki konaµcan niz naredbi. Svaka naredba je µcetvorka oblika

qi s o qj

70

Page 75: Algoritmi i programiranje

gde su qi i qj neka stanja iz skupa S, s je znak nad kojim se nalazi glava ma�ine ao 2 f1; 0; L;Rg je oznaka operacije. U svakom koraku rada ma�ina analizira stanje ukojem se nalazi i sadrµzaj celije nad kojom je glava a zatim izvr�ava naredbu koja imaodgovarajuce vrijednosti parametara qi i s. Efekat izvr�enja naredbe je dvojak. Najprijese, u zavisnosti od vrijednosti parametra o, obavi:

� Ako je o = 1 tada se u celiju nad kojom se nalazi glava upisuje znak 1,

� Ako je o = 0 tada se u celiju nad kojom se nalazi glava upisuje znak 0,

� Ako je o = L tada se glava pomjera ulijevo za jednu celiju

� Ako je o = R tada se glava pomjera udesno za jednu celiju

Nakon toga ma�ina mijenja stanje i prelazi u stanje qj.

Primjeri naredbi su :

� q5 0 1 q17 : Ako se ma�ina nalazi u stanju q5 a glava nad znakom blanko u celiju seupisuje znak 1 i prelazi se u stanje q17;

� q1 0 0 q2 : Ako se ma�ina nalazi u stanju q1 a glava nad znakom blanko u celiju seupisuje blanko znak i prelazi u stanje q2. Ovakva naredba sluµzi samo za promjenustanja ma�ine;

� q0 1 L q0 : Ako se ma�ina nalazi u stanju q0 a glava nad znakom 1 glava se pomjeraulijevo a ma�ina ostaje u istom stanju

Ako se µzeli da ma�ina radi deterministiµcki program smije sadrµzavati samo jednu naredbuza svaku kombinaciju stanja qi i sadrµzaja celije s nad kojom je glava. Naprimjer uprogramu se ne smiju pojaviti sljedece naredbe :

� q4 1 1 q5

� q4 1 L q2

jer im se poklapaju vrijednosti parametara qi i s a vrijednosti parametara o i qj razlikuju.U sluµcaju nedeterministiµckih ma�ina ovakav zahtjev ne postoji.

Konvencija je da se stanje q0 2 S zove poµcetno stanje. Rijeµc se na traci prikazuje kaoneprekidan niz celija koje sadrµze znak 1 a sa lijeve i desne strane rijeµci se nalazi najmanjepo jedan znak blanko odnosno znak 0. U pravilu, na poµcetku i kraju glava ma�ine senalazi iznad prve celije slijeva koja sadrµzi znak 1. Skup stanja S ce biti pro�iren novimstanjem qz koje ce se zvati zavr�no stanje. Ma�ina u tom stanju prekida izvr�enje.

71

Page 76: Algoritmi i programiranje

9.5 Formalni opis Tjuringove ma�ine

Neka su :

� S : konaµcan skup stanja

� q0 : poµcetno stanje, q0 2 S

� qz : zavr�no stanje, qz 2 S

� A = f0; 1g alfabet

� � : (Sn fqzg)� A! (A [ fL;Rg)� S

Tada se Tjuringova ma�ina de�ni�e kao ure�ena petorka (S; q0; qz; A; �).

Opis trake je preslikavanje F : Z! A tako da ako je u celiji sa indeksom z upisan znak0 ili 1 tada je F (z) = 0 ili F (z) = 1.

Kon�guracija Tjuringove ma�ine M = (S; q0; qz; A; �) je trojka (F; q; e) gdje su:

� F : opis trake

� q 2 S : tekuce stanje

� e 2 Z : broj celije nad kojom se nalazi glava

Naredba Tjuringove ma�ineM = (S; q0; qz; A; �) je µcetvorka (qi; s; o; qj) gdje je � (qi; s) =(o; qj). Preslikavanje � se naziva program. Pri tome vaµzi

qi = q0i ^ s = s0 ) � (qi; s) = � (q

0i; s

0)

Raµcunski korak Tjuringove ma�ine M = (S; q0; qz; A; �) za naredbu I = (qi; s; o; qj) jesvaki par kon�guracija ((F 0; q0; e0) ; (F 00; q00; s00)) za koje vaµzi:

� qi = q0

� F 0 (e0) = s

� qj = q00

� Ako je operacija o = 1 vaµzi :- e0 = e00

- F 0 i F 00 se poklapaju osim u e00 gdje je F 00 (e00) = 1

� Ako je operacija o = 0 vaµzi- e0 = e00

- F 0 i F 00 se poklapaju osim u e00 gdje je F 00 (e00) = 0

� Ako je operacija o = L vaµzi- e0 � 1 = e00

- F 0 i F 00 se poklapaju

72

Page 77: Algoritmi i programiranje

� Ako je operacija o = R vaµzi- e0 + 1 = e00

- F 0 i F 00 se poklapaju

Da je ((F 0; q0; e0) ; (F 00; q00; s00)) raµcunski korak naredbe I oznaµcava se sa (F 0; q0; e0) `I(F 00; q00; e00).

Izraµcunavanje za Tjuringovu ma�inu M = (S; q0; qz; A; �) i program P opisan funkcijom� je niz kon�guracija (F0; q0; e0), (F1; q1; e1), ... , (Fm; qm; em) tako da :

� (F0; q0; e0) `I1 (F1; q1; e1) za neku naredbu I1 (programa P ) i stanje q0 = q0

� (8k 2 N) (0 < k < m� 1)��Fk�1; q

k�1; ek�1�`Ik

�Fk; q

k; ek��

� (Fm�1; qm�1; em�1) `Im (Fm; qm; em), za qm = qm

��8k = 1;m� 1

� �qk 6= qz

�� e0 = 0; (8i < 0) (F0 (i) = 0)

� (9n > 0) (9k1; :::; kn) (e0 � k1 < k2 < ::: < kn) tako da vaµzi- (8i; e0 � i � k1) (F0 (i) = 1; F0 (k1 + 1) = 0)- (8i; k1 + 1 � i � k2) (F0 (i) = 1; F0 (k2 + 1) = 0)- ...

- (8i; ) (kn�1 + 1 � i � kn) (F0 (i) = 1)- (8i; kn < i) (F0 (i) = 0)

� Fm (em) = 1, i (8i < em) (Fm (i) = 0)

� 9k � em :- (8i; em � i � k) (Fm (i) = 1)- (8j > k) (Fm (j) = 0)

Varijante Tjuringove ma�ine su :

� TM sa bogatijim alfabetom

� TM sa vi�e zavr�nih stanja (u kojem svako od njih simbolizuje rezultat rje�avanjaproblema)

� TM sa lijevo ograniµcenom trakom

� TM sa vi�e traka i glavom za svaku od njih

� TM sa jednom trakom i vi�e glava nad njima

� TM sa 2D trakom koja je beskonaµcna po obje dimenzije

� TM koje dozvoljavaju u istoj naredbi upis u celiju i pomjeranje glave

73

Page 78: Algoritmi i programiranje

� Nedeterministiµcke TM (� je relacija a ne funkcija tj. moµze postojati vi�e naredbiza isto stanje i sadrµzaj celije)

Nijedna od ovih varijanti ne pro�iruje klasu Tjuring izraµcunljivih funkcija (mogu izraµcu-nati samo ono �to moµze i osnovna verzija TM)

Izraµcunljiva funkcija je samo ona koja je Tjuring izraµcunljiva.

9.6 Zadaci

Zadatak. Neka je na traci data samo jedna rijeµc sastavljena od jedinica (a sve ostale celijesadrµze znak 0); glava je nad krajnjim lijevim znakom. Napisati program koji dopisujedva znaka 1 sa desne strane rijeµci a zatim se glava vraca ulijevo na poµcetak rijeµci i ma�inastaje.Rje�enje. Osnovni koncept rje�avanja je da se na svakom koraku ispituje tekuci znak.Ako je to 1 glava se pomiµce udesno; ako je to 0 znak se mijenja u 1 i glava ponovo pomiµceudesno, znak se mijenja u 1; zatim se vr�i pomjeranje ulijevo sve dok se ne nai�e na 0;tada se glava pomjeri jedno mjesto udesno i program zavr�ava.

Naredba Akcijaq0 1 R q0 glava se pomjera udesno na kraj rijeµciq0 0 1 q1 na mjestu prve 0 se upisuje 1 i prelazi se u stanje q1q1 1 R q2 glava se pomjera udesnoq2 0 1 q3 na mjestu druge 0 se upisuje 1 i prelazi u stanje q3q3 1 L q3 glava se pomjera ulijevo sve dok ima znakova 1q3 0 R qz na prvoj 0 glava ide udesno i zaustavlja se

Niz koji opisuje izvr�avanje ovog programa je dat u nastavku.

q0 : 011000:::q0 : 011000:::q0 : 011000:::q1 : 011100:::q2 : 011100:::q3 : 011110:::

q3 : 011110:::

q3 : 011110:::

q3 : 011110:::

q3 : 011110:::

qz : 011110:::

U svakom redu je navedeno stanje a podvuµcena je pozicija koja odgovara tom stanju.Ovo se kompaktnije opisuje tabelom.

Stanje 1 0q0 q0 1 R q0 q0 0 1 q1q1 q1 1 R q2q2 q2 0 1 q3q3 q3 1 L q3 q3 0 R qz

Zadatak. Napraviti program za Tjuringovu ma�inu koja izraµcunava funkciju f (x) = 0.Rje�enje. Zadatak se rje�ava tako da se u svakom koraku znak 1 mijenja sa 0. Kraj sedetektuje tako da se ova zamjena izvr�ava u okviru jednog stanja i da se u okviru istogstanja ispituje da li je tekuci znak 0.

74

Page 79: Algoritmi i programiranje

Stanje 1 0q0 q0 1 0 q1 q0 0 0 qzq1 q1 0 R q0

Zadatak. Napraviti program za Tjuringovu ma�inu koja raµcuna nasljednika prirodnogbroja n.Rje�enje. Nasljednik prirodnog broja je broj koji je za 1 veci od datog broja. Zadatak serje�ava tako da se glava pomakne jedno mjesto ulijevo, upi�e znak 1 i zavr�i posao.

Stanje 1 0q0 q0 1 L q1q1 q1 0 1 qz

Zadatak. Napraviti program za Tjuringovu ma�inu koja raµcuna vrijednost funkcijef (n) = 2n.Rje�enje. Zadatak se rje�ava tako da se tekuci znak 1 zamijeni sa 0, pro�u svi znaci 1 utoj rijeµci, pro�e i jedan znak 0 iza te rijeµci, pro�u sve jedinice ako ih eventualno ima izate nule, dodaju dva znaka 1, glava vrati preko svih jedinica ulijevo, zatim pre�e prekoznaka 0 koji razdvaja dvije rijeµci, pro�u sve jedinice poµcetne rijeµci i do�e do prvog znaka1 te rijeµci. Kriterij zaustavljanja je da posljednje stanje, zaduµzeno za detekciju jedinicau prvoj rijeµci, detektuje znak 0.

Stanje 1 0q0 0 R q1 0 R qzq1 1 R q1 0 R q2q2 1 R q2 1 R q3q3 1 L q4q4 1 L q4 0 L q5q5 1 L q5 0 R q0

Svaka celija se ovdje µcita po sljedecem redu : novi simbol na tekucoj lokaciji (0,1), akcija(L, R) i novo stanje.

U narednim primjerima Tjuringova ma�ina je data �estorkom hQ;�;�; �; q0; F i gdje je:

75

Page 80: Algoritmi i programiranje

� Q : konaµcan skup stanja

� � : skup ulaznih simbola (alfabet)

� � : skup simbola na traci ukljuµcujuci i simbol # za prazno

� � : tranzicijska funkcija � : Q� �! Q� �� fL;Rg

� q0 : inicijalno stanje

� F : skup konaµcnih stanja

Zadatak. Zadata je Tjuringova ma�ina

TM = (fq1; q2; q3g ; f0; 1g ; f0; 1;#g ; �; q0; fqzg)

Ma�ina µcita niz znakova i krajnji desni mijenja simbolom #.Rje�enje. Dijagram za ovaj program je u nastavku.

µCitanje niza simbola i ispravka krajnjeg desnog simbola

Ovdje se " 1; 1; R" µcita : Ako je q0 = 1 upisati 1 (1 ostaje 1) i idi desno u stanje q1" itd.Program je dat u obliku tabele.

Stanje 1 0 #q0 0; R; q1 1; R; q1q1 0; R; q1 1; R; q1 #; L; q2q2 #; L; q3 #; L; q3q3 0; L; q3 1; L; q3 #; L; qz

Niz kojim se ilustruje rad ovog programa je u nastavku.

q0 : #1110#q1 : #1110#q1 : #1110#q1 : #1110#q1 : #1110#q2 : #1110#

q3 : #111##

q3 : #111##

q3 : #111##

q3 : #111##

qz : ##111##

Zadatak. Zadata je Tjuringova ma�ina

76

Page 81: Algoritmi i programiranje

TM = (fq1; q2; q3g ; f0; 1g ; f0; 1;#g ; �; q0; fqzg)

Napraviti program koji µcita niz nula i jedinica i daje podatak o parnosti u nizu. Izlaz je0 ako je broj jedinica u nizu paran a 1 ako je broj jedinica neparan.Rje�enje. Akcije koje se obavljaju su :

� Traµzenje jedinica slijeva udesno

� Simboli 0 se µcitaju ali se ignori�u

� Odrµzava se brojaµc ako se nai�e na simbol 1 u skladu sa tim da li je broj jedinicaparan ili neparan

� Kad se nai�e na znak # izlaz se pi�e na tekucu poziciju

Skup stanja je sljedeci :

� q0 indicira da li je broj simbola 1 paran

� q1 indicira da li je broj simbola 1 neparan

Dijagram za ovaj program je u nastavku.

Brojaµc pariteta broja jedinica u nizu

Program je dat sljedecoj na tabeli.

Stanje 1 0 #q0 1 R q1 0 R q0 0 R qzq1 1 R q0 0 R q1 1 R qz

Rad je ilustrovan na sljedecem primjeru.

q0 : 1011010#q1 : 1011010#q1 : 1011010#q0 : 1011010#q1 : 1011010#

q1 : 1011010#

q0 : 1011010#

q0 : 1011010#

qz : 10110100

77

Page 82: Algoritmi i programiranje

Zadatak. Zadata je Tjuringova ma�ina

TM = (fq1; q2; q3g ; f0; 1g ; f0; 1;#g ; �; q0; fqzg)

Prethodni primjer modi�kovati na naµcin da se izlaz stavlja nakon simbola # tako da sedopi�e jo� jedan takav simbol. Drugim rijeµcima ako je string 01# tada je izlaz u obliku01#1# a izlaz iz stringa iz prethodnog primjera bi trebao biti 1011010#0#.Rje�enje. Ovdje je potrebna dodatna akcija za traµzenje simbola # i stavljanje izlaza izanjega. Dijagram za ovaj program je u nastavku.

Modi�kacija programa za odre�ivanje pariteta

Program je dat na narednoj tabeli.

Stanje 1 0 #q0 1 R q1 0 R q0 # R q2q1 1 R q0 0 R q1 # R q3q2 0 R qzq3 1 R qz

Rad je ilustrovan na sljedecem primjeru.

q0 : 1011010##q1 : 1011010##q1 : 1011010##q0 : 1011010##q1 : 1011010##

q1 : 1011010##q0 : 1011010##q0 : 1011010##q2 : 1011010##qz : 1011010#0

Zadatak. Zadata je Tjuringova ma�ina

TM = (fq1; q2; q3g ; f0; 1g ; f0; 1;#g ; �; q0; fqzg)

Napraviti program koji dodaje 1 broju koji je predstavljen binarno, sa mogucim vodecimnulama.Rje�enje. Aktivnosti koje se obavljaju su:

� Traµzenje posljednje znaµcajne cifre

78

Page 83: Algoritmi i programiranje

Figure 1: Dodavanje jedinice na binarni zapis broja

� Kretanje ulijevo i praviti prenos. Ako je prona�ena 0 mijenja se jedinicom i posaose zaustavlja; Ako je prona�ena 1 mijenja se sa 0 i nastavlja sa kontrolom prenosa

Dijagram za ovaj program je u nastavku.Program je dat na sljedecoj tabeli.

Stanje 1 0 #q0 1 R q0 0 R q0 # L q1q1 0 L q2 1 L qz 1 R qzq2 0 L q2 1 L q2 # R qz

Rad programa je ilustrovan na sljedeca dva primjera.

Primjer 1.q0 : ##110#

q0 : ##110#

q0 : ##110#

q0 : ##110#

q1 : ##110#

qz : ##111#

Primjer 2.q0 : ##11#q0 : ##11#q0 : ##11#q1 : ##11#q1 : ##10#q1 : ##00#qz : #100#

Zadatak. Data je Tjuringova ma�ina

TM = (fq1; q2; q3; q4; q5; q6g ; f0; 1; A;#g ; f0; 1; A;#; Xg ; �; q0; fqzg)

Napraviti program koji za data dva brojam i n raµcuna vrijednost max fm;ng. Svaki brojje predstavljen nizom jedinica. Pri tome je po jedan simbol A postavljen jednu pozicijuulijevo od kranje lijeve pozicije prvog broja i jednu poziciju desno od krajnje desne pozicijedrugog broja; brojevi su odvojeni jednim znakom # �to je i inicijalna pozicija.Rje�enje. Koncept rje�avanja problema je sljedeci:

� poµcev od inicijalne pozicije na svakom koraku se po jedna jedinica sa svake stranezamjenjuje simbolom X

� ako se pri kretanju nai�e na simbol A tada se svi znaci X sa te strane znaka #mijenjaju sa 0, znak # se mijenja u znak A svi znaci X sa druge strane znaka #mijenjaju sa 1

79

Page 84: Algoritmi i programiranje

Rezultat je broj koji je maksimalni od dva data broja. Navedeni program je dat u oblikunaredne tabele.

# 1 X Aq0 #; L; q1q1 X;R; q3 X;L; q1 0; R; q5q2 X;L; q4 X;R; q2 0; L; q6q3 #; R; q2 X;R; q3q4 #; L; q1 X;L; q4q5 A;R; q5 1; R; q5 0; R; q5 A;L; qzq6 A;L; q6 1; L; q6 0; L; q6 A;R; qz

80

Page 85: Algoritmi i programiranje

10 Sortiranja

10.1 Uvod

Algoritmi sortiranja su primjer matematiµckih algoritama koji se rje�avaju putem mnogihdrugih razliµcitih metoda.

U op�tem sluµcaju, sortiranje se shvata kao proces pregrupisavanja datog skupa objekata unekom odre�enom redoslijedu. Cilj sortiranja je olak�ati pretraµzivanje elemenata u takosortiranom skupu. To je skoro univerzalni, fundamentalni zadatak. U svakodnevnomµzivotu se srecemo sa puno primjera kao �to su telefonski imenici, rijeµcnici i sliµcno.

Izbor algoritama za rje�avanje bilo kog problema zavisi od strukture podataka, �to jeskoro zakon, a u sluµcaju sortiranja takva zakonitost je toliko duboka da se odgovarajucemetode dijele na dvije klase, sortiranje nizova i sortiranje fajlova. Nekada se nazivajuunutra�nje i vanjsko sortiranje, s obzirom da se nizovi pohranjuju u brzo internoj memorijidok su fajlovi pohranjeni na spoljnim, sporijim ure�ajima (diskovi,...). Ovo je moguceilustrovati na primjeru sortiranja igracih karata. Ako se karte posmatraju u obliku nizaonda su posloµzene na stolu i onaj ko ih sortira vidi ih sve pojedinaµcno i ima neposredanpristup svakoj od njih. Ako karte obrazuju fajl to podrazumijeva da je vidljiva samo onana vrhu svake gomile. Ovakvo ograniµcenje ima ozbiljan uticaj na metod sortiranja.

Ako su dati elementi a1; a2; :::; an; ::: tada je sortiranje permutacija tih elemenata u nizak1 ; ak2 ; :::; akn ; ::: u kojem, po osnovu neke funkcije poretka f vrijedi f (ak1) � f (ak2) �::: � f (akn) � :::. Funkcija poretka se obiµcno ne raµcuna po nekom pravilu vec se µcuvakao sastavni dio (polje) svakog elementa. Znaµcenje te funkcije se naziva kljuµc (key).

Metod sortiranja je lokalan (in-place) ako ne koristi dodatne memorijske resurse za sor-tiranje i stoga je moguce sortirati veoma velike liste bez potrebe alokacije (dodjeljivanja)dodatnog memorijskog prostora.

Metod sortiranja je stabilan ako se u procesu sortiranja odgovarajuci odnos elemenata sajednakim kljuµcevima ne mijenja. Ovo je µcesto poµzeljna osobina ako se radi o elementimakoji su vec sortirani nekim metodom koji nema uticaja na kljuµc.

10.2 Sortiranje nizova - osnovne metode

Osnovni uslov je da odabrani metod sortiranja nizova ekonomiµcno koristi dostupnu mem-oriju. To podrazumijeva da se permutacije kojima se elementi stavljaju u odgovarajuciporedak obavljaju na tom istom mjestu. Drugim rijeµcima, metode koje podrazumijevajuda se elementi niza a premje�taju u niz b predstavljaju bitno manji interes. Zbog ovakvihograniµcenja algoritmi se klasi�ciraju po osnovu ekonomiµcnosti odnosno vremenu rada.Dobra mjera e�kasnosti moµze biti C, broj neophodnih upore�ivanja kljuµceva i M , brojpremje�tanja (permutacija) elemenata. Ovi brojevi su funkcija od n, dimenzije niza kojise sortira.

Mada dobri algoritmi sortiranja trebaju n�log n upore�ivanja, analiza poµcinje od prostijihi oµciglednih algoritama koji se nekada nazivaju direktni. Motiv za ovakav izbor moµze biti:

� Direktne metode su posebno pogodne za obja�njenje karakteristika osnovnih prin-cipa obima sortiranja

81

Page 86: Algoritmi i programiranje

� Postupci tih metoda se lako pamte i kratki su. Ne treba zaboraviti da i programizauzimaju memoriju

� Usloµznjavanje metoda trebaju manji broj operacija koje su same po sebi dostasloµzene pa su za male n direktne metode brµze mada ih ne treba koristiti za velike n

Metode sortiranja na tekucoj poziciji se dijele na :

� Sortiranja putem ukljuµcivanja (insertion)

� Sortiranja putem podjele (selection)

� Sortiranja putem zamjene (exchange)

Napomena. U narednom izlaganju se koristi tzv. relativno indeksiranje nizova kojesastoji u tome da prvi µclan niza ima indeks 0 a da svi ostali imaju indeks koji odgovarabroju pozicija nakon tog elementa. U takvoj notaciji je a4 je peti element niza jer je4 pozicije u odnosu na a0. Iz tog razloga je vaµzno razumjeti da npr. Duzina [a] � 1oznaµcava, ustvari, indeks posljednjeg a ne pretposljednjeg µclana niza.

U tzv. apsolutnom indeksiranju µclanovi niza imaju indeks koji odgovara njihovoj stvarnojpoziciji (a1; a2; :::; an; :::). Pomocu jednostavne transformacije je moguce pretvoriti jednunotaciju u drugu.

10.2.1 Sortiranje putem umetanja (Insertion sort)

Algoritam sortiranja umetanjem (Insertion sort) se temelji na me�usobnom upore�ivanjuvrijednosti kljuµceva pri µcemu se u svakoj iteraciji odrµzavaju sortirani i nesortirani dio niza.U svakom sljedecem koraku se iz nesortiranog dijela uzima jedan element i taj element seumece na odgovarajuce mjesto u sortiranom dijelu. Prema tome, svakim novim korakomnesortirani dio niza se smanjuje, dok se sortirani dio niza postepeno povecava.

Insertion sort ce biti obja�njen na primjeru sortiranja niza A = fa0; a1; :::; an�1g u ras-tucem poretku. Na poµcetku algoritma sortirani dio se sastoji samo od prvog elementa a0dok svi ostali elementi µcine nesortirani dio niza. U prvom koraku se porede elementi a1 ia0 (drugi i prvi element u nizu). Ako je element a0 veci od elementa a1 tada se elementa1 pohranjuje u privremenu lokaciju priv, element a0 se pomjera na drugo mjesto (i = 1)te se na prvo mjesto u nizu s indeksom i = 0 pohranjuje element a1 iz privremene lokacijepriv. U ovom trenutku sortirani dio niza sadrµzi dva elementa (a0 i a1) a nesortirani diosadrµzi n� 2 elemenata (a2, a3,...an�1).

Pretpostavimo da je algoritam do�ao do nekog i-tog koraka. Poslije prethodnog (i� 1)-ogkoraka u sortiranom dijelu se nalaze elementi a1, a2,..., ai�1. Zatim se u i-tom korakuiz nesortiranog dijela uzima element ai nakon µcega se prema kraju niza pomjeraju svielementi iz sortiranog dijela niza koji su veci od elementa ai da bi se oslobodio prostor zapohranjivanje tog elementa na odgovarajuce mjesto u nizu. Na taj naµcin se veliµcina sorti-ranog dijela niza povecava sa i�1 na i. Sortiranje se zavr�ava kada u nesortiranom dijeluniza nema vi�e elemenata odnosno kada zadnji element an�1 zauzme svoju odgovarajucupoziciju. Algoritam je ilustrovan na primjeru u sljedecoj tabeli.

82

Page 87: Algoritmi i programiranje

0 1 2 3 4 5 priv4 11 2 9 3 104 11 2 9 3 104 11 9 3 10 24 11 9 3 10 2

4 11 9 3 10 22 4 11 9 3 102 4 11 9 3 102 4 11 3 10 92 4 11 3 10 92 4 9 11 3 10 92 4 9 11 3 102 4 9 11 10 32 4 9 11 10 32 4 9 11 10 32 4 9 11 10 32 3 4 9 11 102 3 4 9 11 102 3 4 9 11 102 3 4 9 11 102 3 4 9 10 11

Na tabeli su nagla�eni elementi koji u tom algoritmu imaju indeks i. Pseudo kod kojimse opisuje ovaj algoritam je u nastavku.

Procedura InsertionSortDirektniUlaz : n; fangInicirati i; j; priv// Poµcetak od prve pozicijei 1Za (i � Duzina [a]� 1) raditi{

// Element ide na rezervnu lokacijupriv a [i]// Umetanje elementa a [i] u sortirani niz a [1; ::; j � 1]j i� 1DokVrijedi (j � 0 & a [j] > priv) raditi{

// Element se stavi jednu poziciju desnoa [j + 1] a [j]// Pomjeramo se za jedno mjesto ulijevoj j � 1

}// Element sa privremene lokacije se smje�ta na svoje mjestoa [j + 1] priv

}Izlaz : Sortirani niz fang

Proces traµzenja se moµze zavr�iti u jednom od dva sluµcaja :

83

Page 88: Algoritmi i programiranje

� Na�en je element aj sa kljuµcem koji je manji od kljuµca za x

� Dostignut je lijevi kraj sortiranog dijela niza

Ovakav tipiµcan sluµcaj ponavljajuceg procesa sa dva uslova zavr�etka dozvoljava kori�tenjegraniµcnika (sentinel). U ovom sluµcaju to moµze biti element a0 (�to znaµci da je dovoljnoraspon indeksa pro�iriti indeksom 0). Analiza sloµzenosti ove metode je data dijelom nasljedecoj tabeli.

Korak Dinamika0 1 i 11 DokVrijedi (i < Du�zina [a]) raditi { n2 priv a [i] n� 13 j i� 1 n� 14 DokVrijedi (j � 0 & a [j] > priv) raditi {5 a [j + 1] a [j]6 j j � 17 }8 a [i+ 1] priv n� 19 j j + 1 n� 110 }

Najbolji sluµcaj se pojavljuje u situaciji kada je niz vec sortiran pa je za pozicioniranjesvakog elementa potrebna samo jedna operacija pore�enja. Tom operacijom se zapravosamo utvr�uje da je prethodnik svakog elementa manji od tog elementa, te svi elementiostaju na svojim mjestima. To znaµci da je u najboljem sluµcaju ukupan broj operacijapore�enja Tc(n) :

Tc (n) = n� 1

Prema tome, vremenska sloµzenost za najbolji sluµcaj je O(n).

Najgori sluµcaj se pojavljuje u situaciji kada je za umetanje svakog elementa iz nesortiranogdijela niza potrebno porediti taj element sa svim elementima u sortiranom dijelu niza.Drugim rijeµcima, najgori sluµcaj je kada se svaki element trenutno pozicionira na poµcetaksortiranog dijela niza. To se doga�a kada je niz sortiran u obrnutom poretku. Tada jeukupni broj operacija usporedbi Tc(n) :

Tc (n) =nXi=1

i =n (n� 1)

2

Na taj naµcin se dobija da ovaj algoritam ima kvadratnu zavisnost od veliµcine niza odnosnonjegova brzina se izraµzava sa O (n2).

Analiza ove metode putem broja pore�enja i premje�tanja pokazuje da broj pore�enjakljuµceva (Ci) u i-tom koraku moµze biti najvi�e i � 1, najmanje 1 a u prosjeku i=2,pod pretpostavkom da su sve permutacije od n elemenata jednako vjerovatne. Brojpremje�tanjaMi je jednak Ci+2 (ukljuµcujuci barijeru, sentinel). Na tabeli 3. su procjenebrzine ovog algoritma.

Minimalne ocjene se mogu desiti kod vec sortiranih nizova a najgore kada je niz sortiranopadajucim redoslijedom.

84

Page 89: Algoritmi i programiranje

C Mmin n� 1 3 � (n� 1)

prosjekn2 + n� 2

4

n2 + 9n� 104

maxn2 + n� 4

4

n2 + 3n� 44

Pobolj�anjaKod ovog algoritma se obavlja pretraµzivanje sortiranog dijela niza da bi se odredila pozi-cija umetanja prvog elementa iz nesortiranog dijela niza. Pobolj�anje e�kasnosti postup-kom da se pozicija umetanja pronalazi binarnim umjesto sekvencijalnim pretraµzivanjemtemelji se na svojstvu da je prvi dio niza sortiran, kao �to je to sluµcaj u osnovnoj vari-janti algoritma. U toj pobolj�anoj varijanti prosjeµcan broj operacija pore�enja u svakojiteraciji se smanjuje sa i=2 na pribliµzno 1 + log2 i. To znaµci da je u pobolj�anoj varijantivremenska sloµzenost za operacije pore�enja reda O(n log n) �to je znatno pobolj�anje, alisamo za te operacije. Me�utim, e�kasnim pronalaµzenjem mjesta umetanja ne smanjujese i broj potrebnih operacija premje�tanja koji zapravo ostaje isti kao i u osnovnoj vari-janti. Taj broj operacija je dominantan u odnosu na broj operacija u pore�enju za velikevrijednosti n pa ukupna vremenska sloµzenost algoritma ostaje O(n2). Pseudo kod za ovuvarijantu algoritma sortiranja je u nastavku.

10.2.2 Shell sort

U osnovnoj varijanti algoritma sortiranja umetanjem elementi se pomjeraju za samojednu poziciju, �to za posljedicu ima veliki broj premje�tanja. E�kasnost algoritma semoµze pobolj�ati na naµcin da se porede elementi koji su odvojeni nekim brojem pozicijapa da se umetanje elemenata obavlja tako da se prave premje�tanja elemenata koji surazdvojeni sa vi�e od jednog mjesta razmaka. Neka je, na primjer, u nizu element koji imaneku malu vrijednost koja se prije sortiranja nalazi pri kraju niza i da niz treba sortiratiniz u rastucem poretku. Koristeci osnovnu varijantu algoritma sortiranja umetanjembio bi potreban veliki broj operacija pore�enja i premje�tanja dok taj element ne bi bioumetnut na odgovarajucu poziciju. E�kasnost se moµze pobolj�ati tako da se elementi prvopomjeraju prema konaµcnoj poziciji koristeci velike skokove, tako da bi se, na primjer,element koji ima malu vrijednost pomjerio prema konaµcnoj poziciji uz samo nekolikooperacija pore�enja i premje�tanja. Pobolj�anje koje se temelji na prethodno opisanojstrategiji je predloµzio Donald Shell, po kojem je algoritam nazvan Shell sort.

Prethodno je reµceno da je osnovna varijanta algoritma umetanjem e�kasna ako ulazniniz vec ima visok stepen ure�enosti. Algoritam Shell sort razdvaja poµcetni niz na grupetako �to se u svakoj grupi nalaze elementi koji su odvojeni jednakim razmakom, koji cebiti oznaµcen sa h1. Zatim se svaka grupa sortira posebno primjenom osnovne varijantesortiranja umetanjem, nakon µcega se dobija niz sa vecim stepenom ure�enosti u odnosuna poµcetni niz. U sljedecem koraku se uzima razmak h2 koji je manji od razmaka h1. Uovom koraku je smanjen broj grupa, ali svaka grupa ima veci broj elemenata. Grupe seponovo posebno sortiraju primjenom osnovne varijante algoritma sortiranja umetanjempa se dobija jo� veci stepen ure�enosti ulaznog niza. U sljedecim koracima se birajusve manji i manji razmaci, a postupak zavr�ava primjenom zavr�nog razmaka ht = 1�to zapravo znaµci da se u zadnjoj fazi svi elementi tretiraju kao jedna grupa. Drugimrijeµcima, u zadnjem koraku, kada je ulazni niz �vec gotovo sortiran�, primjenjuje se

85

Page 90: Algoritmi i programiranje

Procedura BinaryInsertionUlaz : n; fangIzlaz : Sortirani niz fangInicirati i; j;m; L;R; xZa svaki i = 1; Duzina [a]� 1; 1{

//Uzeti element nizax a [i]L 1;R 1// Odrediti lijeve i desne graniceDokVrijedi L < R raditi{

m = b(L+R) =2cAko je a [m] < x

{L m+ 1

}Inaµce

{R m

}}//Pretraµziti sortirani nizZa svaki j = i; R + 1;�1{

a [j] a [j � 1]}a [R] x

}

osnovna varijanta metoda umetanjem. U opisanim fazama algoritma sortiranja Shell sortkoristi niz razmaka h = [h1; h2; :::; ht�1] pri µcemu je hi > hi+1, i = 1; :::; t� 2.

Za razumljiviji opis ovog algoritma ce biti kori�ten konkretan primjer. Neka je zadataksortirati sljedeci niz brojeva:

28; 17; 10; 79; 13; 67; 23; 33; 12; 5; 9; 80; 86; 15; 59; 49; 64; 54; 36; 29

Po�to algoritam Shell sort poredi brojeve iz niza uzimajuci neki razmak, neka je u pr-voj fazi taj razmak 7 tj. h1 = 7. To znaµci da ce se porediti i me�usobno eventualnorazmjenjivati mjesta sljedeci brojevi: 28, 33 i 59 (jer su razmaknuti za 7 mjesta). Istotako, poredice se i eventualno me�usobno razmjenjivati mjesta brojevi 17,12 i 49 (jersu tako�er razmaknuti za 7 mjesta). Da bi ovaj proces bio jasnije obja�njen, moµze sekoristiti drugaµciji naµcin prikaza. Naime, ako je odabran razmak 7 onda se gornji poµcetniniz brojeva moµze prikazati sljedecom tabelom koja ima 7 kolona, pri µcemu svaka kolonasadrµzi elemente pojedine grupe koji se posebno sortiraju:

28 17 10 79 13 67 2333 12 5 9 80 86 1559 49 64 54 36 29

86

Page 91: Algoritmi i programiranje

Ovakav prikaz je napravljen samo u cilju vizueliziranja procesa pore�enja i sortiranjapojedinih grupa, koji se obavljaju u pojedinim fazama primjene algoritma Shell sort.Sada se sortira svaka kolona (grupa) posebno. Rezultirajuca tabela je:

28 12 5 9 13 29 1533 17 10 54 36 67 2359 49 64 79 80 86

Ova tabela se sada moµze prikazati u obliku jednodimenzionalnog niza, �to zapravo iodgovara stvarnom rasporedu elemenata u memoriji:

28; 12; 5; 9; 13; 29; 15; 33; 17; 10; 54; 36; 67; 23; 59; 49; 64; 79; 80; 86

Moµze se primijetiti da rezultirajuci niz u trenutnoj fazi sortiranja, kada je uzet razmak 7,ima veci stepen ure�enosti od poµcetnog niza. Vidljivo je pomjeranje elemenata sa vecimvrijednostima prema kraju niza i elemenata sa manjim vrijednostima prema poµcetku niza.Na primjer, element 29 sa zadnje pozicije se pomjerio na �esto mjesto, dok se, na primjer,element 36 sa predzadnje pozicije pomjerio na dvanaesto mjesto.

Postupak primjene algoritma Shell sort se nastavlja tako �to se sada uzme, na primjer,razmak h2 = 3. To znaµci da se ulazni niz u drugoj fazi za potrebe vizualizacije elemenatakoji se tretiraju kao posebne grupe moµze prikazati u obliku sljedece tabele sa 3 kolone:

28 12 59 13 2915 33 1710 54 3667 23 5949 64 7980 86

Opet se grupe (kolone) sortiraju posebno primjenom osnovne varijante sortiranja umetan-jem te se dobija sljedeca tabela :

9 12 510 13 1715 23 2928 33 3649 54 5967 64 7980 86

Gornja tabela zapravo prikazuje sljedeci niz:

9; 12; 5; 10; 13; 17; 15; 23; 29; 28; 33; 36; 49; 54; 59; 67; 64; 79; 80; 86

Rezultujuci niz ima jo�veci stepen ure�enosti u odnosu na niz u prethodnoj fazi. Naime,do�lo je do daljnjeg pomjeranja vecih brojeva prema kraju niza i manjih brojeva premapoµcetku niza. Rezultujuci niz ipak jo�nije sortiran, te je ostalo da se napravi jo�jedna fazanakon µcega ce niz biti konaµcno sortiran. Po�to je trenutni niz �skoro sortiran�, razumno jezapravo uzeti razmak h3 = 1 a to znaµci primijeniti osnovnu varijantu algoritma sortiranjaumetanjem, jer ce biti potreban mali broj pore�enja i premje�tanja s obzirom da je niz vec�skoro sortiran�. Dakle, primjenom algoritma sortiranja umetanjem s razmakom h3 = 1,dobija se rezultirajuci sortirani niz:

87

Page 92: Algoritmi i programiranje

5; 9; 10; 12; 13; 15; 17; 23; 28; 29; 33; 36; 49; 54; 59; 64; 67; 79; 80; 86

Algoritam za Shell Sort je u nastavku. U njemu je fHg niz razmaka koji se uzimaju nasvakom koraku. U na�em primjeru je H = f7; 3; 1g.

// Ulaz : Niz fag, fHg// Niz fHg je niz koraka za koje se obavlja sortiranjeZa i = 0 do Duzina [h]� 1 Raditi{

h H [i]Za j h do Duzina [a]� 1 Raditi{

priv a [j]k j � hSveDokJe (k � 0) & (a [k] > priv) Raditi{

a [k + h] a [k]k k � h

}a [k + h] priv

}}

Analiza ShellSort algoritma je postavila nekoliko veoma te�kih matematiµckih problemaod kojih neki jo�nisu rije�eni. Kao najbitnije, nije pokazano koja rastojanja daju najboljirezultat. Postoji zaµcu�ujuca µcinjenica : rastojanja ne smiju biti me�usobni mnoµzitelji.Ovo dozvoljava da se izbjegne pojava da se formiraju podnizovi koji se ne presijecaju.Stoga je interakcija dva niza poµzeljna �to je vi�e moguce.

Do sortiranog niza ce dovesti primjena bilo kojeg niza razmaka H = fh0; h1; :::; ht�1gtakvih da je :

� hi > hi+1, i = 0; 1; 2; :::; t� 2

� ht�1 = 1

Knut je predloµzio niz 1; 4; 13; 40; ::: gdje je hk�1 = 3 � hk + 1, ht = 1, t = blog3 nc � 1.Drugi prijedlog je niz 1; 3; 7; 15; ::: gdje je hk�1 = 2 � hk + 1, ht = 1, t = blog2 nc � 1.Analiza pokazuje da su u posljednjem sluµcaju rezultati proporcionalni sa n1:2. Mada jeova vrijednost bitno bolja od n2 to ne znaµci da se ne mogu praviti nova pobolj�anja.

10.2.3 Sortiranje putem direktne podjele (Selection sort)

Jedan od nedostataka algoritma Insertion sort je to �to zahtijeva veliki broj operacijapomjeranja unutar sekvence. Primjer jednostavnog algoritma sortiranja koji je oblikovantako da se bitno smanjuje broj premje�tanja je Selection sort (sortiranje selekcijom) al-goritam. Kod ovog algoritma se pomjeranje podataka pri sortiranju obavlja direktno nanjihovu konaµcnu poziciju u sortiranom nizu.

Sliµcno kao i kod algoritma Insertion sort, i kod algoritma Selection sort se u procesusortiranja razlikuju sortirani i nesortirani dio niza. Na poµcetku svi elementi niza

88

Page 93: Algoritmi i programiranje

A = fa0; a1; :::ai; ai+1; :::; an�1g

pripadaju nesortiranom dijelu, a zatim se sekvencijalnim pretraµzivanjem pronalazi na-jmanji element, koji se zatim premje�ta na prvu poziciju, dok se prethodni element sprve pozicije premje�ta na poziciju prona�enog minimalnog elementa. Na taj naµcin jeu prvom koraku oblikovan sortirani dio niza koji µcini element a0 dok ostali elementiniza fa1; a2; :::; an�1g µcine nesortirani dio niza. Poslije nekog (i � 1)-og koraka u sorti-ranom dijelu niza su elementi a0; a1; :::; ai�2 dok su u nesortiranom dijelu niza elementiai�1; ai; :::; an�1. U sljedecem i-tom koraku se u nesortiranom dijelu niza pronalazi naj-manji element pa se taj element pozicionira na prvo mjesto u neure�enom dijelu niza ato je pozicija i � 1. U tom trenutku sortirani dio niza je a0; a1; :::; ai�1 a nesortirani dioniza je ai; ai+1; :::; an�1. Postupak sortiranja se zavr�ava kada u nesortiranom dijelu napoziciji n� 1 ostane samo jedan element, koji zapravo ostaje na toj poziciji.

Vaµzno je primijetiti da se pore�enje elemenata kod sortiranja selekcijom obavlja nadelementima nesortiranog dijela niza, za razliku od sortiranja umetanjem, kod kojeg seusporedba elemenata obavlja nad elementima sortiranog dijela niza. Ova razlika ima zaposljedicu da postupak sortiranja selekcijom ne moµze zapoµceti sve dok nisu prisutni svielementi koji se trebaju sortirati, �to nije sluµcaj kod sortiranja umetanjem, kod kojegelementi koji se sortiraju mogu pristizati jedan za drugim.

Algoritam za sortiranje selekcijom je ilustriran na narednoj slici za niz od 6 elemenata.

0 1 2 3 4 54 11 2 9 3 102 11 4 9 3 102 11 4 9 3 102 3 4 9 11 102 3 4 9 11 102 3 4 9 11 102 3 4 9 11 102 3 4 9 11 102 3 4 9 11 102 3 4 9 10 11

Zaokruµzena je pozicija niza za koju se u procesu sortiranja u pojedinim fazama selek-cionira minimalni element iz nesortiranog dijela niza, dok je podvuµcena pozicija na kojojje prona�en minimalni element u nesortiranom dijelu niza. U prvom koraku je oznaµcenaprva pozicija sa indeksom 0 na kojoj se nalazi element 4 te je prona�en minimalni element2 na poziciji s indeksom 2. U sljedecem koraku elementi 4 i 2 mijenjaju pozicije te se unizu razlikuju sortirani dio niza koji se sastoji samo od elementa 2 i nesortirani dio nizakoji ukljuµcuje sve ostale elemente. U sljedecem koraku je oznaµcena pozicija s indeksom1 na kojoj se nalazi element 11 i prona�en je minimalni element 3 u nesortiranom dijeluniza, pa elementi 11 i 3 mijenjaju pozicije u nizu. U tom trenutku sortirani dio niza µcineelementi 2 i 3 a elementi 4, 9, 11 i 10 µcine nesortirani dio niza.

Ovaj postupak se ponavlja za sve ostale pozicije i (i = 2; 3; :::; n � 2), sve dok se napretposljednje mjesto u nizu ne umetne element 10. Zadnji preostali element 11 zauzimajedinu mogucu (zadnju) poziciju, pa se postupak zavr�ava selekcioniranjem elementa zapoziciju i = n� 2.

89

Page 94: Algoritmi i programiranje

// Algoritam : Selection sortZa i 0 do Duzina [a]� 2 raditi{

najm a [i]pnajm iZa j i+ 1 do Duzina [a]� 1 Raditi{

AkoJe (a [j] < najm) tada{

najm a [j]pnajm j

}}a [pnajm] a [i]a [i] najm

}

Algoritam za sortiranje selekcijom je opisan procedurom na dijagramu. Ulazni argumentu proceduru je niz a koji se sortira. Vanjska for petlja omogucuje ponavljanje pos-tupka pronalaµzenja minimalnog elementa u nesortiranom dijelu niza za svaku od lokacijai = 0; 1; 2; :::; Duzina [a] � 2. Za zadnju lokaciju Duzina[a] � 1 nije potrebno ponavljatipostupak, jer se u tom sluµcaju nesortirani dio niza sastoji samo od jednog elementa, paje taj podniz sortiran sam po sebi. U svakoj i-toj iteraciji se prvo inicijaliziraju vrijed-nosti privremeno minimalnog elementa najm i indeksa njegove pozicije pnajm a zatim seu sklopu unutarnje for petlje izvode iteracije kojima se u nekom j-tom prolazu u nesor-tiranom dijelu niza a, kojeg µcine elementi na pozicijama i do Duzina[a] � 1, pronalaziminimalni element. Na kraju svake i-te iteracije vanjske for petlje element na pozicijipnajm i prvi element a[i] iz nesortiranog dijela niza izmjenjuju svoje pozicije.

Algoritam sortiranja selekcijom je speci�µcan po tome �to je i broj pridruµzivanja i brojpore�enja uvijek isti, bez obzira na duµzinu niza. Algoritam se izvr�ava u n � 1 prolazakroz nesortirani dio niza, a svaki prolaz ima jednu zamjenu pozicija koja ukljuµcuje 3operacije pridruµzivanja. To znaµci da je ukupan broj operacija pridruµzivanja :

Ta (n) = 3 � (n� 1)

Dakle, operacije pridruµzivanja kod algoritma sortiranja selekcijom imaju sloµzenost O(n),�to je znatno pobolj�anje u odnosu na algoritam sortiranja umetanjem kada su u pitanjuoperacije pridruµzivanja. U prvom prolazu ima n � 1 operacija pore�enja, u drugomprolazu ih ima n � 2 a u nekom i-tom prolazu broj pore�enja je n � i. Dakle, ukupanbroj pore�enja je:

Tc (n) =n�1Xi=1

(n� i) = n (n� 1)2

Broj zamjena je minimalno Mmin = 3 � (n� 1) u sluµcaju da su kljuµcevi odmah sortirania maksimalno Mmax = (n

2=4) + 3 � (n� 1) ako su poµcetni kljuµcevi poredani opadajucimredom.

90

Page 95: Algoritmi i programiranje

Za proraµcun prosjeµcnog vremena trajanja uzima se da je oµcekivani broj premje�tanjajednak sumi Hn = 1 + 1=n + 1=2 + ::: + 1=n. Pri tome su 1=i vjerovatnoce da je i-tielement manji od prethodnih i� 1 elemenata. Ova vrijednost se moµze iskazati i sa

Hn = lnn+ g + 1=2n� 1=12n2 + :::

gdje je g = 0; 577216::: Eulerova konstanta. Za dovoljno veliko n se mogu zanemaritirazlomci u nastavku pa je prosjeµcan broj premje�tanja na i-tom koraku jednak Fi =ln i+ g + 1. Prosjeµcan broj premje�tanja, u oznaci Mavg, je suma svih Fi odnosno

Mavg = n � (g + 1) +nXi=1

ln i

Ova se suma aproksimira integralom

nZ1

lnxdx = x � (lnx� 1)jn1 = n � (lnn� 1)� n+ 1

�to na kraju daje Mavg = n � (n ln+g). Odavdje se izvodi zakljuµcak da je ovaj algoritampreporuµcljiviji u odnosu na sortiranje umetanjem. Ako su kljuµcevi sortirani ili skorosortirani insertovanje je ne�to bolji algoritam.

10.2.4 Sortiranje putem zamjene (Bubble sort)

Ovaj algoritam se zasniva na pore�enju i zamjeni mjesta parova susjednih elemenata iobavljanja ovog postupka dok se ne sortiraju svi elementi. Kao i u metodi selekcije pro-lazi po nizu se ponavljaju pri µcemu se svaki put najmanji element preostalog dijela nizapremje�ta na lijevi kraj niza. Ako se nizovi posmatraju vertikalno a ne horizontalno ele-mente je moguce interpretirati kao mjehure, pri µcemu "teµzina" svakog elementa odgovaranjegovom kljuµcu. Na taj naµcin se svaki element poput mjehura podiµze do pozicije kojamu pripada. Ovaj metod je stoga poznat pod nazivom BubbleSort.

Bubble sort je jedan od najjednostavnijih algoritama sortiranja. Ovaj algoritam radi takoda vi�e puta sekvencijalno prolazi kroz niz, pri µcemu se pri svakom prolazu upore�uje svakielement sa elementom koji se nalazi neposredno iza njega. Ako se nakon pore�enja utvrdida susjedni elementi nisu u µzeljenom poretku, onda elementi me�usobno izmjenjuju svojepozicije, �to ima za posljedicu da se prema kraju niza postepeno pomjeraju elementi savecim vrijednostima ako je µzeljeni poredak sortiranja rastuci, ili da se prema kraju nizapostepeno pomjeraju elementi sa manjim vrijednostima ako je µzeljeni poredak sortiranjaopadajuci.

U prvom prolazu kroz niz na zadnjemmjestu ce se sigurno pozicionirati najveci (najmanji)element. Na taj naµcin sortirani dio niza µcini element a [n� 1] a nesortirani dio niza µcineelementi

a [0] ; a [1] ; :::; a [n� 2]

91

Page 96: Algoritmi i programiranje

U sljedecem, drugom prolazu, porede se elementi na pozicijama 0 do n�2, te ce se nakontog prolaza na poziciju s indeksom n�2 sigurno pozicionirati najveci element iz trenutnonesortiranog dijela niza a[0::n�2]. Opcenito, prije nekog i-tog prolaza, za i > 1, sortiranidio niza µcine elementi a [n� i+ 1] ; a [n� i+ 2] ; :::; a [n� 1] dok nesortirani dio niza µcineelementi a[0]; a[1]; : : : ; a[n � i]. U nekom i-tom prolazu pore�enja i izmjene pozicijasusjednih elemenata ce na (n� i)-tu poziciju doci najveci element iz nesortiranog dijelaniza a[0::n� i]. Sekvencijalni prolazi kroz niz se nastavljaju sve (n� 1)-og prolaza krozniz odnosno sve dok se na drugu poziciju u nizu s indeksom 1 ne pozicionira odgovarajucielement. Naime, n-ti prolaz kroz niz nije ni potreban jer je ostao samo jedan element isamo jedna dostupna pozicija s indeksom 0 pa je praktiµcno niz nakon (n� 1)-og prolazavec sortiran.

Algoritam Bubble sort je ilustriran po koracima na slici za jedan primjer poµcetnog ne-sortiranog niza od 6 elemenata. Algoritam ukljuµcuje n � 1 prolaza kroz nesortirani dioniza, pri µcemu svaki prolaz osigurava smje�tanje najveceg elementa iz nesortiranog dijelana zadnju poziciju tog dijela niza. Ta pozicija je na slici za svaki prolaz istaknuta linijoms donje strane. Okvirom su oznaµceni elementi koji se nalaze u sortiranom dijelu niza,odnosno, elementi koji se nalaze na svojim konaµcnim pozicijama. U prvom koraku suoznaµcene prva pozicija sa indeksom 0 na kojoj se nalazi element 10 i druga pozicija saindeksom 1 na kojoj se nalazi element 11. Po�to su elementi 10 i 11 u µzeljenom poretku,ne dolazi do zamjene njihovih pozicija. U sljedecem koraku se porede elementi 11 i 3.Buduci da se ovi elementi ne nalaze u µzeljenom poretku, dolazi do zamjene njihovih pozi-cija. Prvi prolaz kroz niz se nastavlja sve dok varijabla j ne dostigne vrijednost j = 5.Nakon prvog prolaza ce se najveci element 11 nalaziti na svojoj konaµcnoj poziciji s in-deksom i = 5. U ovom trenutku sortirani dio niza µcini jedino element 11 dok svi ostalielementi predstavljaju nesortirani dio niza.

U drugom prolazu kroz niz (i = 4) na poziciju s indeksom 4 ce se pozicionirati najvecielement iz nesortiranog dijela niza a to je element 10. Nakon drugog prolaza sortiranidio niza µcine elementi 10 i 11, a nesortirani dio niza µcine elementi 3, 4, 9 i 2. Opisanipostupak se ponavlja za sve ostale vrijednosti varijable i (i = 3; 2; 1), sve dok se na drugomjesto u nizu ne umetne element 3. Jedini preostali element u nesortiranom dijelu nizaje element 2, koji na kraju zauzima jedinu slobodnu poziciju s indeksom 0. Svi koracialgoritma Bubble sort za ovaj primjer su tako�er ilustrirani na slici.

0 10 10 10 10 10 10 10 3 3 3 3 3 3 3 3 3 21 11 11 3 3 3 3 3 10 4 4 4 4 4 4 4 2 32 3 3 11 4 4 4 4 4 10 9 9 9 9 2 2 4 43 4 4 4 11 9 9 9 9 9 10 2 2 2 9 9 9 94 9 9 9 9 11 2 2 2 2 2 10 10 10 10 10 10 105 2 2 2 2 2 11 11 11 11 11 11 11 11 11 11 11 11

a b c d e f g h i j k l m n o p q

Ovaj algoritam je prikazan u obliku procedure u nastavku. Ulaz u proceduru je niz a kojise sortira. Vanjskom for petljom se implementira Duzina[a]� 1 prolaza kroz nesortiranidio niza, µcime se osigurava smje�tanje najveceg elementa na zadnju poziciju tog dijelaniza. Unutarnjom for petljom se implementira jedan prolaz u kojem se nakon pore�enjasusjednih elemenata i utvr�ivanja da nisu u µzeljenom poretku izmjenjuju njihove pozicije.

92

Page 97: Algoritmi i programiranje

Za 1 Duzina [a]� 1 do 1 raditi{

Za j 1 do i raditi{

AkoJe (a [j � 1] > a [j]) tada{

a [j � 1]$ a [j]}

}}

Pretpostavimo da je ulazni niz a vec sortiran. U toj situaciji ce broj potrebnih operacijaostati opet isti, bez obzira na poµcetnu ure�enost niza. Me�utim, da bi se u odre�enojmjeri povecala e�kasnost, moguce je oblikovati takvu varijantu algoritma Bubble sortkoja ce detektirati prolaz kroz niz u kojem nije do�lo ni do jedne zamjene pozicija, �toje zapravo znak da je niz vec sortiran. Nakon takve detekcije proces sortiranja se moµzeprekinuti da bi se izbjegle nepotrebne operacije pore�enja. Postoji mogucnost da je samojedan dio niza vec sortiran pa se e�kasnost moµze povecati i tako �to ce se identi�ciratitaj dio niza kojeg u sljedecoj iteraciji nece biti potrebno prolaziti. Detekciju prolaza krozniz u kojem nije do�lo ni do jedne zamjene pozicija, a isto tako i identi�ciranje dijelaniza koji je vec sortiran, moµze se napraviti tako da se u svakom prolazu kroz niz zapamtipozicija sa najvecim indeksom j na kojoj je izvr�ena zamjena. Neka se, na primjer, sortiraniz koji ima n = 9 elemenata, te da je nakon treceg prolaza raspored elemenata kao naslici.

0 1 2 3 4 5 6 7 8i = 5; j = 1; p = 1 27 24 17 28 31 33 35 38 43 ai = 5; j = 2; p = 2 24 27 17 28 31 33 35 38 43 bi = 5; j = 3; p = 2 24 17 27 28 31 33 35 38 43 ci = 5; j = 4; p = 2 24 17 27 28 31 33 35 38 43 di = 5; j = 5; p = 2 24 17 27 28 31 33 35 38 43 e

U µcetvrtom prolazu varijabla i ima vrijednost 5 dok se vrijednost varijable j mijenja od1 do 5. U ovom µcetvrtom prolazu zadnja izmjena je izvr�ena kada je vrijednost varijablej bila 2 �to zapravo znaµci da su elementi na pozicijama s indeksom 2, 3, 4 i 5 vec upravilnom poretku. Pozicija zadnje zamjene je zapamcena u varijabli p. Nadalje, to znaµcida u sljedecem prolazu nece biti potrebno porediti elemente koji se nalaze na pozicijamas indeksom vecim ili jednakim od p = 2 pa se zapravo nakon µcetvrtog prolaza na svojimkonaµcnim pozicijama ne nalaze samo 4 vec 7 elemenata. Ako je nakon nekog od prolazakroz niz vrijednost varijable p = 0, to je znak da je µcitav preostali dio niza zapravo vecsortiran, pa se proces sortiranja moµze prekinuti.

Prethodno opisana mogucnost pobolj�anja je data u narednom algoritmu. Varijabla p sekoristi da se zapamti pozicija iza koje u nekom prolazu kroz niz nije bilo izmjene pozicija.Prolazi se izvode u sklopu repeat-until petlje, te pri svakom novom prolazu se vrijednostvarijable p postavlja na nulu. Ako se dogodi da u nekom prolazu vec postoji sortiranporedak elemenata tada ce i na kraju prolaza biti p = 0 pa ce algoritam zavr�iti svojrad. Unutarnjom for petljom ostvaruje se jedan prolaz kroz nesortirani dio niza ali samo

93

Page 98: Algoritmi i programiranje

do pozicije i = p � 1 jer na pozicijama iznad p nije bilo izmjena, pa je taj dio niza vecsortiran.

p Duzina [a]Ponavljati{

i p� 1p 0Za j 1 do i raditi{

AkoJe (a [j � 1] > a [j]) tada{

a [j � 1]$ a [j]p

}}

}SveDokNije(p = 0)

Treca mogucnost pobolj�anja je da se premje�tanje vr�i naizmjeniµcno u oba pravca takoda se u jednom smjeru premje�taju elementi na "lak�e" pozicije a u obratnom na "teµze"pozicije. Ilustracija ovog algoritma, pod nazivom ShakerSort je na tabeli 11.

L 2 3 3 4 4R 8 8 7 7 4Smjer " # " # " # "

44 06 06 06 06 06 06 0655 44 44 12 12 12 12 1212 55 12 44 44 18 18 1842 12 42 42 42 44 44 4294 42 55 55 55 42 42 4418 94 18 18 18 55 55 5506 18 67 67 67 67 67 6767 67 94 94 94 94 94 94

Pseudokod za ShakerSort algoritam je dat na narednom algoritmu.

Analiza BubbleSort algoritma pokazuje da je u osnovnoj verziji broj pore�enja jednak

C = (n2 � n) =2

dok je minimalni, prosjeµcni i maksimalni broj zamjena (premje�tanja) jednak

Mmin = 0; Mavg = 3 � (n2 � n) =4; Mmax = 3 � (n2 � n) =2

Analiza pobolj�anih verzija, posebno ShakerSort-a, je dosta sloµzena. Minimalni brojpore�enja je Cm = n�1. Knuth smatra da je prosjeµcan broj prolaza u pobolj�anom Bub-bleSort algoritmu proporcionalan sa n�k1

pn a prosjeµcan broj pore�enja proporcionalan

sa (1=2) (n2 � n (k2 + lnn)). Predloµzena pobolj�anja ne utiµcu na broj premje�tanja, oni

94

Page 99: Algoritmi i programiranje

Procedura ShakerSortUlaz : Niz fangIzlaz : Sortiran niz fangInicirati j; k; L;R; xL 2; R n; k nPonavljati{

Za j = R;L;�1{

Ako je a [j � 1] > a [j] tada{

x a [j � 1] ; ina [j � 1] a [j]a [j] xk 1

}}L k + 1Za j = L;R; 1{

Ako je a [j � 1] > a [j] tada{

x a [j � 1] ;a [j � 1] a [j]a [j] xk 1

}}R k � 1

}SveDok vrijedi L > R

jedino skracuju nepotrebna binarna pore�enja. Naµzalost, zamjena dva elementa je mnogoµce�ca operacija tako da se ne dobiju oµcekivana pobolj�anja. Pokazuje se da je BubbleSortpo karakteristikama negdje izme�u sortiranja umetanjem i sortiranja zamjenom. Fak-tiµcki, BubbleSort ne donosi ni�ta novo osim privlaµcnog naziva. ShakerSort se uspje�nokoristi u sluµcajevima kada je niz dosta sortiran, �to se u praksi dosta rijetko de�ava.

Moguce je pokazati da je prosjeµcno rastojanje za koje se pojedini element pomjera jed-nako n=3 "mjesta". Svi strogi naµcini sortiranja faktiµcki element na pojedinom korakupomjeraju za jednu poziciju �to je razlog da trebaju O (n2) takvih prolaza. U skladu satim, pobolj�anja se mogu uvesti ako se usvoji princip da se vr�i razmjena elemenata navecem rastojanju.

U nastavku je pregled pobolj�anja svake od navedene stroge metode sortiranja.

95

Page 100: Algoritmi i programiranje

10.3 Pobolj�ane metode (sloµzenost n log n)

10.3.1 Merge sort

Algoritam Merge sort koristi strategiju �podijeli-pa-vladaj� kod koje se do rje�enja nekogproblema dolazi smanjivanjem na manje dijelove sve dok se on ne reducira na tzv. os-novni sluµcaj koji se moµze rije�iti direktno. Ovaj algoritam se temelji na ideji da se izsortiranih podnizova na e�kasan naµcin mogu spajanjem tih podnizova dobiti novi sorti-rani podnizovi. Prije faze spajanja sortiranih podnizova, koja zapravo predstavlja drugufazu algoritma, Merge sort u svojoj prvoj fazi dijeli poµcetni nesortirani niz na manje imanje podnizove. Minimalni niz je niz sa samo jednim elementom, pa je takav niz sampo sebi vec sortiran. Zato algoritam Merge sort dijeli poµcetni nesortirani niz na manje imanje dijelove, sve dok se ne dobiju nizovi sa samo jednim elementom. Nakon te prve fazedijeljenja, slijedi druga faza spajanja sortiranih podnizova u kojoj se od manjih sortiranihpodnizova njihovim objedinjavanjem stvaraju sve veci i veci sortirani podnizovi, sve dokse na kraju ove faze ne kreira cijeli sortirani niz.

Merge sort se moµze realizovati kao rekurzivni algoritam, pri µcemu se na svakom nivourekurzije obavljaju sljedeci koraci:

� dijeljenje poµcetnog nesortiranog niza na dva podniza od kojih svaki ima po n=2elemenata;

� rekurzivno sortiranje dobijena dva podniza koristeci Merge sort;

� spajanje sortiranih podnizova.

U nastavku je procedura MergeSort koja predstavlja rekurzivnu implementaciju algo-ritma.

// Procedura Merge SortMergeSort(a; l; u)AkoJe (u > l) tada{

p b(l + u� 1) =2cq p+ 1MergeSort (a; l; p)MergeSort (a; q; u)Merge (a; l; p; q; u)

}

Ulazni argument a predstavlja niz koji se treba sortirati. Argument l oznaµcava indeksprve pozicije a argument u oznaµcava indeks zadnje pozicije podniza a [l::u] koji se sor-tira. Postupak sortiranja se ostvaruje tako �to se ulazni podniz a [l::u] dijeli na dvapodniza a zatim se proces nastavlja rekurzivnim pozivima procedure MergeSort kojikao ulazne nizove imaju podnizove nastale dijeljenjem. Dijeljenje ulaznog niza na dvapodniza se ostvaruje izraµcunavanjem vrijednosti varijabli p i q. Varijabla p predstavljaindeks zadnje pozicije prvog podniza, a vrijednost varijable q oznaµcava prvu poziciju dru-gog podniza. Na taj naµcin ulazni niz a [l::u] je podijeljen na podnizove a [l::p] i a [q::u].

96

Page 101: Algoritmi i programiranje

U proceduri MergeSort se nalaze dva rekurzivna poziva ove procedure. Prvim pozivomMergeSort (a; l; p) proces se nastavlja nad prvom polovinom podijeljenog niza, dok sepozivom MergeSort (a; q; u) proces nastavlja nad drugom polovinom podijeljenog niza.Nesortirani niz se rekurzivno dijeli na podnizove, sve dok se ne dobiju podnizovi kojisadrµze samo jedan element, tj. dok vrijedi u > l. Nakon povratka iz obje ove proce-dure na svakom nivou rekurzije se pozivom procedure Merge obavlja spajanje sortiranihpodnizova. Taj postupak, opisan procedurom Merge, je dat kasnije. Na primjer, nakonpovratka iz obje procedureMergeSort na zadnjem nivou rekurzije, kada podnizovi nastalidijeljenjem imaju veliµcine 1 poziva se procedura Merge za spajanje tih podnizova da bise kreirao niz veliµcine 2. Na sljedecem, vi�em nivou, su dva sortirana niza veliµcine 2 kojice se spojiti u sortirani podniz veliµcine 4. Ovaj proces se nastavlja sve dok se ne do�e doprvog poziva, koji spaja dva sortirana podniza koji sadrµze po pola elemenata poµcetnognesortiranog niza.

Merge Sort - ilustracija

Na slici je ilustriran proces sortiranja algoritmom Merge sort za niz sa 13 elemenata. Al-goritam u prvoj fazi dijeli poµcetni niz na polovine rekurzivnim procesom sve dok rezultira-juci podnizovi ne sadrµze samo jedan element. Nakon toga se prelazi u drugu fazu, u kojojnakon zavr�avanja rekurzivnih poziva procedure MergeSort na svakom nivou rekurzijeimamo procese spajanja podnizova. Kretanjem prema prvom rekurzivnom pozivu pod-nizovi se spajaju, te se oblikuju sve veci i veci sortirani podnizovi.

Kljuµcni koraci u algoritmu Merge sort su koraci spajanja dva sortirana podniza. Neka sunizovi b [0::5] i b [6::12] sortirani, naprimjer, u rastucem poretku. Da bi ta dva sortiranapodniza bila spojena u jedan sortirani niz a prvo treba odrediti najmanji element iz obapodniza. Sigurno je da je najmanji element ili b [0] ili b [6]. Isto tako, najveci element jeili b [5] ili b [12]. Operacija spajanja poµcinje tako da se u a [0] smjesti manji od elemenatab [0] ili [6]. Neka je b [0] < b [6] pa je tada a [0] = b [0]. Nisu raspore�eni elementi b [1::5] ib [6::12]. U a [1] se treba smjestiti manji od elemenata na prvim pozicijama neraspore�enihdijelova podnizova b [1::5] i b [6::12]. Dakle, u a [1] se treba smjestiti manji od elemenata:

97

Page 102: Algoritmi i programiranje

b [1] ili b [6]. Neka je manji element b [1] pa je a [1] = b [1]. Sada su neraspore�eni elementib [2::5] i b [6::12].

// Procedura MergeMerge (a; l; p; q; u)i 0j q � lk lZa (m 0) do u� l raditi{

b [m] a [l +m]}SveDokJe (i � p� l&j � u� l) raditi{

AkoJe (b [i] < b [j]) tada{

a [k] b [i]i i+ 1

}Inaµce{

a [k] [j]j j + 1

}k k + 1

}SveDokJe (i � p� 1) raditi{

a [k] b [i]k k + 1i i+ 1

}SveDokJe (j � u� l) raditi{

a [k] b [j]k k + 1j j + 1

}

Moµze se zakljuµciti da za formiranje sortiranog niza a treba mehanizam koji ce omogucitioznaµcavanje raspore�enih i neraspore�enih elemenata iz podnizova b [0::5] i b [6::12]. Ovajmehanizam pracenja se realizuje uvo�enjem dva indeksa za spomenute podnizove, kojice oznaµcavati poziciju u oba podniza na kojoj se trenutno nalaze kandidati za minimalnielement od preostalih neraspore�enih elemenata. Neka je i indeks za pracenje podnizab [0::5] a j indeks za pracenje podniza b [6::12]. Svakim odre�ivanjem minimalnog ele-menta taj element se smje�ta u niz a a indeks pridruµzen podnizu koji je u tom korakusadrµzavao minimalni element se povecava za 1. Dakle, preostali neraspore�eni elementi u

98

Page 103: Algoritmi i programiranje

podnizu b [0::5] ce biti elementi b [i::5] a u podnizu b [6::12] ce biti neraspore�eni elementib [j::5]. U jednom trenutku ce se rasporediti svi elementi iz jednog od podnizova pa ce sepreostali elementi iz podniza u kojem je ostalo jo�neraspore�enih elemenata jednostavnonadovezati na spojeni niz. Postupak spajanja je opisan procedurom Merge.

Ulazni argument a oznaµcava niz u kojem su smje�teni podnizovi. Argumenti l i q oz-naµcavaju indekse poµcetnih pozicija prvog i drugog podniza, respektivno. Argumenti pi u oznaµcavaju indekse zadnjih pozicija prvog i drugog podniza, respektivno. Varijablai u proceduri Merge je varijabla pridruµzena prvom podnizu i oznaµcava indeks pozicijeiznad koje su jo� neraspore�eni elementi iz prvog podniza. Varijabla j je pridruµzenadrugom podnizu i oznaµcava indeks pozicije iznad koje su jo� neraspore�eni elementi izdrugog podniza. U proceduri Merge se koristi i privremeni niz b u kojem se privremenosmje�taju sortirani podnizovi koji se trebaju spojiti. Varijabla k oznaµcava indeks pozicijeu rezultirajucem nizu a na koju ce se smjestiti trenutno odre�eni minimalni element izsortiranih podnizova.

Iz algoritma se vidi da je na prvom nivou rekurzije za oblikovanje konaµcnog sortiranogniza potrebno jo�spojiti podnizove b [0::6] i b [6::12]. Algoritam spajanja Merge ce bitiilustrovan za sluµcaj spajanja na prvom nivou rekurzije, na sljedecoj tabeli.

0 1 2 3 4 5 6 7 8 9 10 11 12Niz B 4 11 16 18 20 25 5 7 10 14 28 32 35 ai = 0; j = 6; k = 0 4 bi = 1; j = 7; k = 1 4 5 ci = 1; j = 7; k = 2 4 5 7 di = 1; j = 8; k = 3 4 5 7 10 ei = 1; j = 9; k = 4 4 5 7 10 11 fi = 2; j = 9; k = 5 4 5 7 10 11 14 gi = 2; j = 10; k = 6 4 5 7 10 11 14 16 hi = 3; j = 10; k = 7 4 5 7 10 11 14 16 18 ii = 4; j = 10; k = 8 4 5 7 10 11 14 16 18 20 ji = 5; j = 10; k = 9 4 5 7 10 11 14 16 18 20 25 ki = 5; j = 10; k = 10 4 5 7 10 11 14 16 18 20 25 28 li = 5; j = 11; k = 11 4 5 7 10 11 14 16 18 20 25 28 32 mi = 5; j = 12; k = 12 4 5 7 10 11 14 16 18 20 25 28 32 35 n

Varijabla i = 0 na poµcetku procesa predstavlja indeks pozicije od koje poµcinje prvipodniz a varijabla j = 6 oznaµcava indeks pozicije od koje poµcinje drugi podniz. Varijablak oznaµcava poziciju u rezultirajucem nizu a na koju se u nekom od pojedinih korakaspajanja treba smjestiti manji od elemenata b [i] ili b [j]. Ako je manji element b [i] tadase u rezultirajuci niz a na poziciju k smje�ta taj element a indeks i povecava. Tada podniz[i::5] predstavlja trenutno neraspore�ene elemente iz prvog podniza.

Ako se utvrdi da je manji element b [j] tada se u rezultirajuci niz a na poziciju k smje�ta tajelement pa se povecava indeks j. Tada podniz b [j::12] predstavlja trenutno neraspore�eneelemente iz drugog podniza. Nakon svakog smje�tanja elementa u rezultirajuci niz a,inkrementira se varijabla k. Varijable i i j inicijalno imaju vrijednosti i = 0, j = 6,k = 0 (b). Pore�enjem elemenata b [0] i b [6] vidi se da je manji element b [0] = 4 pase taj element u nizu a smje�ta na poziciju k = 0, a[0] = 4. Po�to je u ovom koraku

99

Page 104: Algoritmi i programiranje

izabran element iz prve polovine, inkrementira se varijabla i kao i varijabla k, koja seinkrementira u svakom pojedinom koraku smje�tanja elemenata u rezultirajuci niz a. Uovom trenutku vrijednosti varijabli su: i = 1, j = 6, k = 1. U sljedecem koraku se izabiremanji od elemenata b [1] i b [6]; vidi se da je manji element b [6] = 5 pa se taj element unizu a smje�ta na poziciju k = 1, a [1] = 5 (c). Na tabeli su ilustrovani i ostali koracispajanja podnizova. U koraku k svi elementi iz prvog podniza (b[0::5]) su vec raspore�eniu rezultirajuci niz a pa je u nastavku algoritamskog procesa potrebno samo da se preostalielementi (b[10::12]) jednostavno dodaju u rezultirajuci niz a (l do n).

10.3.2 Quick sort

Ovaj sort radi rekurzivno tako da se iz niza najprije selektira "pivot vrijednost". Zatimse niz dijeli na elemente koji su manji i koji su veci od pivota a zatim se rekurzivnosortira svaki od dijelova. Za QuickSort se, generalno, smatra da je najbrµzi od algoritamasortiranja (na modernim ma�inama). Jedno od obja�njenja je da unutra�nja petlja poredielemente sa jednom vrijednosti pivota koja je pohranjena u registru za brz pristup. Drugialgoritmi porede dva elementa niza. Ovo se naziva algoritmom lokalnog sortiranja jer nekoristi drugi niz za pohranu. Nije stabilan. Postoji stabilna verzija QuickSort algoritmaali ona nije lokalna. Ovaj algoritam je �(n log n) u oµcekivanom i �(n2) u najgoremsluµcaju. Ako je implementiran prikladno, vjerovatnoca da ce algoritam trajati asimptotskiduµze (pod pretpostavkom da je pivot odabran sluµcajno) je ekstremno mala za veliko n.

Algoritam Quick sort tako�er koristi strategiju �podijeli, pa vladaj�. Ulazni niz se dijelina dva dijela tako �to se taj niz reorganizira tako da su svi elementi u prvom donjemdijelu manji od svih elemenata u drugom gornjem dijelu niza. Ta dva dijela nakonreorganizacije su nesortirana i razdvojena elementom koji se naziva pivot i koji se nalazina nekoj poziciji j. Dakle, donji dio µcine elementi koji imaju vrijednost manju ili jednakuvrijednosti pivota (a [i] � pivot, i = 0; 1; : : : ; j � 1) a gornji dio µcine elementi koji imajuvrijednost vecu ili jednaku vrijednosti pivota (a[i] � pivot, i = j + 1; j + 2; : : : ; n � 1).Moguci su razliµciti naµcini izbora pivota. Na primjer, pivot se moµze napraviti tako dase uzme prvi element niza koji se dijeli, mada postoje i e�kasniji naµcini. Idealno, pivotelement bi trebao dijeliti niz na dva podniza sa jednakim brojem elemenata. Zbog naµcinana koji je ulazni niz reorganiziran moµze se zakljuµciti da je pivot element pozicioniran nasvoju konaµcnu poziciju j te se u daljnjem postupku vi�e nece pomjerati. Nadalje, moµzese zakljuµciti da se sortiranje moµze nastaviti tako da se isti algoritam rekurzivno primijenina dobijena dva dijela ulaznog niza. Rekurzivni postupak se nastavlja sve dok se nepostigne da rezultirajuci dijelovi imaju samo jedan element. Zavr�etkom rekurzivnogpostupka dobiva se sortirani niz.

Kljuµcni dio u algoritmu Quick sort je naµcin reorganizacije niza na dvije particije odvojenepivotom, bez kori�tenja dodatnog pomocnog memorijskog prostora. Taj naµcin je opisanfunkcijom Particija u tabeli. Funkcija Particija vraca indeks pozicije na kojoj je sm-je�ten pivot. Neka se kao pivot koristi prvi element u nizu. U primjeru na tabeli za pivotse uzima element 42 (oznaµcen tankom donjom crtom). Funkcijom Particija potrebno jereorganizirati niz tako da se prona�e odgovarajuca pozicija za pivota te da svi elementimanji od njega budu na pozicijama ispred njega a svi veci elementi da budu na pozicijamaiza njega. Na tabeli p oznaµcava poziciju elemenata koji se trenutno porede sa pivotom.Kada se prona�e prvi element veci od pivota, tada se za oznaµcavanje pozicija elemenatakoji se trenutno porede sa pivotom koristi oznaka i. Te pozicije su na tabeli istaknute

100

Page 105: Algoritmi i programiranje

donjom podebljanom crtom. Poµcev�i od drugog elementa u nizu zapoµcinje pronalaµzenjeprvog elementa koji je veci ili jednak pivotu (42) te na poziciji s indeksom 3 pronalazimoprvi takav element a to je 54. Prona�ena pozicija p = 3 se oznaµcava kao privremeni poµce-tak druge particije (koja ce se nalaziti iza pivota) �to je oznaµceno osjenµcenom pozicijom.Postupak se nastavlja pore�enjem pivota i elemenata iz niza (i = p+ 1; p+ 2; : : : ; n� 1)koji se nalaze iza oznaµcene pozicije. Kada se prona�e element koji je veci ili jednak piv-otu, taj element se ostavlja na svojoj poziciji, te se nastavlja proces pore�enja pivota ielemenata na preostalim pozicijama. Na primjer, na tabeli na poziciji i = 4 je element 49pa taj element ostaje na svojoj poziciji. Kada se prona�e element koji je manji od pivota,tada taj element i element na poziciji p razmjenjuju pozicije, te se oznaka p povecava za1 tako da oznaka p pokazuje na novi poµcetak druge particije. Na primjer, na poziciji sindeksom i = 5 se nalazi element 22 koji je manji od pivota (42), pa element 22 razm-jenjuje poziciju s elementom na poziciji p a to je 54. Istovremeno, privremena vrijednostindeksa p za poµcetak druge particije se povecava za 1 pa sada ima vrijednost p = 4. Ovajproces se nastavlja sve dok se ne do�e do kraja niza. Svi ostali koraci u reorganizacijiniza s ciljem njegovog particioniranja su tako�er ilustrirani na tabeli.

Pri kraju procesa, kada indeks i dostigne vrijednost 9 (i = n�1) pivot se jo�uvijek nalazina prvoj poziciji. Me�utim, niz je prethodno reorganiziran tako da su svi elementi odpozicije 1 do pozicije 4 (p�1) manji od pivota, dok su elementi na pozicijama 5 do 9 (p don�1) veci od pivota. Po�to je cilj da pivot dijeli te dvije grupe elemenata, potrebno je jo�razmjeniti pozicije pivota i elementa na poziciji 4 (p�1), µcime se zavr�ava particioniranjeniza. Dakle, na kraju opisanog procesa, pivot element 42 se nalazi na poziciji 4. Svielementi na pozicijama s indeksima 0 do 3 su manji od pivot elementa 42 dok su svielementi na pozicijama 5 do 9 veci od pivot elementa.

0 1 2 3 4 5 6 7 8 9p = 1 42 36 17 54 49 22 63 57 20 46p = 2 42 36 17 54 49 22 63 57 20 46p = 3 42 36 17 54 49 22 63 57 20 46p = 3; i = 4 42 36 17 54 49 22 63 57 20 46p = 3; i = 5 42 36 17 54 49 22 63 57 20 46p = 4; i = 5 42 36 17 22 49 54 63 57 20 46p = 4; i = 6 42 36 17 22 49 54 63 57 20 46p = 4; i = 7 42 36 17 22 49 54 63 57 20 46p = 4; i = 8 42 36 17 22 49 54 63 57 20 46p = 5; i = 8 42 36 17 22 20 54 63 57 49 46p = 5; i = 9 42 36 17 22 20 54 63 57 49 46j = 4; p = 5 20 36 17 22 42 54 63 57 49 46

Zamjena pozicija pivot elementa i elementa na poziciji p�1 mijenja poredak elemenata udonjoj particiji. Na primjer, na tabeli je nakon izmjene poredak elemenata koji pripadajudonjoj particiji (36; 17; 22; 20) promijenjen u poredak (20; 36; 17; 22). To, naravno, utiµcena izbor pivota u sljedecim fazama algoritma, s tim da u prosjeµcnom sluµcaju to ne utiµce nae�kasnost algoritma. Algoritam kojim se na prethodno opisani naµcin moµze particioniratiniz dat je u nastavku.

Nakon opisa postupka particioniranja nizova moguce je opisati rekurzivnu implementaciju.Algoritam je opisan procedurom QuickSort u nastavku. Po�to na poµcetku µcitav niz

101

Page 106: Algoritmi i programiranje

// Procedura ParticijaParticija (a; prvi; zadnji)pivot a [prvi]p prvi+ 1SveDokJe (p � zadnji&a [p] < pivot) raditi{

p p+ 1}ZaSve (i p+ 1) do zadnji raditi{

AkoJe (a [i] < pivot) tada{

a [i]$ a [p]p p+ 1

}}a [prvi]$ a [p� 1]Vrati p� 1

predstavlja jednu particiju, algoritam se poziva sa poµcetnim argumentima prvi = 0 izadnji = n� 1.

// Procedura Quick sortQuickSort (a; prvi; zadnji)AkoJe (prvi < zadnji) tada{

j Particija (a; prvi; zadnji)QuickSort (a; prvi; j � 1)QuickSort (a; j + 1; zadnji)

}

Mehanizam rada procedure Quick Sort je ilustrovan na slici u nastavku.

102

Page 107: Algoritmi i programiranje

Inicijalni raspored elemenata niza je prikazan prvim rasporedom na tabeli 13 (na kojojje ilustrovan postupak particije) a na slici je raspored elemenata u nizu nakon prve par-ticije. Izabrani pivot u pojedinim fazama je oznaµcen pojaµcno a elementi koji su zauzelisvoje konaµcne pozicije su uokvireni obiµcnom linijom. Isprekidanim linijama su uokvirenielementi koji u pojedinim fazama izvr�avanja algoritma µcine podnizove koji u nastavkualgoritma ulaze u proces particije. U sljedecem koraku kao pivot se uzima element 20, aproces particije se nastavlja sa podnizom koji µcine elementi koji se nalaze na pozicijama0 do 3. Rezultat particije je prikazan u liniji c. Pivot element 20 je zauzeo svoje konaµcnomjesto na poziciji s indeksom 1, donju particiju µcini samo jedan element (17), dok gornjuparticiju µcine dva elementa (36 i 22). Na linijama d do h su ilustrirane i ostale faze uradu algoritma.

103

Page 108: Algoritmi i programiranje

11 Grafovski algoritmi

11.1 Uvod

U cilju potpunog razumijevanja grafovskih algoritama potrebno je de�nisati odgovarajucepojmove i utvrditi konvencije.

� Predmet analize su samo prosti grafovi, koji nemaju petlje u pojedinim µcvorovimai nemaju ponavljajucih ivica

� Sa n = jV j i m = jEj se oznaµcava broj µcvorova (tjemena, V) i grana (linija, E)respektivno; svaki µcvor je obiljeµzen brojem od 1 do n osim ako nije potrebno izbjecikonfuziju

Jedan od prvih problema koji se rje�ava kada se raµcunarski simuliraju grafovski algoritmije predstavljanje odnosno na koji naµcin tu informaciju prenijeti raµcunaru. Postoje trinaµcina:

� Lista µcvorova (edge list) : formira se jednostavna numerisana lista koja u nekimsluµcajevima moµze biti sortirana

� Matrica povezanosti (adjacency matrix) : matrica n � n koja se sastoji od 1 i 0 uzavisnosti od toga da li su dva µcvora povezana (1) ili ne (0). Primjer je

A =

0BB@0 1 1 11 0 0 01 0 0 11 0 1 0

1CCAU ovoj listi vrijedi da je aij = aji �to znaµci da je graf neusmjeren. U sluµcaju da je aij 6= ajiradi se o usmjerenom grafu.

� Lista povezanosti (adjacency list) : lista od n elemenata u kojoj je svaki elementlista µcvorova koji su povezani sa tim µcvorom. Ako se radi o usmjerenom grafu tadasu elementi liste ure�eni parovi

Ne postoji "najbolja" grafovska prezentacija jer to bitno zavisi od informacija koje seprezentiraju putem grafa. Prezentacija je diktirana, prije svega, brojem veza a zatimostalim elementima.

Ako se svakoj grani dodijeli neka vrijednost tada se govori teµzinskom grafu (ponderisanigraf, weighted graph, ...). "Teµzina" je u tom sluµcaju veliµcina koja je od interesa kaonpr. rastojanje, cijena, vjerovatnoca i sliµcno. Namjena ovog teksta nije da se bavi inter-nom prezentacijom. U tom smislu ce za svaki tip problema biti kori�tena odgovarajucanotacija.

104

Page 109: Algoritmi i programiranje

11.2 Algoritmi pretraµzivanja

Problem pretraµzivanja se formuli�e na sljedeci naµcin : Ako su data dva µcvora v; w 2 V (G)da li postoji putanja iz v do w ? Ako postoji, da li je ta putanja najkraca ?

Podrazumijeva se da je graf G neusmjeren.

Intuitivno, to se radi tako da se graf G pretraµzi po svakoj ivici od v kako bi se vidjelo dali se moµze doci do w. Ako se radi na taj naµcin potrebno je µcuvati informaciju o tome kojiµcvorovi su posjeceni kako bi se izbjegle beskonaµcne petlje.

Ideja je da se µcvorovi koji jo�nisu pretraµzeni obiljeµze Bijelo a pretraµzeni Crno. Kad sepretraµzuju child µcvorovi mora se osigurati da se ne obra�uju ponovo pa se oznaµcavajukao Sivi. Inicijalno, svi µcvorovi su oznaµceni Bijelo.

Generiµcki (op�ti) algoritam pretraµzivanja je u nastavku.

Oznaµciti sve µcvorove bijeloOdabrati poµcetni µcvor i obojiti ga u SivoSveDok( postoji Sivi µcvor ){

Odaberi µcvor iOznaµci Bijele susjede SivoObraditi µcvor iOznaµciti ga Crno

}

Kako bi se pokazala korektnost treba primijetiti da se kretanje odvija po principu

Bijelo!Sivo!Crno

i svaka iteracija petlje mijenja boju barem jednog µcvora tako da se ne pojavljuje beskon-aµcna petlja. Algoritam se zavr�ava samo ako su svi µcvorovi oznaµceni Bijelo ili Crno. Bilokoji µcvor koji je oznaµcen Bijelo ne moµze biti susjed µcvora koji je povezan sa startnimµcvorom (jer bi inaµce bio oznaµcen kao Sivo). Bilo koji µcvor koji je oznaµcen Crno morabiti povezan sa poµcetnim µcvorom. Stoga, putanja od µcvora n do µcvora m postoji ako isamo ako je w oznaµcen kao Crno na kraju algoritma. U su�tini, ovo je naµcin da se na�upovezane komponente, zasebne cjeline grafa koje nisu povezane ivicama.

Na taj naµcin je prezentiran prvi dio rje�enja problema.Kad se ovaj algoritam zavr�i veliµcina numCC sadrµzi ukupan broj povezanih komponentia cc [i] daje oznaku komponente koja je povezana sa µcvorom i. Korak "Uzmi Sivi µcvor j"se moµze raditi na dva naµcina:

� breadth-�rst-search (BFS) : uzeti µcvor koji je prona�en najranije. Ovo znaµci da senajprije obra�uju svi µcvorovi povezani sa startnim µcvorom zatim µcvorovi na distanci2 itd.

� depth-�rst-search (DFS) : uzeti µcvor koji je prona�en najkasnije. Ovo znaµci da senajprije istraµzuju µcvorovi koji su na dugaµckom lancu (sve dok se ne do�e do krajalanca)

105

Page 110: Algoritmi i programiranje

De�nisati nizove cc [:] i boja [�] duµzine nnumCC 0ZaSvaki (µcvor i){

Obojiti Bijelo}ZaSvaki µCvor i od 1 do n{

AkoJe(boja [i]=Bijelo){

numCC numCC + 1cc [i] numCCboja [i] SivoSveDokJe (Postoji µcvor Sivo){

Uzmi Sivi µcvor jObojiti sve njegove Bijele susjede Sivocc [j] numCCboja [j] Crno

}}

}

Ova dva pristupa se bitno razlikuju po sloµzenosti i dinamici pretraµzivanja i oba pristupaimaju puno praktiµcnih primjena.

Prvi od njih ima sloµzenost O (n2) jer se koristi kvadratna matrica. Svaka ivica (grana)se pretraµzuje najvi�e dva puta. Algoritam ima prednosti ako je �ema "rijetka" (engl.sparse). Putanja koja se formira zove se stablo. Ako je graf pritom povezan to stablo sezove minimalno razapinjuce stablo.

Drugi algoritam koristi strukturu koja se zove stek (engl. stack). Realizuje se operacijama"stavi" (engl. push), koja dodaje element na kraj niza (lanca koji se pretraµzuje) i "uzmi"(engl. pop), koji uklanja element sa kraja. Ovo je struktura podataka koja se zove LIFO(Last-In-First-Out). Postoji i struktura FIFO (First-In-First-Out), koja se ne koristi uove svrhe. Kompleksnost ovog algoritma je O (n+m).

Primjena druge verzije ovog algoritma nije odmah oµcigledna. Me�utim, moµze se razmi�l-jati kao o skupu µcvorova od kojih svaki ima nekoliko konekcija na sebe tako da svaki takostvoren lanac ima odre�ena svojstva "separabilnosti".

Primjer. Neka je data mreµza raµcunara. Potrebno je naci sve kompjutere koji, ako seuklone, µcine da se mreµza raspada.

11.3 Algoritmi najkraceg puta

Oµcigledna generalizacija problema najkraceg puta ima izvor u µcinjenici da grane (ivice)imaju razliµcite "teµzine". Formalno, potrebno je imati naµcin na koji se "teµzine" dodjeljuivicama. To se µcini putem sljedece de�nicije.

106

Page 111: Algoritmi i programiranje

De�nicija. Teµzinski graf je graf G = (V ;E) zajedno sa funkcijom w : E ! R. Kaµze seda je w (i; j) =1 ako (i; j) =2 E.

Sliµcno se formalizuje problem "najkraceg puta".

De�nicija. Putanja

x = x0; x1; :::; xm = y

je najkraci put od x do y ako ta putanja minimizira

m�1Xi=0

w (xi; xi+1)

Duµzina najkraceg puta od x do y se oznaµcava sa d (x; y).

Sada se problem najkraceg puta lako formuli�e.

Problem. Za dati teµzinski graf G i dva µcvora x i y naci d (x; y). Pretpostavka jew (i; j) > 0.

11.3.1 Dijkstra algoritam

Ovaj algoritam je namijenjen traµzenju najkraceg puta u usmjerenim grafovima. Pret-postavlja se da ivice grafa imaju svoje vrijednosti i cilj je naci najkrace putanje iz jednogµcvora u sve µcvorove grafa.

Distanca izme�u dva µcvora u i v, u oznaci � (u; v), je minimalna duµzina putanje od u dov.

Problem najkraceg puta iz jednog µcvora (single source shortest path) se de�ni�e na sljedecinaµcin. Dat je usmjeren graf sa nenegativnim teµzinama ivica G = (V ;E) i izdvojenimpoµcetnim µcvorom s 2 V . Problem je odrediti distancu poµcetnog µcvora do svakog µcvora ugrafu.

Moguce je imati grafove sa negativnim teµzinama ivica ali kako bi najkraci putevi bilidobro de�nisani potrebno je dodati zahtjev da uop�te nema ciklusa µcija je ukupna teµzinanegativna (inaµce bi se mogao napraviti beskonaµcno kratak put kretanjem zauvijek u tomciklusu). Ovdje se nagla�ava posao raµcunanja minimalne distance od poµcetnog µcvorado svakog µcvora. Raµcunanje stvarne duµzine je dosta lagano pro�irenje problema. Zasvaki µcvor se formira pointer pred (v) koji ukazuje na prethodnika. Slijedeci pointereprethodnika unazad od bilo kojeg µcvora konstrui�e se reverzna slika najkraceg puta do v.

Osnovna struktura Dijkstra algoritma je odrµzavanje procjena najkraceg puta za svakiµcvor, u oznaci d [v]. Intuitivno gledano, d [v] ce biti duµzina najkraceg puta od s do v kojije poznat algoritmu. Ova vrijednosti je uvijek veca ili jednaka sa stvarno najkracim putemod s do v. Inicijalno, putevi su nepoznati tako da je d [v] = 1. Inicijalno je d [s] = 0 asvi ostali d [v] su postavljeni na 1. Kako algoritam napreduje i kako se ukljuµcuje vi�eµcvorova aµzurira se d [v] za svaki µcvor u grafu sve ove vrijednosti ne konvergiraju ka stvarnonajkracoj distanci.

107

Page 112: Algoritmi i programiranje

Proces kojim se vr�i aµzuriranje procjene se zove relaksacija. Intuitivno gledano, ako nijepostignuta optimalna vrijednost ona je bliµza ka optimumu. Posebno, ako se otkrije putod s do v koji je kraci od d [v] tada se vr�i aµzuriranje te vrijednosti. Ovaj metod jezajedniµcki za veliki broj algoritama optimalizacije.

Posmatra se ivica od µcvora u do µcvora v µcija je teµzina w (u; v). Pretpostavka je da postojeprocjene za d [u] i d [v]. Poznato je da postoji put od s do u sa teµzinom d [u]. Ako se uzmeta putanja i ako se slijedi ivica (u; v) dobija se putanja do v duµzine d [u] + w (u; v). Akoje ta putanja bolja od postojeceg puta do v duµzine d [v] tada se d [v] aµzurira na vrijednostd [u] +w (u; v). Potrebno je zapamtiti da najkraci put do v prolazi kroz u �to se µcini takoda se aµzurira pointer prethodnika za v.

Treba primijetiti da kad god se d [v] postavi na konaµcnu vrijednost uvijek postoji trago putanji te duµzine. Stoga je d [v] � � (s; v). Ako je d [v] = � (s; v) tada naknadnerelaksacije ne mogu promijeniti tu vrijednost.

Nije te�ko vidjeti da ako se relaksacija provede nad svim ivicama grafa vrijednosti d [v]obavezno konvergiraju konaµcnoj stvarnoj vrijednosti iz s. Cilj svakog dobrog algoritmanalaµzenja najkraceg puta je da se aµzuriranja obavljaju na pametan naµcin kako bi konver-gencija bila �to je moguce brµza. Posebno, najbolji naµcin bi bio da se operacije relaksacijeporedaju na naµcin da se posao za svaku ivicu provede taµcno jednom. Taµcno ovo radiDijkstra algoritam.

Dijkstra algoritam je zasnovan na izvr�avanju ponovljenih relaksacija. On radi tako daodrµzava podskup µcvorova, S � V , za koji se progla�ava da "znamo" stvarnu distancu,d [v] = � (s; v). Inicijalno je S = �, prazan skup i stavlja se d [s] = 0 a za sve ostale +1.Jedan po jedan µcvor iz V nS se dodaje u S.

Skup S moµze biti implementiran kori�tenjem niza boja koje su dodijeljene µcvorovima.Inicijalno su svi µcvorovi bijeli a boja [s] = crna kako bi se naznaµcilo da v 2 S.

Dijkstra je prepoznao da je najbolji naµcin relaksacije povecanje poretka distance od izvora.Na taj naµcin, kad god se provodi relaksacija moguce je zakljuµciti da rezultat relaksacijedaje konaµcnu vrijednost distance. Za implementaciju ovog koncepta za svaki µcvor u 2V nS se odrµzava procjena distance d [u]. Pohlepni dio algoritma se odnosi na to da seuzima µcvor iz V nS za koji je d [v] minimalno tj. uzima se neobra�eni µcvor koji je (premaprocjeni) najbliµzi ka s.

Kako bi se ova selekcija izvr�ila e�kasno, µcvorovi iz V nS se stavlja u red prioriteta (tj.heap - gomila) gdje je kljuµcna vrijednost svakog µcvora u jednaka d [u]. Primjetna jesliµcnost sa Primovim algoritmom iako se koriste razliµcite vrijednosti. Za svaki µcvor jepoznata lokacija u redu prioriteta i svaka stavka u redu prioriteta "poznaje" koji µcvorprezentira.

108

Page 113: Algoritmi i programiranje

Prikaz Dijkstra algoritma

Zbog sliµcnosti sa Primovim algoritmom vrijeme izvr�enja je jednako, �(E log V ).

Drugi algoritmi kojima se rje�ava problem najkraceg puta su :- Floyd Warshall-ov algoritam- Algoritam mravlje kolonije

11.4 Pohlepni algoritmi na grafovima

Uobiµcajeni problem u komunikacionim mreµzama i dizajnu elektriµcnih kola je povezivanjeskupa µcvorova (komunikacionih µcvorova ili elemenata elektriµcnog kola) pomocu najkracemoguce mreµze, lija je duµzina suma duµzina pojedinih veza. Pretpostavlja se da je mreµzaneusmjerena. Kako bi se minimizirala duµzina mreµze ne smije se dopustiti postojanje petlji.Rezultat je graf koji je povezan, neusmjeren i acikliµcan i kao takav se zove slobodno stablo.

Raµcunski problem se zove problem minimalno razapinjuceg stabla (Minimum SpanningTree, krace MST). Formalnije, za dati povezani neusmjereni graf G = (V ;E) razapinjucestablo je acikliµcni skup ivica T � R koje povezuju sve µcvorove. Pretpostavlja se da svakaivica w (u; v) grafa G ima numeriµcku teµzinu ili cijenu (koja moµze biti negativna ili nula)cijena stabla T se de�ni�e kao suma ivica razapinjuceg stabla

w (T ) =X

(u;v)2T

w (u; v)

Minimalno razapinjuce stablo je ono koje ima minimalnu teµzinu. Ovo stablo ne mora bitijedinstveno. Ako sve ivice imaju razliµcitu teµzinu tada su minimalna razapinjuca stablarazliµcita. Ovo jo�nije dokazano vec je µcinjenica koja se koristi.

109

Page 114: Algoritmi i programiranje

Slika prikazuje tri razapinjuca stabla za isti graf. U sredini i desno su su dva minimalnarazapinjuca stabla.

Postoje dva pohlepna algoritma, Kruskalov i Primov, za nalaµzenje minimalnog razapin-juceg stabla. Podsjetimo se da je pohlepni algoritam onaj koji rje�enje nalazi ponavljan-jem selekcije najje�tinije (ili generalno lokalno optimalnog izbora) od raspoloµzivih opcijana svakoj etapi. Vaµzna karakteristika pohlepnih algoritama je da prave izbor koji neopozivaju. Prije prezentacije potrebne su neke bitne µcinjenice o slobodnim stablima.

Lema.

� Slobodno stablo sa n µcvorova ima taµcno n� 1 ivica

� Postoji jedinstveni put izme�u bilo koja dva µcvora slobodnog stabla

� Dodavanje bilo koje ivice kreira jedinstveni ciklus. Prekidanje bilo koje ivice togciklusa obnavlja slobodno stablo

Neka je G = (V;E) neusmjeren povezan graf µcije ivice imaju numeriµcke vrijednosti teµzine(pozitivne, negativne ili nula). Intuicija u pozadini pohlepnih MST algoritama je jednos-tavna : odrµzava se podskup ivica A koji je inicijalno prazan i dodaje se jedna po jednaivica sve dok A ne postane MST. Kaµze se da je S � E most (prelaz) ako je podskup ivicanekog MST (ne moµze se reci MST jer nije neophodno i jedinstven). Kaµze se da je ivica(u; v) 2 EnA sigurna ako je A [ (fu; vg) prelaz. Drugim rijeµcima, izbor (u; v) je siguranizbor tako da A jo� uvijek moµze formirati MST. Ako je A prelaz ne moµze sadrµzavaticiklus. Izvorni (generiµcki pohlepni algoritam radi tako da dodaje sigurne ivice na tekucerazapinjuce stablo. Potrebno je voditi raµcuna da je prelaznost svojstvo podskupa ivica asigurnost svojstvo pojedine ivice.

Neka je S podskup µcvorova S � V . Podjela (cut) (S; V nS) je particija µcvorova u dvadisjunktna podskupa. Ivica (u; v) prelazi podjelu ako je jedna njena krajnja taµcka u S adruga u V nS. Za dati podskup ivica A se kaµze da podjela po�tuje A ako ne postoje iviceu A koje prelaze podjelu. Nije te�ko vidjeti za�to je po�tovanje podjele vaµzno za ovajproblem. Ako je formiran djelimiµcni MST i ako se µzeli znati koje ivice koje mogu bitidodate i koje ne formiraju ciklus u tekucem MST, bilo koja ivica koja prelazi po�tujucupodjelu je moguci kandidat.

Ivica u E je lagana ivica koja prelazi podjelu ako ima minimalnu duµzinu od svih ivicakoje prelaze podjelu. Lagana ivica moµze ne biti jedinstvena. Prema intuiciji, s obziromda sve ivice koje prelaze po�tujucu podjelu ne formiraju ciklus tada je lagana ivica kojaprelazi podjelu prirodan izbor.

MST Lema. Neka jeG = (V;E) povezan neusmjereni graf sa ivicama realnih vrijednosti.Neka je A prelazni podskup od E (odnosno podskup nekog MST) i neka je (S; V nS) bilokoja podjela koja po�tuje A i neka je (u; v) lagana ivica koja prelazi podjelu. Tada je(u; v) sigurna za A.

110

Page 115: Algoritmi i programiranje

11.4.1 Kruskalov algoritam

Kruskalov algoritam radi tako da se ivice dodaju na A u rastucem redoslijedu teµzina(najprije lak�e ivice). Ako naredna ivica ne formira ciklus unutar tekuceg skupa ivicatada se dodaje u A. Ako formira ciklus tada se ivica propu�ta i razmatra se sljedeca ivicau poretku. Kako algoritam odmiµce formiraju se stabla u µcvorovima. Tokom algoritmaova stabla se udruµzuju sve dok se ne dobije stablo koje sadrµzi sve µcvorove.

Ova strategija vodi ka korektnom algoritmu. Uzmimo npr. ivicu (u; v) koja se trebadodati i pretpostavimo da ta ivica ne formira ciklus u A. Neka je A0 stablo u �umi Akoje sadrµzi µcvor u. Posmatra se Podjela (A0; V nA0). Svaka ivica koja prelazi podjelu nijeu A tako da ta podjela po�tuje A i (u; v) je lagana ivica preko podjele (jer su sve laganijeivice iskori�tene ranije u algoritmu). Stoga je (u; v) sigurna ivica.

Te�ki dio algoritma je kako e�kasno detektovati da li dodavanje ivice kreira ciklus u A.Moµze se provesti pretraµzivanje podgrafa koji je kreiran ivicama iz skupa A ali to uzimajako puno vremena. Potreban je brz i pouzdan test koji nam daje odgovor na pitanjeda li je u ili v u istom stablu A. Ovo se moµze uraditi putem strukture podataka kojase zove Unija-Traµzenje (Union-Find) dva disjunktna skupa. Ova struktura podrµzava trioperacije:

KreiratiSet(u) : Kreiranje skupa koji sadrµzi stavku u.NaciSet(u) : Nalaµzenje skupa koji sadrµzi datu stavku u.Union(u;v) : Spojiti skup koji sadrµzi u i skup koji sadrµzi v u zajedniµcki skup.

Svaka od ovih operacija se izvr�ava u O (log n) vremenu na skupu veliµcine n. Ova struk-tura je zanimljiva jer se niz od n operacija izvr�ava mnogo brµze od O (n log n).

U ovom algoritmu µcvorovi grafa su elementi pohranjeni u skupove a skupovi su µcvoroviu svakom stablu A. Skup A moµze biti pohranjen kao jednostavna lista ivica. Primjer jepokazan na narednoj slici.

Analiza. Koliko dugo traje Kruskalov algoritam ? Kao i obiµcno, neka je V broj µcvorovai E broj ivica. S obzirom da je graf povezan moµze se uzeti da je E � V �1. Za sortiranjeivica potrebno je �(E logE). Petlja se ponavlja E puta a svaka iteracija ukljuµcujekonstantan broj pristupa Union-Find strukturi na skupu od V stavki. Stoga, za svakipristup treba �(V ) vremena a skupa �(E log V ). Stoga je ukupno vrijeme izvr�enjajednako njihovoj sumu koja je �((V + E) log V ). S obzirom da V u asimptotskom smislunije vece od E slijedi da je vrijeme izvr�enja �(E log V ).

111

Page 116: Algoritmi i programiranje

11.4.2 Primov algoritam

Primov algoritam je drugi pohlepni algoritam za minimalno razapinjuce stablo. OdKruskalovog algoritma se razlikuje samo u naµcinu odabira naredne sigurne ivice kojase dodaje na svakom koraku. Vrijeme izvr�enja je potpuno jednako kao za Kruskalovalgoritam. Ovaj algoritam pokazuje da postoji vi�e od jednog naµcina da se rije�i ovajproblem. Osim toga, veoma je sliµcan drugom pohlepnom algoritmu, Dijkstra algoritmu,kojim se rje�ava potpuno druga vrsta problema : najkraci put u mreµzi.

Kruskalov algoritam radi tako da sortira ivice i umece ih jednu po jednu u razapinjucestablo vodeci raµcuna da se nikada ne formira ciklus. Intuitivno gledano, Kruskalov algo-ritam radi tako da spaja dva stabla ili ih razdvaja sve dok se sve ivice ne na�u u istomstablu.

Za razliku od njega, Prim-ov algoritam gradi stablo dodavanjem po jednog lista na tekucestablo. Startuje se sa korijenskim µcvorom r koji moµze biti bilo koji. U bilo koje vrijemepodskup ivica A formira jedno stablo (u Kruskalovom algoritmu se formira �uma). Traµzise dodavanje µcvora kao lista na stablo. Proces je ilustrovan na narednoj slici.

Primov algoritam

Ako se posmatra skup µcvorova S koji je dio stabla i njegov komplement tada postojipodjela grafa i tekuci skup ivica A po�tuje tu podjelu. MST lema kaµze da je sigurnododavanje lagane ivice. Na slici to je ivica teµzine 4 koja ide u µcvor u. Stoga se u dodaje uµcvorove skupa S i dijeli izmjene. Treba primijetiti da neke ivice koje vi�e ne sijeku podjelukoju su presijecale prije ovog koraka nestaju a javljaju se nove koje nisu presijecale tupodjelu.

Lako je vidjeti da je za e�kasnu implementaciju Prim-ovog algoritma kljuµcno e�kasnoaµzuriranje podjele i brzo odre�ivanje lagane ivice. Da bi se to uµcinilo koristi se strukturapodataka prioritetnog reda (priority queue) koja se koristi u Heap sortu. Ova strukturaµcuva skup stavki u kojoj je svaka stavka povezana sa vrijednosti koja se zove kljuµc.

Naredna slika ilustruje Prim-ov algoritam. Strelice indiciraju pointere (pokazivaµce) sljed-nika a numeriµcka vrijednost u svakom µcvoru je vrijednost kljuµca.

112

Page 117: Algoritmi i programiranje

Za analizu Prim-ovog algoritma raµcuna se vrijeme potro�eno na svakom µcvoru nakon �to sepreuzme iz reda prioriteta (priority queue). Ova aktivnost uzima O (log V ) vremena. Zasvaku ivicu se potro�i okoO (log V ) vremena kako bi se smanjio kljuµc susjednih µcvorova paje vrijeme O (log V + deg (u) log V ). Ostali koraci aµzuriranja se obavljaju u konstantnomvremenu. Na osnovu ovoga je

T (V;E) =Xu2V

(log V + deg (u) log V ) =Xu2V

(1 + deg (u)) log V

= log VXu2V

(1 + deg (u)) = (log V ) (V + 2E) = � ((V + E) log V )

S obzirom da je G povezan V asimptotski nije veci od E tako da je rezultat �(E log V ).To je taµcno jednako sa procjenom za Kruskalov algoritam.

113

Page 118: Algoritmi i programiranje

11.5 Zadaci

Zadatak 01. Kruskalovim algoritmom naci minimalno razapinjuce stablo na sljedecemgrafu.

Rje�enje je dato na narednoj tabeli.

Korak Raspoloµzivo Uzeto1 (c,d) (c,d)2 (d,e), (c,e) (d,e)3 (b,c) (b,c)4 (a,d) (a,d)

Dobijeno je stablo na narednoj slici.

Zadatak 02. Kruskalovim algoritmom naci minimalno razapinjuce stablo na sljedecemgrafu.

114

Page 119: Algoritmi i programiranje

Rje�enje. Postupak rje�avanja je prikazan na narednoj tabeli.

Korak Raspoloµzivo Uzeto1 (c,g), (e,i), (k,l) (c,g)2 (e,i), (k,i) (e,i)3 (k,l) (k,l)4 (a,e), (b,c), (c,d), (d,g), (f,j), (j,k) (a,e)5 (b,c), (c,d), (d,g), (f,j), (j,k) (b,c)6 (c,d), (d,g), (f,j), (j,k) (c,d)7 (f,j), (j,k) (f,j)8 (j,k) (j,k)9 (b,f), (e,j), (i,j) (b,f)10 (e,j), (i,j) (e,j)11 (h,l) (h,l)

Table 2: Graf 02

Dobijeno je stablo na narednoj slici.

Zadatak. Primovim algoritmom naci minimalno razapinjuce stablo na sljedecem grafu.

115

Page 120: Algoritmi i programiranje

Rje�enje. Postupak rje�avanja je dat na narednoj tabeli.

Korak µCvorovi Raspoloµzivo Uzeto1 a (a,b), (a,e), (a,f) (a,e)2 a, e (a,b), (a,f), (e,f), (e,i), (e,j) (e,i)3 a, e, i (a,b), (a,f), (e,f), (e,j), (i,j) (e,j)4 a, e, j (a,b), (a,f), (e,f), (j,f), (j,g), (j,k) (j,f)5 a, f, j (a,b), (f,b), (f,c), (f,g), (j,g), (j,k) (j,k)6 a, f, j, k (a,b), (f,b), (f,c), (f,g), (j,g), (k,g), (k,l) (k,l)7 a, f, j, k, l (a,b), (f,b), (f,c), (f,g), (j,g), (k,g), (l,g), (l,h) (f,b)8 b, f, j, k, l (b,c), (f,c), (f,g), (j,g), (k,g), (l,g), (l,h) (b,c)9 c, f, j, k, l (c,d), (c,g), (f,g), (j,g), (k,g), (l,g), (l,h) (c,g)10 c, g, l (c,d), (g,d), (g,h), (l,h) (c,d)11 d, g,l (d,h), (g,h), (l,h) (l,h)

Dobijeno je stablo na narednoj slici.

U ovom sluµcaju je dobijeno stablo identiµcno onome iz prethodnog zadatka. Ovo ne morauvijek biti sluµcaj.

Zadatak. Dijkstra algoritmom naci najkraci put u sljedecem grafu.

116

Page 121: Algoritmi i programiranje

Rje�enje. Postupak je dat na sljedecoj tabeli.

Korak µCvorovi Veze Uzeto1 a b(10), e(2), f(8) (a,e)2 a, e b(10), f(8), i(3), j(5) (e,i)3 a, e, i b(10), f(8), j(5) (e,j)4 a, e, j b(10), f(7), g(11), k(7) (f,j)5 a, f, j b(10), c(12), g(10), k(7) (j,k)6 a, f, k b(10), c(12), g(10), l(8) (k,l)7 a, f, l b(10), c(12), g(10), h(13) (a,b)8 b, f, l c(12), g(10),h(13) (f,g)9 b, g, l c(11), d(12), h(13) (c,g)10 c, g, l d(13), h(13) (d,g)11 d, g,l h(13) (l,h)

Dobijena je putanja na sljedecoj slici.

Zadatak 03. Dijkstra algoritmom naci najkraci put u sljedecem grafu.

117

Page 122: Algoritmi i programiranje

Postupak je dat na sljedecoj tabeli.

Korak µCvorovi Veze Uzeto1 a b(10), d(5) (a,d)2 a, d b(8), c(14), e(7) (d,e)3 a, d, e b(8), c(13) (d,b)4 b, d, e c(9) (b,c)

Dobijena je putanja na sljedecoj slici.

11.6 Zadaci za samostalni rad

Na sljedecim grafovima odabranim algoritmom naci minimalno razapinjuce stablo i na-jkraci put. Za poµcetni uzimati µcvor a.

118

Page 123: Algoritmi i programiranje

119

Page 124: Algoritmi i programiranje

120

Page 125: Algoritmi i programiranje

121

Page 126: Algoritmi i programiranje

122

Page 127: Algoritmi i programiranje

123

Page 128: Algoritmi i programiranje

12 Programski jezik C++

12.1 Rad sa datotekama

Jedan od vaµznijih problema u programiranju je kako preuzeti ulazne veliµcine. Ovo jeposebno vaµzno rije�iti u situacijama kao �to su :

� Preuzimanje podataka koji su rezultat neke druge obrade ili procesa

� Uzimanje veceg obima podataka kao �to su matrice vecih dimenzija

� Spremanje rezultata programa radi arhiviranja, kasnijih analiza ili obrada od stranenekih drugih programa kao �to su Excell i sliµcni

� Spremanje rezultata kao jedna od faza u radu istog programa

i sliµcno. Poseban problem je unos veceg broja podataka kako zbog vremena za unos takoi zbog mogucih gre�aka. Jedno od rje�enja je kori�tenje datoteka za ulaz, me�ukorake iizlaz.

Operacije u radu sa datotekama su :

� kreiranje datoteka, obiµcno za izlaz

� µcitanje iz datoteka

� upis u datoteku

Ako su datoteke vec kreirane tada se mogu koristiti naredbe open (otvoriti) i close(zatvoriti).

Svaka datoteka koja se koristi u radu, bilo da se u nju upisuje ili iz nje vr�i µcitanje, moraimati naziv. Na algoritmu 01 je primjer programa koji u datoteku kvadrati.txt upisujebrojeve od 1 do 100 i njihove kvadrate, odvojene zarezom.

Algoritam 01#include <fstream>using namespace std;int main(){

ofstream izlaz("BROJEVI.TXT");for(int i = 1; i <= 100; i++)izlaz << i << ", " << i * i << endl;return 0;

}

Prva promjena u odnosu na prethodne programe se vidi u prvom redu, u #includenaredbi. Sljedeci bitan element je naµcin deklaracije izlazne datoteke pomocu naredbeofstream (�to se moµze tumaµciti kao output file stream). Umjesto naredbe cout rezultatse usmjerava na izlazni tok koji se naziva izlaz. Naziv datoteke se daje prema pravilimaoperativnog sistema pod kojim se radi. Ako okolnosti nalaµzu da ime datoteke sadrµzi znakn (backslash) tada se taj znak uduplava. Npr. ako datoteka treba imati naziv

124

Page 129: Algoritmi i programiranje

"algoritminprobenproba01.txt"

u programskom kodu se to pi�e kao

"algoritminnprobennproba01.txt"

µCesta je potreba da naziv datoteke daje (upisuje) korisnik u samom programu (koji mupostavlja "upit"). Na algoritmu 02 je primjer takvog pristupa.

Algoritam 02char ime[100];cout << "Unesite ime datoteke koju µzelite kreirati:";cin.getline(ime, sizeof ime);ofstream izlaz(ime);

Drugi naµcin da se ovo uradi je na algoritmu 03.

Algoritam 03string ime;cout << "Unesite ime datoteke koju µzelite kreirati:";getline(cin, ime);ofstream izlaz(ime.c_str());

U ovom sluµcaju ofstream kreira izlaznu datoteku µciji naziv se upisuje u promjenljivu imea funkcijom ime.c_str() se iz upisanog tekstualnog niza odbacuju evenutalni blankovisa poµcetka i kraja.

Da bi se provjerilo da li je kreiranje izlazne datoteke uspjelo ili ne koristi se operator! (negacija). Ako kreiranje nije uspjelo upit "if(!izlaz)" daje rezutat taµcno (true) .Ovo bi trebao biti uobiµcajeni postupak u radu sa datotekama.

Za ulazne datoteke vrijede ista pravila kao i za izlazne osim �to se umjesto naredbeofstream koristi ifstream a ulazni tok cin mijenja oznakom ulazne datoteke. Na algo-ritmu 04 je primjer u kojem se elementi matrice uµcitavaju iz datoteke.

Otvaranje datoteke se vr�i metodom open a zatvaranje metodom close. Druge varijanterada sa datotekama kao ulaznim odnosno izlaznim tokovima nisu predmet daljeg rada.

Zadatak. Programe iz prethodnih poglavlja prilagoditi tako da podatke preuzimaju izdatoteke i rezultat smje�taju u datoteku.

12.2 Klase i objektno programiranje

Za µcuvanje i rad sa razliµcitim tipovima podataka u C jeziku moµze se koristiti sloµzeni tippromjenljive koji se zove struct. Primjer je rad sa datumima tako da se moµze napravitide�nicija data u Algoritmu 05.

Na Algoritmu 06 su primjeri mogucih deklaracija.

125

Page 130: Algoritmi i programiranje

Algoritam 04#include <fstream>using namespace std;int main(){

ifstream ulaz("PODACI.TXT");// Ako se ne moµze otvoriti tok ulaz tada se treba dati neka poruka...if(!ulaz)

cout << "Otvaranje datoteke nije uspjelo!nn";else{

int i, j, broj, a[4][5];// Uµcitava se red po red...for(i=0;i<4;i++){

for(j=0;j<5;j++){// Uzimamo broj iz datoteke; na mjestu metode cin je odrednica ulazulaz >> broj;}

}ulaz.close();// Ako se ne moµze raditi iz bilo kog razloga...if(ulaz.eof())

// Ako je kraj ...cout << "Nema vi�e podataka!nn";

// Ako se ne moµze raditi daljeelse if(ulaz.bad()) cout << "Datoteka je vjerovatno

o�tecena!nn";else cout << "Datoteka sadrµzi neoµcekivane podatke!nn";// Prethodna if struktura nije aktivna ako je µcitanje zavr�eno bez gre�aka

}return(0);

}

Algoritam 05struct Datum{

int dan, mjesec, godina;};

Algoritam 06Datum d;d.dan=33;d.mjesec=14;d.godina=2004;

126

Page 131: Algoritmi i programiranje

Ovaj tip je veoma pogodan za neke upotrebe jer se osigurava bolji kontekst. Sa drugestrane, oµcito je, kao u ovom primjeru, da nedostaje mogucnost kontrole sadrµzaja u smislume�usobne veze pojedinih komponenti strukutre. Jedna od mogucnosti da se ovaj prob-lem, makar djelimiµcno, rije�i je de�nicija funkcija koje pristupaju poljima strukture nastrogo kontrolisan naµcin i koje se koriste za tu svrhu. Jedan od boljih primjera za ilus-traciju ovih kontrola je rad sa datumima, �to ce biti uµcinjeno u nastavku.

Prvi tip kontrole u radu sa datumima je provjera smislenosti odnosa pojedinih elemenata.U tu svrhu moµzemo de�nisati funkciju PostaviDatum koja postavlja elemente datumaunutar strukture a koja moµze imati izgled dat na Algoritmu 07.

Algoritam 07void PostaviDatum(Datum &d, int dan, int mjesec, int godina){

int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(godina % 4 == 0 && godina % 100 != 0 jj godina % 400 == 0)

broj_dana[1]++;if(godina < 1 jj mjesec < 1 jj mjesec > 12 jj dan < 1 jj dan >

broj_dana[mjesec-1])throw "Neispravan datum!nn";

d.dan = dan; d.mjesec = mjesec; d.godina = godina;}

Ispravan datum se stavlja u promjenljivu na koju upucuje odrednica &d i to tako da senapi�e npr:

Datum dd;PostaviDatum(dd,33,14,2012);

Ovakav pristup znaµci da programer mora koristiti navedenu funkciju ako µzeli potpunukontrolu jer ga ni�ta ne ograniµcava da radi direktno sa elementima strukture, u ovomsluµcaju to je struktura Datum. Ovo ne bi bio problem u sluµcaju kad jedan programerkontroli�e cijeli programski kod ali jeste u sluµcaju kada na programima rade, nekad veomaveliki, razvojni timovi, jer je te�ko (a nekad i nemoguce) mijenjati ili nametati pravilakoja svi moraju po�tovati kako bi se saµcuvao integritet programa. Potreba za timskimrazvojem velikih programa dovela je do razvoja potpuno nove metodologije za razvojprograma, koja je nazvana objektno orijentisano programiranje (OOP - object orientedprogramming). U toj metodologij mnogo veci znaµcaj se daje samim podacima i tipovimapodataka nego �to je to sluµcaj u klasiµcnoj metodologiji programiranja, koja je poznata ipod nazivom proceduralno programiranje.

Osnovu objektno orijentiranog pristupa programiranju µcine klase odnosno razredi (engl.class) koje objedinjuju grupe podataka i postupke koji se mogu primjenjivati nad njima.Klasa se dobija tako �to se unutar strukture dodaju prototipovi funkcija koje se moguprimjenjivati nad tim podacima. Na primjer, deklaracija na Algoritmu 08 de�ni�e klasuDatum koja pored podataka dan, mjesec i godina sadrµzi i prototip funkcije Postavi, kojace se primjenjivati nad promjenljivima tipa Datum:

127

Page 132: Algoritmi i programiranje

Algoritam 08class Datum{

int dan, mjesec, godina;void Postavi(int d, int m, int g);

};

Promjenljive µciji je tip klasa obiµcno se nazivaju primjerci klase, instance klase ili prostoobjekti. U tom smislu, klasa je apstrakcija koja de�ni�e zajedniµcka svojstva i zajedniµckepostupke koji su svojstveni svim objektima nekog tipa.

Funkcije µciji su prototipovi navedeni unutar same klase nazivaju se funkcije µclanice klaseili metode. Njihova namjena je da se primjenjuju nad konkretnim objektima te klase a neda im se kao parametri �alju objekti te klase. Ovome je prilago�ena i sintaksa pozivanjafunkcija µclanica. One se uvijek primjenjuju nad nekim konkretnim objektom kori�tenjemoperatora �.�(taµcka), istog operatora koji se koristi i za pristup atributima unutar klase.Primjer pozivanja funkcije Postavi na dva konkretna objekta tipa Datum je sljedeci :

Datum d1, d2;d1.Postavi(14,5,2001);d2.Postavi(36,14,2012);

Drugi poziv bi trebao dati odnosno odbaciti izuzetak, s obzirom na besmislen datum.Promjena u sintaksi upucuje i na promjenu naµcina razmi�ljanja. Funkciji PostaviDatumse kao argument �alju objekti d1 i d2, dok se funkcija Postavi primjenjuje nad objektimad1 i d2.

Jedna od mogucih implementacija funkcije Postavi je na Algoritmu 09.

Algoritam 09void Datum::Postavi(int d, int m, int g){

int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(g % 4 == 0 && g % 100 != 0 jj g % 400 == 0) broj_dana[1]++;if(g < 1 jj d < 1 jj m < 1 jj m > 12 jj d > broj_dana[m-1])

throw "Neispravan datum!nn";dan = d; mjesec = m; godina = g;

}

Prvo �to se uoµcava je da se ispred imena funkcije nalazi dodatak Datum:: �to trebaukazivati na to da se radi o funkciji µclanici klase Datum. Na taj naµcin je moguce dapostoje i obiµcna funkcija i funkcija µclanica istog imena, uz dodatnu mogucnost da vi�erazliµcitih klasa imaju funkcije µclanice istih imena. Znak �::�(dupla dvotaµcka) spada uoperatore, i obiµcno se naziva operator razluµcivosti, vidokruga ili dosega (engl. scope oper-ator). Unutar funkcije µclanice direktno se pristupa atributima dan, mjesec i godina beznavo�enja na koji se konkretni objekt ovi atributi odnose. Ovakvu privilegiju, direktnogpristupa atributima klase, imaju iskljuµcivo funkcije µclanice te klase. Funkcije µclaniceklase nikad se ne pozivaju samostalno nego se uvijek primjenjuju nad nekim konkretnim

128

Page 133: Algoritmi i programiranje

objektom (osim kada se neka funkcija µclanica poziva iz druge funkcije µclanice iste klase),tako da se samostalno upotrijebljeni atributi unutar funkcije µclanice zapravo odnose naatribute onog objekta nad kojim je funkcija µclanica pozvana. Poziv d1.Postavi(14,5, 2004) znaµci da se atributi dan, mjesec i godina unutar funkcije µclanice Postaviodnose na odgovarajuce atribute objekta d1 tj. interpretiraju se kao d1.dan, d1.mjeseci d1.godina.

Pristup atributu dan je moguc na dva naµcina. Jedan je eksplicitno kori�tenje pokazivaµca(pointera) this. Funkcija Postavi mogla je biti napisana kao na Algoritmu 10.

Algoritam 10void Datum::Postavi(int dan, int mjesec, int godina){

int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(godina % 4 == 0 && godina % 100 != 0 jj godina % 400 == 0)

broj_dana[1]++;if(godina < 1 jj dan < 1 jj mjesec < 1 jj mjesec > 12 jj dan >

broj_dana[mjesec -- 1])throw "Neispravan datum!nn";

this->dan = dan; this->mjesec = mjesec; this->godina = godina;}

Drugi, mnogo µce�ci, naµcin je upotreba operatora razluµcivosti �::�. Notacija Datum::daneksplicitno nagla�ava da se misli na atribut dan koji pripada klasi Datum. Stoga se metodaPostavi moµze napisati i na naµcin dat na Algoritmu 11.

Algoritam 11void Datum::Postavi(int dan, int mjesec, int godina){

int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(godina % 4 == 0 && godina % 100 != 0 jj godina % 400 == 0)

broj_dana[1]++;if(godina < 1 jj dan < 1 jj mjesec < 1 jj mjesec > 12 jj dan >

broj_dana[mjesec -- 1])throw "Neispravan datum!nn";

Datum::dan = dan; Datum::mjesec = mjesec; Datum::godina = godina;}

Bitno je istaci razliku izme�u operatora �.�(taµcka) i �::�(scope). Operator �.�se uvijekprimjenjuje na neki konkretan objekt. Tako, d1.dan oznaµcava atribut dan konkretnogobjekta d1. Sa druge strane, operator �::� se primjenjuje nad samom klasom, kaoapstraktnim tipom podataka. Tako, Datum::dan oznaµcava atribut dan koji pripada klasiDatum, bez speci�kacije na koji se konkretan objekt klase Datum taj atribut odnosi. Iztog razloga, ovakva upotreba atributa dan moµze imati smisla jedino unutar de�nicije nekemetode.

Kako bi se sprijeµcila situacija da se metoda Postavi zaobi�e i direktnom postavkomatributa dan, mjesec i godina upi�e besmislen datum uvodi se mehanizam kljuµcnih rijeµci

129

Page 134: Algoritmi i programiranje

private i public. One se koriste iskljuµcivo unutar deklaracija klase a iza njih uvijekslijedi znak �:� (dvotaµcka). Njima se speci�cira privatni i javni dio klase. Neka jedeklaracija klase Datum izmijenjena kao na Algoritmu 12.

Algoritam 12struct Datum{

private:int dan, mjesec, godina;

public:void Postavi(int d, int m, int g);

};

Na ovaj naµcin nisu moguce deklaracije kao �to su

d1.dan=20;cout<<d1.dan;

Privatni atributi su jednostavno nedostupni za ostatak programa osim za funkcije µclaniceklase i prijateljske funkcije klase ! Da bi klasa Datum imala smisla, osim postavljanjadatuma se dodaju i druge funkcije odnosno metode. Primjer je metoda Ispisi() kojaispisuje datum na ekran. Primjer izmjene je na Algoritmu 13.

Algoritam 13struct Datum{

private:int dan, mjesec, godina;

public:void Postavi(int d, int m, int g);void Ispisi();

};

Primjer implementacije metode Ispisi je na Algoritmu 14.

Algoritam 14void Datum::Ispisi(){

cout << dan << "." << mjesec << "." << godina << ".";}

Sada je moguce napisati sljedeci niz naredbi:Datum d;d.Postavi(14, 5, 2004);cout << "Upisan je datum ";

130

Page 135: Algoritmi i programiranje

d.Ispisi();

Klasa Datum se moµze sada dopuniti drugim metodama kao �to su :

� Prikaµzi dan (u nekim paketima poznato kao funkcija Day())

� Prikaµzi mjesec (u nekim paketima poznato kao funkcija Month())

� Prikaµzi godinu (u nekim paketima poznato kao funkcija Year())

� Oµcitavanje datuma

Primjer de�nicije klase Datum sa nekim dodatnim metodama je na Algoritmu 15.

Algoritam 15class Datum{

int dan, mjesec, godina;public:

void Postavi(int d, int m, int g);void Ocitaj(int &d, int &m, int &g)

{ d = dan; m = mjesec; g = godina;}int VratiDan() { return dan; }int VratiMjesec() { return mjesec; }int VratiGodinu() { return godina; }char *ImeMjeseca();void Ispisi() {cout << dan << "." << mjesec << "." << godina

<< ".";}void IspisiMj();

};

Zadatak. U ovu deklaraciju dodati metode ispisa u formatima :

� dd.mm.gggg u kojem su dan i mjesec dati sa dvije a godina sa µcetiri cifre

� dd/mm/gggg u kojem su dan i mjesec dati sa dvije a godina sa µcetiri cifre

� mm.dd.gggg u kojem su dan i mjesec dati sa dvije a godina sa µcetiri cifre

� mm/dd/gggg u kojem su dan i mjesec dati sa dvije a godina sa µcetiri cifre

U algoritmu 15 metode su implementirane u okviru deklaracije klase �to se naziva in-line deklaracija. Komplikovanije metode se trebaju implementirati van deklaracije klase,posebno u sluµcajevima kada te metode sadrµze petlje i komplikovanije uslove. Na algoritmu16 je dat primjer metode SljedeciDatum().

Na Algoritmu 17 je metoda kojom se ispisuje naziv mjeseca u datumu.

Na algoritmu 18 je metoda kojom se datum ispisuje tako da je naziv mjeseca ispisanslovima.

131

Page 136: Algoritmi i programiranje

Algoritam 16void Datum::SljedeciDatum(){

int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(godina % 4 == 0 && godina % 100 != 0 jj godina % 400 == 0)

broj_dana[1]++;dan++;if(dan > broj_dana[mjesec - 1]){

dan = 1; mjesec++;}if(mjesec > 12){

mjesec = 1; godina++;}

}

Algoritam 17char *Datum::ImeMjeseca() const{

char *nazivi_mj[] = {"Januar", "Februar", "Mart", "April","Maj", "Juni", "Juli", "August", "Septembar", "Oktobar", "Novembar","Decembar"};

return nazivi_mj[mjesec - 1];}

Algoritam 18void Datum::IspisiMj() const{

cout << dan << ". " << ImeMjeseca() << " " << godina << ".";}

132

Page 137: Algoritmi i programiranje

Sve metode se mogu podijeliti u dvije kategorije : inspektori i mutatori.

Metode iz prve kategorije samo µcitaju atribute klase, ali ih ne mijenjaju. U na�em sluµcajuto su Ocitaj, VratiDan, VratiMjesec i sliµcno. U jeziku C++ se smatra dobrom praksomposebno oznaµciti funkcije inspektore kljuµcnom rijeµci const. Tako oznaµcene funkcije nazi-vaju se konstantne funkcije µclanice. Na taj naµcin se omogucava kompajleru prijava gre�ke usluµcaju da unutar metode za koju je poznato da treba biti inspektor poku�a promjena vri-jednosti nekog od atributa. Pomocu kljuµcne rijeµci const moguce je de�nirati konstantneobjekte, na isti naµcin kao i npr. cjelobrojne konstante.

Metode iz druge kategorije mijenjaju atribute klase nad kojom su primijenjene. U na�emsluµcaju to je metoda Postavi.

Zadatak. U deklaraciju klase Datum dodati sljedece metode:

� Ispis datuma kao redni broj dana u godini i godina. Naprimjer, datum 24.10.2013se na ovaj naµcin prikazuje u obliku 297.2013.

Zadatak. Zadat je datum dd.mm.gggg. Izraµcunati :

� Broj dana u godini tog datuma

� Datum koji se dobije kad se na datum doda odabrani broj dana

� Datum koji se dobije kad se od datuma oduzme odabrani broj dana

� Gregorijanski datum pretvoren u julijanski datum. Poznato je da julijanski kaledarkoristi pravoslavna crkva a Izme�u ova dva kalendara postoji razlika od 13 dana4

na naµcin da je "gregorijanski_datum" - "julijanski_datum" = 13

Zadatak. Zadat je datum dd:mm:gggg, pri µcemu je gggg > 1900. Uraditi sljedece :

� Odrediti koji dan u sedmici (Ponedjeljak, ..., Nedjelja) odgovara tom datumu.Pritom je poznato da je 01.01.1901 bio ponedjeljak

� Odrediti koliko petaka ima datum 13 u godini tog datuma. Problem generaliziratiza bilo koji datum i dan u sedmici

� Na izlaz dati kalendar odabranog mjeseca te godine

Zadatak. Data su dva datuma d1.m1.ggg1 i d2.m2.ggg2. Uraditi sljedece:

� Zamjena dva datuma ako je prvi od njih veci od drugog

� Broj dana izme�u dva datuma. Na osnovu toga izraµcunaj svoju starost izraµzenubrojem dana

� Broj mjeseci izme�u dva datuma

� Broj cijelih godina izme�u dva datuma4Da li znate za�to je razlika ba�13 dana ?

133

Page 138: Algoritmi i programiranje

12.3 Zakljuµcak

Obim i sadrµzaj ovog kursa ne daje prostor da se u vecoj mjeri obra�uju svojstva imogucnosti C++ jezika. Iz tog razloga ovdje su date samo neke glavne karakteristikekoje omogucavaju razumijevanje i pisanje programa na elementarnom nivou.

134

Page 139: Algoritmi i programiranje

13 NP kompleksnost

Tokom 60-ih godina napravljeni su veliki pomaci u nalaµzenju e�kasnih rje�enja za mnogekombinatorne probleme ali je nastala rastuca lista problema za koje se µcinilo da ne postojie�kasno algoritamsko rje�enje. Ljudi su poµceli traµziti neku nepoznatu paradigmu koja bivodila ka rje�enju tih problema ili dokaz da su moµzda ti problemi sami po sebi te�ki zarje�avanje i da ne postoje algoritamska rje�enja koja rade ispod eksponencijalnog vremena.

Krajem 60-ih napravljeno je veliko otkrice. Mnogi od ovih problema su me�usobnopovezani u smislu da ako je bilo koji od njih bilo moguce rije�iti u polinomijalnom vremenutada bi se mogao rije�iti svaki od njih. Otkrice je skrenulo paµznju na NP -kompletnosti kreiran je moµzda najveci problem u kompjuterskoj nauci : P = NP ? Cilj vi�e nijedokazati da problem moµze biti e�kasno rije�en prezentiranjem algoritma. Umjesto togapoku�ava se pokazati da problem ne moµze biti rije�en e�kasno. Kako to uµciniti ?

Potreban je neki naµcin da se klasa e�kasno rje�ivih problema odvoji od problema kojine mogu biti e�kasno rije�eni. To se moµze uµciniti analizom problema koji mogu bitirije�eni u polinomijalnom vremenu. Zadatak da se dokaµze da ne�to ne moµze biti uµcinjenoe�kasno mora se analizirati mnogo paµzljivije kako se ne ostavila mogucnost bilo komeda pravila kr�i na neprihvatljiv naµcin i istovremeno tvrdi da postoji e�kasno rje�enje akotakvo rje�enje stvarno ne postoji.

Jedan od pristupa je mjerenje vremena izvr�enja algoritama kori�tenjem scenarija kom-pleksnosti najgoreg sluµcaja kao funkcije od n, veliµcine ulaza. Postoji vi�e naµcina ali imje zajedniµcki imenitelj broj bitova (ili bajtova) za prezentaciju ulaza kori�enjem razumnoe�kasnog kodiranja. Naprimjer, brojevi se mogu pisati unarnom notacijom 111111111 =1002 = 8 umjesto binarnom; grafovi se mogu opisivati na neki nee�kasan naµcin kao �to jelista svih njegovih ciklusa ali je to neprihvatljivo. Pretpostavka je da se brojevi prikazujuu bazi veceg reda, da su grafovi opisani matricama ili listom itd.

Uobiµcajeno je da se brojevi ograniµce na cijele (kao suprotnost "realnim" brojevima) paje jasno da se aritmetiµcke operacije mogu provoditi e�kasno. Pretpostavka je da se op-eracije sa cijelim brojevima provode u konstantnom vremenu. Radi veceg opreza, moµzese pretpostaviti da aritmetiµcke operacije zahtijevaju barem onoliko vremena kolika jepreciznost brojeva koji su predmet pohrane.

De�nicija. Za algoritam koji zavisi od prirodnih brojeva n1; n2; :::; nr od k1; k2; :::; krbita respektivno kaµze se da radi u polinomijalnom vremenu ako postoje prirodni brojevid1; d2; :::; dr takvi da je broj potrebnih bit operacija za njegovo izvr�enje O

�kd11 ; :::; k

drr

�.

Za problem se kaµze da je rje�iv u polinomijalnom vremenu ako postoji algoritam koji garje�ava u polinomijalnom vremenu.

Neke funkcije koje ne "izgledaju" kao polinomijalne (kao �to je O (n log n)) su ograniµcneodozgo polinomima (kao �to je O (n2)). Neke funkcije koje "izgledaju" kao polinomijalneustvari to nisu. Naprimjer, neka je predmet analize algoritam koji ima ulaz graf veliµcinen i cijeli broj k koji radi u vremenu O

�nk�. On nije polinomijalni jer je k ulazna veliµcina

takva da je korisniku omoguceno da odabere k = n �to povlaµci da je vrijeme izvr�enjaO (nn) a to nije polinom po n. Vaµzno je napomenuti da eksponent mora biti konstantanezavisna od n.

135

Page 140: Algoritmi i programiranje

Naravno, reci da su algoritmi polinomijalnog vremena "e�kasni" nije taµcna. Algoritamµcije je vrijeme izvr�enja O (n1000) je sigurno veoma nee�kasan. Bez obzira na to, akoalgoritam radi lo�ije nego u polinomijalnom vremenu (npr. 2n) tada je sigurno da nijee�kasan osim za male vrijednosti n.

De�nicija. Algoritam je subeksponencijalni ako je njegova sloµzenost funkcija oblikaO�eo(n)

�gdje je n duµzina ulaznog podatka.

13.1 Problemi odluµcivanja

Mnogi od problema ukljuµcuju optimalizaciju u nekoj formi : naci najkraci put, nacinajmanje razapinjuce stablo, naci triangulaciju najmanje teµzine itd. Iz prevashodnotehniµckih razloga najveci dio NP -problema ce biti nazvan problemom odluµcivanja. Prob-lem se naziva problemom odluµcivanja ako je njegov rezultat jedan od odgovora "Da" ili"Ne".

Mnogi problemi se mogu formulisati kao problemi odluµcivanja. Naprimjer, problem na-jmanjeg razapinjuceg stabla se moµze formulisati na sljedeci naµcin : Za dati teµzinski grafG i cijeli broj k da li G ima razapinjuce stablo koje je najvi�e k ?

Ovo se moµze µciniti kao mnogo zanimljivija formulacija problema. Ovdje se ne postavljapitanje teµzine minimalnog razapinjuceg stabla niti za ivice stabla za koje se dostiµze ovateµzina. Me�utim, zadatak je pokazati da odre�eni problemi ne mogu biti rije�eni e�kasno.Ako se pokaµze da jednostavni problem odluµcivanja ne moµze biti rije�en e�kasno tada jesigurno da ni mnogo generalniji problem sigurno ne moµze biti rije�en e�kasno.

U nastavku je nekoliko de�nicija koje su od pomoci u razumijevanju terminologije kojase javlja kad su u pitanju algoritmi odluµcivanja.

De�nicija. Za algoritam se kaµze da je decidan ako na postavljeno pitanje uvijek dajeodgovor Da ili Ne. Za algoritam se kaµze da je vjerovatnosni (engl. probabilistic) akokoristi sluµcajne brojeve.

De�nicija. Da-bazirani Monte Carlo algoritam je vjerovatnosni algoritam za decidneprobleme gdje je odgovor Da uvijek taµcan ali odgovor Ne moµze biti netaµcan. Obratnose de�ni�e Ne-bazirani algoritam Monte Carlo. Kaµze se da Da-bazirani algoritam MonteCarlo ima gre�ku vjerovatnoce " ako je mogucnost da rezultat algoritma bude odgovorNe kada bi taj odgovor trebao biti Da najvi�e ".

De�nicija. Las Vegas algoritam je vjerovatnosni algoritam koji za odre�enu vrstu prob-lema moµze ne dati odgovor sa vjerovatnocom 0 � " < 1. Ako algoritam daje odgovoronda je taj odgovor uvijek korektan.

Dakle, Las Vegas algoritam moµze ne vratiti odgovor ali odgovor koji daje mora biti taµcan,za razliku od Monte Carlo algoritma koji uvijek daje odgovor ali on nije uvijek taµcan.Prema tome, ako se za rje�avanje nekog problema koristi Las Vegas algoritam onda se onjednostavno iznova pokrece ponovo dok se ne dobije odgovor. Vjerovatnoca da algoritamne pruµzi odgovor za m poku�aja puta je "m. Da bi algoritam bio u stanju dati odgovorbroj pokretanja je prosjeµcno 1= (1� ").

136

Page 141: Algoritmi i programiranje

13.2 Problemi prepoznavanja jezika

Potrebno je uoµciti da se o problemu odluµcivanja moµze razmi�ljati kao o problemu prepoz-navanja jezika. Jezik L se moµze de�nisati kao

L = f(G; k) jG posjeduje MST teµzine najvi�e kg

Ovaj skup se sastoji od parova u kojem je prvi element graf (odnosno matrica kodiranakao string) a drugi cijeli broj kodiran kao binarni broj. Na prvi pogled moµze izgledatiµcudno da se graf de�ni�e kao string ali je oµcigledno da se u raµcunaru sve predstavlja uobliku niza (string) bitova.

Ako mu se prezentira string (G; k) algoritam bi trebao dati odgovor "Da" ako (G; k) 2 L�to povlaµci daG posjeduje razapinjuce stablo teµzine najvi�e k i "Ne" u suprotnom sluµcaju.U prvom sluµcaju se kaµze da algoritam "prihvata" ulaz a u suprotnom "odbacuje" ulaz.

Za bilo koji dati jezik se moµze postaviti pitanje koliko te�ko je utvrditi da li je datistring u jeziku ili ne. Naprimjer, u sluµcaju MST jezika L µclanstvo se moµze lako utvrditiu polinomijalnom vremenu. Dovoljno je graf pohraniti interno, pokrenuti Kruskalovalgoritam i vidjeti da li je dobijena optimalna teµzina najvi�e k ili ne.

De�nicija. Neka je sa P oznaµcen skup svih jezika za koje µclanstvo moµze biti testirano upolinomijalnom vremenu.

Potrebno je primijetiti da su jezici skupovi stringova a P je skup jezika. P je de�nisanu terminima kojima se iskazuje koliko je te�ko raµcunarski prepoznati µclanstvo u jeziku.Skup jezika koji je de�nisan u terminima koliko te�ko je utvrditi µclanstvo se zove klasakompleksnosti. S obzirom da se moµze pronaci minimalno razapinjuce stablo u polinomi-jalnom vremenu tada vrijedi da je L 2 P .

Postoji i teµzi jezik

M = f(G; k) : G ima jednostavnu putanju teµzine barem kg

Za dati graf G i cijeli broj k kako bi se prepoznalo da li je on u jeziku M ? Moµze sepoku�ati pretraµzivanje grafa i traµziti jednostavni putevi sve dok se ne na�e neki teµzine k.Ako se takav put prona�e graf se prihvata i posao se prekida. Me�utim, ako se ne na�emoµze se potro�iti puno vremena u pretraµzivanju pa se ne moµze dati pravi odgovor.

Prvi korak je da se de�ni�u razne klase sloµzenosti odluµcivanja.

De�nicija. Klasa sloµzenosti P je skup problema odluµcivanja za koje postoji polinomijalnialgoritam.

U su�tini, to je skup svih problema odluµcivanja koji mogu biti rije�eni u polinomijalnomvremenu. Obiµcno se nazivaju "jednostavni" ili "e�kasno rje�ivi".

De�nicija. Klasa sloµzenosti NP se sastoji od svih problema odluµcivanja za koje seodgovor DA moµze provjeriti u polinomijalnom vremenu kori�tenjem neke dodatne infor-macija zv. certi�kata. Klasa sloµzenost co�NP se de�ni�e analogno za odgovor NE.

137

Page 142: Algoritmi i programiranje

To je skup svih problema odluµcivanja koji mogu biti veri�cirani u polinomijalnom vre-menu. Ova klasa sadrµzi P kao podskup. Stoga, ona sadrµzi veliki broj jednostavnihproblema ali sadrµzi i veliki broj problema za koje se vjeruje da ih je te�ko rije�iti. Oznakane znaµci "NePolinomijalni". Izvorno je ovo oznaka za "Nedeterministiµcko Polinomijalnovrijeme". Ovaj koncept je mnogo lak�e objasniti i shvatiti iz perspektive veri�kacije.

De�nicija. Klasa sloµzenosti NP�te�zak (NP-hard) se sastoji od problema za koje vrijedida ako se jedan od njih moµze rije�iti u polinomijalnom vremenu tada bi svi NP problemibili rje�ivi u polinomijalnom vremenu.

Unatoµc nazivu, NP-te�ko ne znaµci da je problem te�ko rije�iti. Ako je problem NP-teµzakto ne mora znaµciti da je u NP klasi. S obzirom da se vjeruje da nisu svi NP problemirje�ivi u polinomijalnom vremenu vjeruje se da nijedan NP-teµzak problem nije rje�iv upolinomijalnom vremenu.

De�nicija. Problem je NP � kompletan ako je (1) NP, (2) NP-teµzak.

To znaµci da je NPC = NP \NP � te�zak.

De�nicija. Strogo NP-kompletan problem je NP-kompletan problem koji ostaje takavkada su svi brojevi u ulazu ograniµceni nekim polinomom u funkciji duµzini ulaza.

Primjeri ovih algoritama su Satis�ability, Hamiltonov ciklus, Problem tri boje.

Jedan od primjera NP-kompletnog problema je popularna igra Minesweeper [11] koja jeuobiµcajeni dio instalacije Windows operativnog sistema, sa brojnim varijacijama. Igraµcove igre ne treba poga�ati da li je kvadrat sigurno slobodan. Sliµcno, igraµc markira svakuminu koja sigurno moµze biti identi�cirana. µCinjenica da je Minesweeper NP-kompletanproblem znaµci da je veoma te�ko pogoditi kada je moguce sigurno oµcistiti neki kvadratuz potpuno znanje o tome. Drugim rijeµcima, potreban je odre�eni stepen poga�anja. Usu�tini, ako je i unaprijed reµceno da poga�anje nije potrebno jo�uvijek moµze biti te�koodluµciti kada je kvadrat prazan ili zauzet.

Moguci odnosi problema po kompleksnosti

138

Page 143: Algoritmi i programiranje

Slika ilustruje jedan od mogucih naµcina interpretacije kako bi mogao izgledati odnosskupova P, NP, NP-teµzak, NP-kompletan. Nagla�eno je "moguci odnos" jer jo� nijepoznato da li su ove klase kompleksnosti disjunktne ili su sve rje�ive u polinomijalnomvremenu. Neki od problema na slici iziskuju dublju diskusiju. Jedna od njih se odnosi naIzomor�zam grafova u kojem se postavlja pitanje da li su dva grafa identiµcna do nivoaimena njihovih ivica. Poznato je da je problem NP ali nije poznato da li je u P. Drugi jeQBF �to je skracenica za Quanti�ed Boolean Formulas. U tom problemu su date bulovskeformule sa kvanti�katorima 8 i 9 i potrebno je dati odgovor na pitanje da li je formulataµcna ili ne.

13.3 Veri�kacija polinomijalnog vremena i certi�kati

Vaµzno je dati napomene o algoritmima veri�kacije. Mnogi problemi prepoznavanja jezikasu te�ki za rje�avanje ali imaju svojstvo da je lako veri�kovati da li je string jezik.

Kao primjer ce biti uzet problem Hamiltonovog ciklusa. Za dati neusmjereni graf G sepostavlja pitanje da li postoji ciklus koji obilazi sve µcvorove taµcno jednom. Ovaj problemse moµze opisati kao problem prepoznavanja jezika

HC = f(G) : G ima Hamiltonog ciklusg

gdje je sa (G) oznaµcava graf kao string. µCini se da je problem Hamiltovnog ciklusa mnogoteµzi i nije poznat algoritam u polinomijalnom vremenu koji rje�ava ovaj problem.

Na slici je primjer ciklusa koji je Hamiltonov i jednog koji to nije. Ako se po�e odpretpostavke da je graf imao Hamiltonov ciklus tada bi trebao biti jednostavan zadatakda se to potvrdi. Ako se uzme ciklus npr. hv3; v7; :::; v13i tada bi se graf mogao ispitatii provjeriti da li je to stvarno legalan ciklus koji obilazi sve µcvorove grafa taµcno jednom.Stoga, iako nije poznat e�kasan naµcin da se rije�i problem Hamiltonovog ciklusa postojiveoma e�kasan naµcin veri�kacije (provjere) da li je dati graf uHC. Dati ciklus je certi�kat.To je dio informacije koji omogucava da se veri�kuje da je dati string jezik.

Formalno, za dati jezik L i za x 2 L algoritam veri�kacije je algoritam koji za dato x idato y, koje se naziva certi�kat, moµze veri�cirati da je x u jeziku L koristeci taj certi�katkao pomoc. Ako x nije u L tada nema niµcega za veri�kaciju.

Treba uoµciti da nemaju svi jezici svojstvo da ih je lako veri�cirati. Naprimjer, neka sudati sljedeci jezici :

139

Page 144: Algoritmi i programiranje

UHC = f(G) : G ima jedinstveni Hamiltonov ciklusgHC = f(G) : G nema Hamiltonov ciklusg

Neka je graf G u jeziku UHC. Koja bi informacija trebala biti data koja bi omogucilada se veri�kuje da je G stvarno jezik ? Moµze se dati primjer jedinstvenog Hamiltonovogciklusa i to bi se moglo veri�cirati ali koja vrsta certi�kata je potrebna kako bi se utvrdiloda je to jedini graf ? Moµze se uzeti drugi ciklus koji nije Hamiltonov ali to ne znaµci danema drugog ciklusa koji jeste Hamiltonov. Moµze se poku�ati sa svim ciklusima teµzine nali bi to uop�te ne bi bilo e�kasno jer postoji ukupno n! ciklusa. Stoga je te�ko zamislitida se moµze dati informacija koja bi omogucila da se e�kasno uvjerimo da je dati graf ujeziku.

13.3.1 NP klasa

Kako je reµceno, NP se de�ni�e kao skup svih jezika koji mogu biti veri�cirani algorit-mom u polinomijalnom vremenu. Za�to je dat naziv NP umjesto VP ? Originalan nazivje skracenica od "Nedeterministiµcko Polinomijalno vrijeme". Ovo se odnosi na programkoji se izvr�ava na nedeterministiµckom raµcunaru koji se moµze zamisliti. U osnovi, takavkompjuter bi mogao nedeterministiµcki pogoditi vrijednost certi�kata i zatim veri�ciratiu polinomijalnom vremenu da je string u jeziku. Ovdje je izbjegnuta de�nicija nedeter-minizma.

NP je, kao i u sluµcaju P, skup jezika zasnovan na nekoj mjeri kompleksnosti (komplek-snost veri�kacije). Potrebno je uoµciti da je P � NP . Drugim rijeµcima, ako se problemmoµze rije�iti u polinomijalnom vremenu tada se µclanstvo sigurno moµze veri�cirati u poli-nomijalnom vremenu.

Nije poznato da li je P = NP . Ne µcini se razumnim da ovo vrijedi. Drugim rijeµcima, bitiu mogucnosti da se veri�kuje da se ima ispravno rje�enje ne pomaµze mnogo u nalaµzenjustvarnog rje�enja. Mnogi eksperti vjeruju da je P 6= NP ali to niko nije dokazao.

Na tabeli je lista NP i odgovarajucih P problema. Na desnoj strani su problemi kojimogu biti e�kasno rije�eni. Na lijevoj strani je skup "tvrdih oraha" koji vec decenijamaodolijevaju naporima za njihovo e�kasno rje�enje.

140

Page 145: Algoritmi i programiranje

Klasa NP kompletnih problema se sastoji od skupa problema odluµcivanja (jezika) za kojeniko ne zna. Ako bi bilo poznato rje�enje u polinomijalnom vremenu makar ijednog NPkompletnog problema tada bi svaki NP problem bio rje�iv u polinomijalnom vremenu.Za ovo je potrebno uvesti koncept redukcije.

Prije toga je potrebno razmotriti sljedece pitanje. Pretpostavimo da postoje dva problemaH i U . Za H se zna (ili µcvrsto vjeruje) da je teµzak odnosno da ne moµze biti rije�en upolinomijalnom vremenu. Sa druge strane, kompleksnost za U je nede�nisana ali sesumnja da je jako teµzak. µZeli se dokazati da U ne moµze biti rije�en u polinomijalnomvremenu. µZeli se pokazati da

(H =2 P )) (U =2 P )

Da bi se ovo pokazalo dokazuje se suprotna tvrdnja

(U 2 P )) (H 2 P )

Drugim rijeµcima, da bi se pokazalo ad U nije rje�iv u polinomijalnom vremenu pret-postavlja se da postoji algoritam kojim se U rje�ava u polinomijalnom vremenu pa seizvodi kontradikcija kojom se pokazuje da H moµze biti rije�en u polinomijalnom vre-menu.

Neka je data podutina koja moµze rije�iti bilo koju instancu problema U u polinomijalnomvremenu. Sve �to je nuµzno u tom sluµcaju je pokazati da se ta rutina moµze koristiti dase problem H moµze rije�ti u polinomijalnom vremenu. Time je problem H reduciran naproblem U . Vaµzno je uoµciti da je ta pretpostavljena rutina u su�tini imaginacija (fantasy).Zna se (ili se µcvrsto vjeruje) da H ne moµze biti rije�en u polinomijalnom vremenu pa sedokaz svodi na to da takva rutina ne moµze postojati �to povlaµci da U ne moµze biti rije�enu polinomijalnom vremenu. Ovo je veoma vaµzno sa stanovi�ta razumijevanja pojma ikoncepta redukcije.

13.3.2 Problem tri boje

Naredni problem je dobro poznat kao NP kompletan pa se µcvrsto vjeruje da ne moµze bitirije�en u polinomijalnom vremenu.

Problem tri boje : Da li svaki µcvor datog grafa G moµze biti oznaµcen jednom od trirazliµcite boje tako da ne postoje dva susjedna µcvora koji imaju istu boju ?

Ovaj tip problema, obiµcno u oznaci 3Col, se javlja u raznim problemima particioniranjapri µcemu je ograniµcenje da dva objekta ne mogu biti u istom setu particije. Pojam"bojenja" dolazi od izvorne primjene u bojenju geografskih karata. Dvije drµzave kojeimaju zajedniµcku granicu bi trebale na mapi biti obojene sa dvije razliµcite boje. Dobro jepoznato da grafovi u ravni mogu biti obojene sa µcetiri boje i za ovakav problem postojialgoritam polinomijalnog vremena. µCini se da je utvr�ivanje da li je to moguce za triboje, µcak i za grafove u ravni, teµzak problem za koji nije poznat algoritam polinomijalnogvremena.

141

Page 146: Algoritmi i programiranje

Na slici su dva grafa od kojih je jedan moguce obojiti na traµzeni naµcin a drugi ne.Problem bojenja sa tri boje ima ulogu H problema za koji se sumnja da je mogucerije�iti u polinomijalnom vremenu.

Neka je U sljedeci problem. Za dati graf G = (V ;E) se kaµze da podskup µcvorova V 0 � Vformira clique ako za svaki par µcvorova u; v 2 V 0 (u; v) vrijedi da je u; v 2 E. To znaµcida je podgraf induciran sa V 0 kompletan graf.

13.3.3 Clique pokrivaµc (cover) (CCov)

Za dati graf G = (V ;E) i cijeli broj k skup µcvorova se moµze podijeliti u podskupoveV1; V2; :::; Vk takve da je

[i

Vi = V i da je svaki Vi clique od G.

Problem Clique pokrivaµca se javlja u aplikacijama klasteringa5. Ivica izme�u dva µcvorase stavlja ako su oni dovoljno sliµcni da budu klasterisani u istu grupu. µZeli se znati da lije moguce klasterisati sve µcvorova u k grupa.

Pretpostavimo da se µzeli rije�iti CCov problem ali nakon uzaludnih i besplodnih napora nemoµze se naci algoritam polinomijalnog vremena. Kako se moµze dokazati da nije izvjesnoda CCov nema rje�enje u polinomijalnom vremenu ? Poznato je da je 3Col NP kompletanproblem pa struµcnjaci vjeruju da 3Col =2 P . Osjeca se da postoji neka veza izme�u ovadva problema. µZeli se dati odgovor na pitanje da li vrijedi

(3Col =2 P )) (CCov =2 P )

�to se pokazuje tako da se dokaµze suprotno tvr�enje

(CCov 2 P )) (3Col 2 P )

Da bi se ovo dokazalo potrebno je pretpostaviti da postoji pristup podrutini CCov (G; k).Za dati graf i cijeli broj k ova podrutina vraca odgovor "istina" ako G ima clique veliµcinek i "neistina" u suprotnom, uz µcinjenicu da ta rutina radi u polinomijalnom vremenu.Kako se sada ovakva rutina koristi za rje�enje dobro poznatog te�kog 3Col problema ?Treba se napisati rutina koja radi u polinomijalnom vremenu za 3Col i koja moµze zvatirutinu CCov (G; k) za bilo koji graf i bilo koji cijeli k.

5Klastering je grupisanje po nekoj osobini sliµcnosti. Pritom se "sliµcnost" de�ni�e u kontekstu problema(Euklidska duµzina, prosjek, ...)

142

Page 147: Algoritmi i programiranje

Oba problema ukljuµcuju particioniranje µcvorova u grupe. Jedina razlika je �to je u jednomproblemu broj klikova dat kao dio ulaza a u drugom je broj klasa �ksiran na 3. Da bi dvaµcvora u problemu clique bila u istoj grupi moraju biti susjedni. U problemu bojenja dvaµcvora ne moraju biti susjedni da bi bili u istoj grupi. Na neki naµcin su problemi gotovojednaki ali zahtjev da budu susjedni je obratan.

Tvrdimo da se problem tri boje moµze reducirati na problem klika na sljedeci naµcin. Zadati graf G za koji se µzeli utvrditi mogucnost bojenja sa tri boje rezultat je par

�G; 3

�gdje G oznaµcava komplement od G. To znaµci da je G graf na istim µcvorovima ali je (u; v)ivica u G ako i samo ako nije ivica u G. Tada se par

�G; 3

�moµze koristiti kao ulaz u

rutinu za klik.

Ovo je ilustrovano na slici.

Tvrdnja. Graf G je moguce obojiti sa tri boje ako i samo ako komplement G imapokrivanje klikom veliµcine 3. Drugim rijeµcima

G 2 3Col,�G; 3

�2 CCov

Dokaz: ()) Ako je G moguce obojiti sa 3 boje neka su V1; V2; V3 tri klase za svaku odboja. Tvrdi se da je to klik pokrivaµc veliµcine 3 za G s obzirom da ako su u i v razliµcitiµcvorovi u Vi tada fu; vg =2 E (G) s obzirom da susjedni µcvorovi ne mogu biti iste boje.Ovo povlaµci da fu; vg 2 E

�G�. Stoga svaki par razliµcitih µcvorova u Vi µcini susjedne u G.

(() Neka je pretpostavka da G ima klik pokrivaµc veliµcine 3 oznaµcen sa V1; V2; V3. Zai 2 f1; 2; 3g se daje µcvorovima u Vi boja i. Smatra se da je to legalno bojenje za G sobzirom da ako su razliµciti µcvorovi u i v u Vi tada slijedi da je fu; vg 2 E (G) s obziromda su zajedniµckom kliku. Ovo povlaµci da fu; vg =2 E

�G�. Stoga dva µcvora iste boje nisu

susjedna.

13.3.4 Redukcija na polinomijalno vrijeme

Sada se ova intuicija prenosi na redukciju jednog problema na drugi putem kori�tenjapoziva rutine kroz veci stepen formalizacije. U navedenom primjeru je izvr�ena konverzijainstance problema tri boje na ekvivalentnu instancu problema pokrivaµca (G; 3).

De�nicija. Kaµze se da je jezik (odnosno problem odluµcivanja) L1 reducibilan na jezikL2 sa polinomijalnim vremenom, u oznaci L1 �P L2, ako postoji raµcunarska funkcija fkoja radi u polinomijalnom vremenu takva da vrijedi

143

Page 148: Algoritmi i programiranje

(8x) (x 2 L1 , f (x) 2 L2)

U navedenom primjeru je pokazano da 3Col �P CCov. Posebno, vrijedi da je f (G) =�G; 3

�. Treba primijetiti da je lako formirati komplement grafa u O (n2) vremenu (tako

�to se zamijene 0 i 1 u odgovarajucoj matrici). Stoga je f izraµcunljiva u polinomijalnomvremenu.

Intuitivno gledano, kad se kaµze L1 �P L2 to znaµci "Ako je problem L2 rje�iv u polinomi-jalnom vremenu tada to vrijedi i za L1". To je zbog toga �to se rutina u polinomijalnomvremenu za L2 moµze primijeniti na f (x) kako bi se utvrdilo da li f (x) 2 L2 ili ekviva-lentno, da li x 2 L1. Stoga, u smislu izraµcunljivosti u polinomijalnom vremenu, L1 nijeteµzi od L2.

Naµcin na koji se ovo koristi NP kompletnost je taµcno obrnut. Obiµcno postoji jak dokazda L1 nije rje�iv u polinomijalnom vremenu pa je redukcija efektivno ekvivalentna kaoda se kaµze "S obzirom da za L1 nije izvjesno da je rje�iv u polinomijalnom vremenu tadani za L2 nije izvjesno da je rje�iv u polinomijalnom vremenu". Stoga je ovo naµcin kakoredukcije polinomijalnog vremena mogu biti kori�tene da se pokaµze da su problemi te�kionoliko koliko su te�ki poznati problemi.

Lema. Ako L1 �P L2 i L2 2 P tada L1 2 P .

Lema. Ako L1 �P L2 i L2 =2 P tada L1 =2 P .

Vaµzna µcinjenica po osnovu reducibilnosti je tranzitivnost. Drugim rijeµcima

Lema. Ako L1 �P L2 i L2 �P L3 tada L1 �P L3.

Razlog je u tome �to ako su dvije funkcije f (x) i g (x) izraµcunljive u polinomijalnomvremenu tada je i njihova kompozicija f (g (x)) izraµcunljiva u polinomijalnom vremenu.Treba obratiti paµznju da se u nekim sluµcajevima termin "redukcija" mijenja terminom"transformacija". Razlika u terminolo�kom smislu moµzda nije velika ali treba voditiraµcuna o tome.

13.4 NP kompletnost

Skup NP kompletnih problema su svi problemi u klasi kompleksnosti NP za koje jepoznato da ako je jedan rje�iv u polinomijalnom vremenu tada to vrijedi za sve njih iobratno, ako jedan od njih nije rje�iv u polinomijalnom vremenu tada nijedan od njihnije rje�iv na taj naµcin. Ovo se matematiµcki formalizuje kori�tenjem oznaka redukcijapolinomijalnog vremena.

De�nicija. Jezik L je NP-teµzak ako

L0 �P L za sve L0 2 NP

Ovdje L ne mora biti u NP.

De�nicija. Jezik L je NP-kompletan ako

� L 2 NP

144

Page 149: Algoritmi i programiranje

� L je NP-teµzak

Da bi se pokazalo da je problem NP kompletan alternativa je, kao obiµcno lak�i put,kori�tenje tranzitivnosti.

Lema. L je NP kompletan ako

� L 2 NP

� L0 2P L za neki poznati NP kompletan jezik L0

µCinjenica da su svi L00 2 NP reducibilni na L0 (s obzirom da je L0 NP kompletan pa timei NP teµzak) i stoga, zbog tranzitivnosti je L00 reducibilan na L povlaµci da je L NP teµzak.

Ovo daje naµcin za dokaz da su problemi NP kompletni u sluµcaju da je poznato da jejedan problem NP kompletan. Naµzalost, µcini se da je gotovo nemoguce dokazati da jejedan problem NP kompletan s obzirom da de�nicija kaµze da moramo biti u mogucnostisvaki problem u NP reducirati na taj problem. Postoji beskonaµcno takvih problema paje te�ko vjerovati u tako ne�to. Cook je pokazao da postoji problem pod nazivom SAT(skracenica za Satis�ability) da je NP kompletan. Da bi pokazali da je drugi problem NPkompletan sve �to trebamo je pokazati da je na�problem NP (a samim tim i reducibilanna SAT) a zatim pokazati da SAT (ili generalno neki poznat NPC problem) moµzemoreducirati na na�problem. Slijedi da je na�problem ekvivalentan sa SAT pod uslovomda se po�tuje rje�ivost u polinomijalnom vremenu.

Ovo je ilustrovano na priloµzenoj slici. Oµcito je da vrijedi P � NP i P � co�NP . Pitanjeje da li je P = NP . Ovo se smatra jednim od najvaµznijih matematiµckih problema i spadau sedam tzv. Millenium Prize Problems. Vecina eksperata smatra da je odgovor NE alito nije i dokazano.

De�nicija. Neka su L1 i L2 dva problema odluke. Kaµzemo da se L1 moµze reducirati upolinomijalnom vremenu na L2, u oznaci L1 � pL2 ako postoji polinomijalni algoritam zarje�avanje L1 koji kao potrpogram koristi algoritam za rje�avanje problema L2 pri µcemuje broj poziva tog programa tako�er polinomijalan.

145

Page 150: Algoritmi i programiranje

Drugim rijeµcima, ako je L1 � pL2 tada L1 nije bitno teµzi od L2.

De�nicija. Problem odluke L je NP-potpun ako je L 2 NP i L1 � pL za svaki L1 2 NP .Klasa svih NP potpunih problema se oznaµcava sa NPC.

NP potpuni problemi su najteµzi problemi u klasi NP . Postojanje polinomijalnog algo-ritma za bilo koji od NP potpunih problema bi povlaµcilo da vrijedi P = NP . Kakose vjeruje da ova jednakost ne vrijedi to je i postojanje ovakvog algoritma je jako malovjerovatno.

146

Page 151: Algoritmi i programiranje

14 Literatura

References

[1] Azali Saudi, Analysis of Algorithms, Lecture Notes, July 2008

[2] Hasan Jamak, Teorija brojeva, materijali za nastavu na postdiplomskim studijamana PMF Tuzla

[3] Miodrag µZivkovic, Algoritmi, Matematiµcki fakultet, Beograd, 2000.

[4] S. A. Abramov, G. G. Gnezdilova, E. N. Kapustina, M. I. Selyun, Zadachi po pro-gramirovaniyu, Bibilotechka programmista, Moskva, "Nauka", 1988

[5] Don Colton, A Quick Guide to Big Oh, Brigham Young University Hawaii

[6] Niklaus Wirth, Algorithms and data structure,

[7] Grzegorz Malewicz, Introduction to Computer Algorithms, Lecture Notes (under-graduate CS470 course), 2005

[8] Marty Stepp, TCSS 342 Lecture Notes, Course Overview, Review of Math Concepts,Algorithm Analysis and Big-Oh Notation, University of New York, 2005

[9] David Mount, Design and Analysis of Computer Algorithm, Department of Com-puter Science, University of Maryland, Fall 2003

[10] www.wikipedia.com

[11] Richard Kaye, Some Mineseeper Con�gurtions, School of Mathematics, The Univer-sity of Birmingham, Birmingham, 31.03.2007.

[12] Recommendation for Random Number Generation Using Deterministic Random BitGenerators (Revised), NIST Special Publication 800-90, Mart 2007

[13] Richard Kaye, Minesweeper and NP-completness,http://web.mat.bham.ac.uk/R.W.Kaye/minesw/ordmsw.htm

147