Skripta iz predmeta 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
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]
Sadrµzaj 1 Opšti pojmovi o algoritmima 1.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1
2 Linijski i algoritmi i 2.1 Uvod . . . . . . . 2.2 Zadaci . . . . . . 2.3 Zadaci za vjeµzbu
algoritmi . . . . . . . . . . . . . . . . . .
grananja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 6 6 14
3 Cikliµcni algoritmi 3.1 Uvod . . . . . . . 3.2 Nizovi i matrice . 3.3 Zadaci . . . . . . 3.4 Zadaci za vjeµzbu
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
15 15 16 18 35
4 Analiza kompleksnosti algoritama na primjerima 4.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Analiza kompleksnosti nekih tipova algoritama . . . 4.3.1 Algoritmi konstantnog vremena . . . . . . . 4.3.2 Algoritmi u linearnom vremenu . . . . . . . 4.3.3 Algoritmi sa kvadratnim vremenom . . . . . 4.3.4 Algoritmi sa logaritamskim vremenom . . . p 4.3.5 Algoritmi brzine n . . . . . . . . . . . . . 4.3.6 Algoritmi sa eksponencijalnim vremenom . . 4.3.7 Kombinacije algoritama . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
41 41 41 43 43 44 44 45 45 46 46
. . . . .
48 48 48 48 49 50
6 Analiza kompleksnosti - nastavak 6.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . .
52 52 52 55
7 Rekurzije 7.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . .
56 56 58 62
8 Euklidov algoritam 8.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Kako radi Euklidov algoritam ? . . . . . . . . . . . . . . . . . . . . . . . 8.3 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . .
65 65 65 68
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
5 Asimptotska procjena sloµzenosti algoritma 5.1 Uvod . . . . . . . . . . . . . . . . . . . . . 5.1.1 -notacija . . . . . . . . . . . . . . 5.1.2 O-notacija . . . . . . . . . . . . . . 5.1.3 -notacija . . . . . . . . . . . . . . 5.1.4 Primjeri raµcunanja sloµzenosti . . .
i
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
9 Tjuringova mašina 9.1 Uvod . . . . . . . . . . . . . . . . . 9.2 Alan Tjuring . . . . . . . . . . . . 9.3 Alfabet . . . . . . . . . . . . . . . . 9.4 Neformalni opis Tjuringove mašine 9.5 Formalni opis Tjuringove mašine . 9.6 Zadaci . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
69 69 69 70 70 72 74
10 Sortiranja 10.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Sortiranje nizova - osnovne metode . . . . . . . . . . . . 10.2.1 Sortiranje putem umetanja (Insertion sort) . . . . 10.2.2 Shell sort . . . . . . . . . . . . . . . . . . . . . . 10.2.3 Sortiranje putem direktne podjele (Selection sort) 10.2.4 Sortiranje putem zamjene (Bubble sort) . . . . . 10.3 Poboljšane metode (sloµzenost n log n) . . . . . . . . . . . 10.3.1 Merge sort . . . . . . . . . . . . . . . . . . . . . . 10.3.2 Quick sort . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
81 81 81 82 85 88 91 96 96 100
11 Grafovski algoritmi 11.1 Uvod . . . . . . . . . . . . . . . 11.2 Algoritmi pretraµzivanja . . . . . 11.3 Algoritmi najkra´ceg puta . . . . 11.3.1 Dijkstra algoritam . . . 11.4 Pohlepni algoritmi na grafovima 11.4.1 Kruskalov algoritam . . 11.4.2 Primov algoritam . . . . 11.5 Zadaci . . . . . . . . . . . . . . 11.6 Zadaci za samostalni rad . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
104 104 105 106 107 109 111 112 114 118
. . . . . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . .
12 Programski jezik C++ 124 12.1 Rad sa datotekama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 12.2 Klase i objektno programiranje . . . . . . . . . . . . . . . . . . . . . . . 125 12.3 Zakljuµcak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 13 NP kompleksnost 13.1 Problemi odluµcivanja . . . . . . . . . . . . . . . 13.2 Problemi prepoznavanja jezika . . . . . . . . . . 13.3 Veri…kacija polinomijalnog vremena i certi…kati 13.3.1 NP klasa . . . . . . . . . . . . . . . . . . 13.3.2 Problem tri boje . . . . . . . . . . . . . 13.3.3 Clique pokrivaµc (cover) (CCov) . . . . . 13.3.4 Redukcija na polinomijalno vrijeme . . . 13.4 NP kompletnost . . . . . . . . . . . . . . . . . . 14 Literatura
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
135 136 137 139 140 141 142 143 144 147
ii
1 Opšti pojmovi o algoritmima 1.1 Uvod 1.01. Termin "algoritam" je nastao po latinskom prevodu imena matematiµcara iz devetog vijeka, Abu Jafar Muhammad Ibn Musu Al-Khowarizmi, koji se bavio trigonometrijom, astronomijom, geogra…jom, kartogra…jom, a smatra se ocem algebre jer je de…nirao osnovna pravila rješavanja linearnih i kvadratnih jednadµzbi. Njegovi radovi su osnova razvoja mnogih matematiµckih i prirodnih disciplina, me†u njima i raµcunarstva. Prvi zapis algoritma prilago†en raµcunaru pripada Adi Byron iz 1842, pa se zbog ovoga smatra prvom programerkom, a raµcunao je Bernoullijeve brojeve. Raµcunar za koji je napisan je bio analitiµcki stroj koji je zamislio, ali nikad u potpunosti proveo u djelo, Englez Charles Babbage. Analitiµcki stroj je trebao biti prvi programabilni raµcunar, sastavljen u potpunosti od mehaniµckih dijelova. Mehaniµcki dijelovi i …ziµcka glomaznost su glavni razlozi zašto nikad nije završen1 . Algoritam se de…niše na nekoliko naµcina : Algoritam je skup pravila kojima se provodi kalkulacija bilo ruµcno bilo putem mašine Algoritam je procedura od konaµcnog broja koraka kako bi se dobio traµzeni rezultat Algoritam je niz raµcunskih koraka kojima se ulaz transformiše kako bi se dobio izlaz Algoritam je niz operacija koje se izvode nad podacima koji trebaju biti organizovani u strukturama podataka Algoritam je apstrakcija programa koji se treba izvesti na …ziµckoj mašini (model izraµcunavanja) U tekstu [11] algoritam se de…niše kao "jasno speci…ciran matematiµcki process izraµcunavanja; skup pravila koji ako se slijede daju µzeljeni rezultat". U matematici, raµcunarstvu, lingvistici i srodnim disciplinama, algoritam je konaµcan niz dobro de…nisanih naredbi za ostvarenje zadatka, koji ´ce za dato poµcetno stanje završiti u de…nisanom konaµcnom stanju. Iz datih de…nicija se moµze zakljuµciti da je algoritam skup koraka odnosno postupak kojim se odre†eni problem rješava u konaµcnom broju koraka. Istorijski gledano, svi problemi su rješavani nekim vidom algoritma ali je proteklo puno vremena da se napravi odgovaraju´ca formalizacija. 1.02. Koncept algoritma je potekao kao sredstvo zapisivanja postupaka za rješavanje matematiµckih problema, poput pronalaµzenja zajedniµckog djelitelja dva broja ili mnoµzenja dva broja. Koncept je formaliziran 1936. u vidu Turingovog stroja Alana Turinga i lambda raµcuna Alonza Churcha, koji su jedan za drugim postavili temelje raµcunarstva. Najpoznatiji algoritam u istoriji datira mnogo prije vremena starih grka; to je Euklidov algoritam za raµcunanje najve´ceg zajedniµckog djelioca dva cijela broja. 1.03. Algoritmi imaju slijede´ca svojstva: 1
Prije nekoliko godina su britanski inµzinjeri uspjeli sastaviti potpuno funkcionalan ure†aj koji je zamislio Charles Babbage.
1
diskretnost : u odvojenim koracima se izvode diskretne operacije algoritma koje vode ka konaµcnom cilju; konaµcnost : oznaµcava sposobnost algoritma da nakon konaµcnog broja koraka daje izlazne podatke odnosno rezultate; determiniranost : za iste ulazne podatke algoritam uvijek daje iste rezultate masovnost : algoritam je primjenjiv na ve´ci broj ulaznih vrijednosti. Osnovne komponente algoritma su : De…nicija problema Ulazne veliµcine Radne veliµcine Postupak rješavanja Izlaz De…nicija problema treba biti jasna, sadrµzajna i sa dovoljno elemenata kako bi se problem mogao riješiti. Problem se de…niše tekstualno i/ili izrazom. De…nicija problema treba biti egzaktna i nedvosmislena. Ulazne veliµcine de…nišu skup podataka koji su predmet obrade (input). Ove veliµcine mogu biti numeriµcke veliµcine, fajlovi, tekstovi, gra…ka itd. Radne veliµcine su promjenljive koje se koriste u postupku rješavanja problema. Mada se koncept razlikuje po jezicima, svima im je zajedniµcko da zahtijevaju deklaraciju i inicijalizaciju radnih veliµcina. Deklaracija de…niše tip promjenljive a samim tim i njene mogu´ce vrijednosti. Incijalizacija je postupak davanja poµcetnih vrijednosti promjenljivim. Ovo je posebno vaµzno u cikliµcnim algoritmima. U nekim sluµcajevima inicijalizacija se vrši prvom dodjelom vrijednosti. Postupak rješavanja de…niše svaki pojedini korak koji je potreban za rješenje problema, ukljuµcuju´ci deklaracije, inicijalizacije i svaku operaciju koja se obavlja. Izlaz (output) de…niše rezultat rada koji moµze biti numeriµcka veliµcina, skup vrijednosti, datoteka itd. Svaki algoritam mora imati završetak. Pravljenje tzv. vjeµcnih petlji je klasiµcna programerska greška. Potrebno je razlikovati procedure od funkcija. U principu, svaka procedura ima rezultat ali on ne mora biti vidljiv u svim sluµcajevima. Primjer je procedura sortiranja koja se moµze izvršavati kao dio nekog ve´ceg algoritma odnoso uslova za naredne korake. Funkcija mora imati vrijednost i moµze biti µclan u operacijama. 1.04. Programski jezik C++. U programskom jeziku C++ svaka veliµcina koja se koristi u programu mora biti deklarisana prije same upotrebe. Deklaracija ukljuµcuje tip i naziv promjenljive. Osnovni tipovi promjenljivih u C++ su : 2
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 obliku x = m 10t gdje je m 2 (0; 1) a t 2 Z. Dosadašnji uobiµcajeni naziv za m je do sada bio mantisa. U cilju izbjegavanja pogrešnih terminoloških tumaµcenja prihva´cen je termin signi…kand double : realni broj u formi pokretnog zareza dvostruke taµcnosti tj. koristi dva puta više prostora za signi…kand od tipa ‡oat long double : realni broj u formi pokretnog zareza dvostruke taµcnosti tj. koristi tri puta više prostora za signi…kand od tipa ‡oat char : promjenljiva koja se uzima kao tekstualni simbol (engleski : character) a ne broj Ispred numeriµckih tipova se moµze dodati rijeµc unsigned kojom se oznaµcava da broj ne moµze biti negativan. Prostor koji zauzima pojedini numeriµcki tip zavisi od raµcunara i instalacije C++ kompajlera. Da bi se dobio taj podatak potrebno je pokrenuti sljede´ci program : // Primjer 1.1. Podatak o duµzinama tipova promjenljivih u programskom jeziku C++ #include using namespace std; int main() { cout