0% found this document useful (0 votes)
196 views169 pages

Algor Prog 2018 Zim

This document provides materials for algorithms and programming exercises for students in their second year of undergraduate study in the Department of Mathematics at the University of Tuzla. It includes theoretical chapters on various algorithm topics as well as examples of solving practical mathematical problems using algorithms. The text is authored by Dr. Samra Moranjkić and Dr. Zoran Jasak and is intended as a guide for students' independent work on algorithms and programming assignments for the winter semester of the 2018/2019 academic year.

Uploaded by

zjasak
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
196 views169 pages

Algor Prog 2018 Zim

This document provides materials for algorithms and programming exercises for students in their second year of undergraduate study in the Department of Mathematics at the University of Tuzla. It includes theoretical chapters on various algorithm topics as well as examples of solving practical mathematical problems using algorithms. The text is authored by Dr. Samra Moranjkić and Dr. Zoran Jasak and is intended as a guide for students' independent work on algorithms and programming assignments for the winter semester of the 2018/2019 academic year.

Uploaded by

zjasak
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 169

JU UNIVERZITET U TUZLI

Prirodno matematički fakultet


Odsjek matematika

II godina studija Matematike

MATEMATIČKI ALGORITMI
I
PROGRAMIRANJE
Radni materijal za vježbe

Autori :
Dr.sc. Samra Moranjkić
Dr.sc.mat. Zoran Jasak

Decembar 2018. 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 2018/2019. 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 :

Samra Moranjkić, Dr.sci.,

Zoran Jasak, Dr.sci.math.


[email protected]
µ
SADRZAJ µ
SADRZAJ

Sadrµzaj
1 Opšti pojmovi o algoritmima 1
1.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Ulaz i izlaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Linijski i algoritmi i algoritmi grananja 7


2.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Linijski algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Zadaci za vjeµzbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3 Cikliµcni algoritmi 13
3.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Sume i proizvodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Cijeli brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 Nizovi brojeva i znakova . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4 Euklidov algoritam 39
4.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2 Kako radi Euklidov algoritam ? . . . . . . . . . . . . . . . . . . . . . . . 39
4.3 Sloµzenost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.4 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

5 Analiza sloµzenosti algoritama 45


5.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

6 Asimptotska procjena 53
6.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1.1 -notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1.2 O-notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1.3 -notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2 Sloµzenosti nekih tipova algoritama . . . . . . . . . . . . . . . . . . . . . . 55
6.2.1 Algoritmi konstantnog vremena . . . . . . . . . . . . . . . . . . . 55
6.2.2 Algoritmi linearnog vremena . . . . . . . . . . . . . . . . . . . . . 55
6.2.3 Algoritmi kvadratnog vremena . . . . . . . . . . . . . . . . . . . . 55
6.2.4 Algoritmi logaritamskog
p vremena . . . . . . . . . . . . . . . . . . 56
6.2.5 Algoritmi brzine n . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.2.6 Algoritmi eksponencijalnog vremena . . . . . . . . . . . . . . . . 57
6.2.7 Kombinacije algoritama . . . . . . . . . . . . . . . . . . . . . . . 57
6.3 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

7 Rekurzije 63
7.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.2 Rekurentne jednadµzbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.3 Procjena sloµzenosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.4 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Algoritmi i programiranje, V.2 i A.G. 2018/2019, Radni materijal


µ
SADRZAJ µ
SADRZAJ

8 Sortiranja 79
8.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
8.2 Sortiranje nizova - osnovne metode . . . . . . . . . . . . . . . . . . . . . 79
8.2.1 Sortiranje putem umetanja (Insertion sort) . . . . . . . . . . . . . 80
8.2.2 Shell sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.2.3 Sortiranje putem direktne podjele (Selection sort) . . . . . . . . . 86
8.2.4 Sortiranje putem zamjene (Bubble sort) . . . . . . . . . . . . . . 88
8.3 Poboljšane metode (sloµzenost n log n) . . . . . . . . . . . . . . . . . . . . 92
8.3.1 Merge sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
8.3.2 Quick sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

9 Grafovski algoritmi 100


9.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.2 Algoritmi pretraµzivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
9.3 Algoritmi najkraćeg puta . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
9.3.1 Dijkstra algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . 103
9.4 Pohlepni algoritmi na grafovima . . . . . . . . . . . . . . . . . . . . . . . 105
9.4.1 Kruskalov algoritam . . . . . . . . . . . . . . . . . . . . . . . . . 106
9.4.2 Primov algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
9.5 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
9.6 Zadaci za vjeµzbu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

10 Programski jezik C++ 120


10.1 Uvod u C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
10.2 Primjeri iz prethodnih poglavlja . . . . . . . . . . . . . . . . . . . . . . . 123
10.3 Rad sa datotekama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
10.4 Klase i objektno programiranje . . . . . . . . . . . . . . . . . . . . . . . 130

11 NP Sloµzenost 138
11.1 Problemi odluµcivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
11.2 Problemi prepoznavanja jezika . . . . . . . . . . . . . . . . . . . . . . . . 140
11.3 Veri…kacija polinomijalnog vremena i certi…kati . . . . . . . . . . . . . . 142
11.3.1 NP klasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
11.3.2 Problem tri boje . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
11.3.3 Clique pokrivaµc (cover) (CCov) . . . . . . . . . . . . . . . . . . . 145
11.3.4 Redukcija na polinomijalno vrijeme . . . . . . . . . . . . . . . . . 146
11.4 NP kompletnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

12 Zadaci mješovitog tipa 150


12.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
12.2 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

13 Literatura 165

Algoritmi i programiranje, V.2 ii A.G. 2018/2019, Radni materijal


1 OPŠTI POJMOVI O ALGORITMIMA

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…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šen.

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

Algoritam je skup pravila kojima se provodi kalkulacija bilo ruµcno bilo putem mašine

Algoritam je procedura od konaµcnog broja koraka kako bi se dobio traµzeni rezultat

Algoritam je niz raµcunskih koraka kojima se ulaz transformiše kako bi se dobio izlaz

Algoritam je niz operacija koje se izvode nad podacima koji trebaju biti organizo-
vani u strukturama podataka

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


izraµcunavanja)

U tekstu [11] algoritam se de…niše kao "jasno speci…ciran matematiµcki process izraµcuna-
vanja; skup pravila koji ako se slijede daju µzeljeni rezultat". U matematici, raµcunarstvu,
lingvistici i srodnim disciplinama, algoritam je konaµcan niz dobro de…nisanih naredbi
za ostvarenje zadatka, koji će 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ća
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ćeg zajedniµckog djelioca dva cijela broja.

1.03. Algoritmi imaju slijedeća svojstva:

Algoritmi i programiranje, V.2 1 A.G. 2018/2019, Radni materijal


1.1 Uvod 1 OPŠTI POJMOVI O ALGORITMIMA

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ći 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će 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ći deklaracije, inicijalizacije i svaku operaciju koja se obavlja.

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

Svaki algoritam mora imati završetak. Pravljenje tzv. vjeµcnih petlji je klasiµcna pro-
gramerska greška. Potrebno je razlikovati procedure od funkcija. U principu, svaka pro-
cedura 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ćeg algoritma odnoso uslova za naredne
korake. Funkcija mora kao rezultat imati vrijednost i moµze biti µclan u operacijama.

1.04. Algoritme je moguće klasi…cirati po raznim kriterijima:

Klasi…kacija s obzirom na tok

Linijski algoritmi se izvršavaju korak po korak, bez vraćanja na neki od prethod-


nih koraka niti se neki od koraka ili grupa koraka ponavlja u bilo kom smislu. Ovi
algoritmi mogu sadrµzavati i grananja, mjesta na kojima se postupak nastavlja nakon
ispitivanja odre†enog uslova.

Cikliµcni algoritmi se realizuju na naµcin da se ponavlja odre†eni korak ili grupa


koraka. Ponavljanje se moµze realizovati na dva naµcina :

Algoritmi i programiranje, V.2 2 A.G. 2018/2019, Radni materijal


1.1 Uvod 1 OPŠTI POJMOVI O ALGORITMIMA

- Putem brojaµca, kojim se zadaje koliko puta se odabrani korak ili grupa koraka
ponavlja. Bitno je napomenuti da se u ovom tipu ciklusa zadati broj koraka ne
moµze mijenjati u toku samog izvršenja
- Putem uslova za koji se ne zna unaprijed koliko puta će se izvršiti. Ovo je sluµcaj
npr. kada se µzeli postići odre†ena taµcnost u raµcunanju; najµcešće nije poznato koliko
koraka treba napraviti da bi se taµcnost postigla pa se traµzi drugi naµcin.

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

Klasi…kacija prema implementaciji

Rekurzivni ili iterativni: Rekurzivni algoritam je algoritam koji poziva samog


sebe sve dok se ne postigne odre†en uslov. Rekurzivni algoritmi su vrlo µcesto
usko vezani uz implementaciju pojedine matematiµcke funkcije na primjer raµcunanja
Fibbonaµcijevih brojeva. Iterativni algoritmi su oni u kojima je rezultat jednog
koraka ujedno ulaz u naredni korak. Vaµzno je napomenuti da je svaki rekurzivni
algoritam moguće pretvoriti u iterativni, i da je svaki iterativni algoritam moguće
pretvoriti u rekurzivni, iako ponekad to pretvaranje moµze biti vrlo kompleksno.

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

Deterministiµcki ili stohastiµcki: Deterministiµcki algoritam je algoritam koji će


pri svakom izvršavanju u bilo kojim uslovima od istog unosa doći do istog izlaza
na naµcin da svaki put slijedi identiµcan niz naredbi. Stohashiµcki algoritam barem u
jednom 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šenje
nemoguće naći.

Klasi…kacija prema strategiji rješavanja

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

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

Algoritmi i programiranje, V.2 3 A.G. 2018/2019, Radni materijal


1.1 Uvod 1 OPŠTI POJMOVI O ALGORITMIMA

Dinamiµcki algoritmi: Metodama dinamiµckog programiranja rješavaju se višefazni


procesi, tj. procesi u kojima se donosi niz me†usobno zavisnih odluka. Dinamiµcko
programiranje poznato je i pod nazivom metoda donošenja višefaznih odluka.

Pohlepni algoritmi (greedy): Pohlepni algoritam koristi metaheuristiku za rješa-


vanje problema, takvu da u svakom koraku, bez izuzetka, bira rješenje koje odgo-
vara nekom kriteriju optimalnosti, u nadi da će tako iznaći globalni optimum. Ovi
algoritmi ne daju uvijek najbolje rješenje već brzu aproksimaciju najboljeg rješenja.

Algoritmi za sortiranje i pobrojavanje (search and enumeration): Algoritmi


sortiranja sluµze za brzo sortiranje podataka, npr. niza brojeva. Mnogi se problemi
mogu rješavati teorijom grafova.

1.05. Algoritmi se predstavljaju gra…µcki i tekstualno.

Gra…µcko predstavljanje se realizuje putem standardnih simbola koji predstavljaju po-


jedine korake i koji se povezuju linijama kao prikaz toka operacija. Pritom se dijagram
pravi tako da ide odozgo prema dolje s lijeva na desno.

Tekstualno predstavljanje moµze biti putem pseudokoda ili putem odabranog program-
skog jezika. Pseudokod nije vezan ni za jedan speci…µcan programski jezik. U radu ćemo
koristiti sljedeće 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) upisati


vrijednost promjenljive b". u C++ programskom jeziku to se piše kao "a=b" i znaµci
da se na lokaciju promjenljive a smješta sadrµzaj promjenljive b. Ovo se razliku je
od 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 programskom
jeziku C++ se prepoznaje kao struktura

Algoritam 1.1 If ... else ... 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 je
g1<g2 tada korak mora biti pozitivan, u suprotnom je negativan. U programskom
jeziku C++ for ovo je struktura

Algoritam 1.2 for ... struktura


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

Algoritmi i programiranje, V.2 4 A.G. 2018/2019, Radni materijal


1.2 Ulaz i izlaz 1 OPŠTI POJMOVI O ALGORITMIMA

Primjer :
for(i=1;i 100;i++)
znaµci da će se promjenljiva i imati poµcetnu vrijednost 1 (i = 1), da će se u svakom koraku
povećavati za 1 (i + +, posebna konvencija C++ jezika) sve dok se ne dobije vrijednost
manja ili jednaka 100.

SveDokJe (<uslov>) : poµcetak ciklusa u kojem, u pravilu, nije poznat broj ko-
raka. Ciklus se izvršava sve dok vrijedi <uslov>. U programskom jeziku C++ ovo
je struktura while(...){...}

Radi {...} SveDokNije(<...>) : ciklus u kojem se uslov ispituje na kraju (a ne


poµcetku) petlje što znaµci da se mora izvršiti bar jednom. U nekim programskim
jezicima je to Do ... Until() struktura

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


naredba

Poseban vid logiµcke strukture su tzv. sluµcajevi. Koristi se ako imamo više uslova, npr.
tri ili više, koje trebamo ispitivati. Osnovna forma je:

Algoritam 1.3 Sluµcajevi


AkoJe(...)
Sluµcaj (uslov 1) {...}
Sluµcaj (uslov 2) {...}
...
Sluµcaj (uslov n) {...}

Svaki od sluµcajeva je zaseban blok. Pritom veliµcina moµze zadovoljavati više uslova uslov
1, uslov2, ... Primjer je u nastavku.

Algoritam 1.4 Sluµcajevi


AkoJe(X)
Sluµcaj (X < 0) {...}
Sluµcaj (X = 0) {...}
...
Sluµcaj (X > 0) {...}

1.2 Ulaz i izlaz


Ulazne veliµcine za algoritam se mogu zadavati na razne naµcine. Jedan od µcestih naµcina
u praksi je da se podaci, posebno masovnog tipa, dobijaju iz nekog izvora koji moµze biti
datoteka ili neki drugi izvor (npr. drugi program). Ovaj tip ulaza se naziva tok (engl.
stream) i za njega se koriste naredbe koje se navode u nastavku.

Otvori() : Na ovaj naµcin ’otvaramo’ izvor iz kojeg dobijamo podatke. Jedan


algoritam moµze koristiti više izvora pa svaki od njih treba imati drugaµciji naziv
odnosno oznaku. Na isti naµcin se priprema mjesto na koje se usmjerava izlazni
podatak odnosno rezultat (datoteka, ...)
µ
Citaj(ul) : Na ovaj naµcin sa ulaza ul preuzimamo jedan podatak u jednom mo-
mentu

Algoritmi i programiranje, V.2 5 A.G. 2018/2019, Radni materijal


1.2 Ulaz i izlaz 1 OPŠTI POJMOVI O ALGORITMIMA

Piši(iz,a) : Na ovaj naµcin podatak a upisujemo u izlaz iz, koji moµze biti datoteka,
drugi program i sliµcno. U algoritmima koji slijede ovo je obiµcno naznaµceno kao
Izlaz, osim ako to nije posebno naznaµceno

Zatvori() : Na ovaj naµcin zatvaramo izvor iz kojeg smo preuzimali podatke i


mjesto na koje smo usmjeravali rezultate odnosno izlazne podatke

Algoritmi i programiranje, V.2 6 A.G. 2018/2019, Radni materijal


2 LINIJSKI I ALGORITMI I ALGORITMI GRANANJA

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 svaki
korak izvršava samo jednom. Algoritam moµze sadrµzavati grananja ali se ne vrši povratak
na bilo koji od prethodnih koraka.

2.2 Linijski algoritmi


Primjer 2.1 Napraviti algoritam za raµcunanje sljede´cih vrijednosti : a) min fx; yg; b)
max fx; yg; c) min fx; yg ; max fx; yg.

Rješenje. Ulazne veliµcine za ovaj algoritam su x; y. Ako se traµzi minimum rezultat ne


bi trebao biti samo odgovor koji od dva broja je manji već broj koji se kao rezultat
ispitivanja moµze iskoristiti za neku drugu funkciju, operaciju ili sliµcno. Drugim rijeµcima,
traµzi se da rezultat bude u obliku

M in min fx; yg

Analogno treba vrijediti i za maksimalnu vrijednost. Algoritam za nalaµzenje minimalnog


od dva data broja je na sljedećem dijagramu.

Nalaµzenje minimalnog od dva data broja

U nastavku je pseudokod za ovaj algoritam.

Algoritam 2.1 Nalaµzenje minimalnog od dva broja


Ulaz : x; y
M in x
AkoJe(y < M in)
{ M in y }
Izlaz : M in

Analogni algoritam za nalaµzenje većeg od dva data broja je na sljedećem dijagramu.

Algoritmi i programiranje, V.2 7 A.G. 2018/2019, Radni materijal


2.2 Linijski algoritmi 2 LINIJSKI I ALGORITMI I ALGORITMI GRANANJA

Nalaµzenje većeg od dva data broja

U nastavku je pseudokod za ovaj algoritam.

Algoritam 2.2 Algoritam : Nalaµzenje maksimalnog od dva broja


Ulaz : x; y
M ax x
AkoJe(y < M ax)
{ M ax y }
Izlaz : M ax

Algoritam za istovremeno nalaµzenje najmanjeg i najvećeg od dva data broja je na sljedećem


dijagramu.

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

U nastavku je pseudokod za ovaj algoritam.

Algoritam 2.3 Nalaµzenje i minimalnog i maksimalnog broja


Ulaz : x; y
M in x
M ax y
AkoJe(y < M in)
{ M in y }

Algoritmi i programiranje, V.2 8 A.G. 2018/2019, Radni materijal


2.2 Linijski algoritmi 2 LINIJSKI I ALGORITMI I ALGORITMI GRANANJA

AkoJe(x > M ax)


{ M ax x }
Izlaz : M in; M ax

Karakteristika ovog algoritma je da se rezultat dobija jedino pore†enjem datih veliµcina.

Primjer 2.2 Data su dva broja a i b. Ako su razliµciti zamijeniti ih me†usobno.

Rješenje. Uobiµcajeni postupak njihove zamjene je da se koristi pomoćna promjenljiva


c. Istu operaciju je moguće napraviti bez pomoćne promjenljive. Pseudokodovi za oba
sluµcaja su u nastavku.

Algoritam 2.4 Zamjena dva broja


// Varijanta 1
AkoJe (a 6= b)
{ c a
a b
b c }
// Varijanta 2
AkoJe (a 6= b)
{ b a+b
a b a
b b a }

Primjer 2.3 Napraviti algoritam rješavanja kvadratne jednadµzbe.

Rješenje. Neka je opšta kvadratna jednadµzba data izrazom ax2 + bx + c = 0. Ulazne


veliµcine za algoritam su a; b; c. Najprije se ispituje da li je a 6= 0 : provjera da li zadati
parametri uopšte mogu de…nisati kvadratnu jednadµzbu. Ako je a 6= 0 prelazi se na raµcu-
nanje diskriminante. Znak diskriminante odre†uje prirodu i broj rješenja. Na narednom
dijagramu je gra…µcki prikazan algoritam rješavanja kvadratne jednadµzbe.

Postupak rješavanja kvadratne jednaµcine

Algoritmi i programiranje, V.2 9 A.G. 2018/2019, Radni materijal


2.2 Linijski algoritmi 2 LINIJSKI I ALGORITMI I ALGORITMI GRANANJA

Na dijagramu je vidljiv tok odozgo naniµze, uz dva grananja odnosno mjesta na kojima
se ispituje uslov i donosi odgovarajuća odluka o nastavku. Ovaj isti algoritam se moµze
predstaviti pseudokodom koji je u algoritmu Kvadratna jednadµzba, V.1.

Algoritam 2.5 Kvadratna jednaµcina, V.1


Ulaz : a,b,c
// Prvo se ispituje da li je a = 0 ili ne
AkoJe(a = 0) Kraj
// Izraµcunavanje diskriminante
D b2 4ac
AkoJe(D > 0)
{ // Rješenja psu realna i razliµcita
b D
x1
2a p2a
b D
x2 +
2a 2a
IdiNa Ispis }
Inaµce
{ //Da li je diskriminanta negativna
AkoJe(D < 0)
{ //Rješenja su kompleksna
b
Re
2a
p
D
Im
2a
x1 (Re; Im)
x2 (Re; Im)
IdiNa Ispis }
Inaµce
{ //Rješenja su jednaka
b
x1 = x2
2a
IdiNa Ispis }
}
Ispis : Rješenja kvadratne jednadµzbe

Pseudokod je napisan na naµcin da pojedine naredbe odnosno grupe naredbi odgovaraju


sadrµzaju simbola na gra…konu. Simbolom je oznaµceno da se vrijednost sa desne strane
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 na
verziji 2.

Algoritam 2.6 Kvadratna jednaµcina, V.2.


Ulaz : a,b,c
// Prvo se ispituje da li je a = 0 ili ne
AkoJe(a = 0) Kraj
// Izraµcunavanje diskriminante
D b2 4ac
AkoJe(D > 0) IdiNa Korak1

Algoritmi i programiranje, V.2 10 A.G. 2018/2019, Radni materijal


2.2 Linijski algoritmi 2 LINIJSKI I ALGORITMI I ALGORITMI GRANANJA

AkoJe(D = 0) IdiNa Korak2


// Ako nije ni jedno ni drugo preostaje da je D<0
{ //Rješenja su kompleksna
b
Re
2a
p
D
Im
2a
x1 (Re; Im)
x2 (Re; Im)
// Nakon raµcunanja idi na Ispis i Kraj
IdiNa Ispis }
Korak1:
{ // Rješenja p su realna i razliµcita
b D
x1
2a p2a
b D
x2 +
2a 2a
IdiNa Ispis }
Korak2:
{ //Rješenja su jednaka
b
x1 = x2
2a
IdiNa Ispis }
Ispis : Rješenja kvadratne jednadµzbe

Treći naµcin je da se koristi nabrajanje ’sluµcajeva’(engl. case), kao u nastavku.

Algoritam 2.7 Kvadratna jednaµcina, V.3., nabrajanje sluµcajeva


Ulaz : a,b,c
// Prvo se ispituje da li je a = 0 ili ne
AkoJe(a = 0) Kraj
// Izraµcunavanje diskriminante
D b2 4ac
AkoJe(D)
Sluµcaj 1 : D > 0
{// Rješenja psu realna i razliµcita
b D
x1
2a p2a
b D
x2 +
2a 2a
}
Sluµcaj 2 : D = 0
{// Rješenja psu jednaka
b D
x1
2a 2a
x2 x1
}
Sluµcaj 3 : D < 0
{//Rješenja su kompleksna
b
Re -
2a
Algoritmi i programiranje, V.2 11 A.G. 2018/2019, Radni materijal
2.3 Zadaci za vjeµzbu 2 LINIJSKI I ALGORITMI I ALGORITMI GRANANJA

p
D
Im -
2a
x1 (Re; Im)
x2 (Re; Im)
}
Ispis : Rješenja kvadratne jednadµzbe

Za ovaj naµcin je vaµzno osigurati da uslov iz pojedinog sluµcaja ne bude ukljuµcen u naredne
sluµcajeve.

2.3 Zadaci za vjeµzbu


Zad. 2.1 Dati su realni brojevi x; y. Ne koriste´ci druge operacije osim sabiranja, oduzi-
manja i mnoµzenja izraµcunati vrijednost izraza:

3x2 y 2 2xy 2 7x2 y 4y 2 + 15xy + 2x2 3x + 10y + 6

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

Zad. 2.2 Dat je realan broj a. Koriste´ci se samo mnoµzenjem izraµcunati

a4 , sa dvije operacije a9 , sa µcetiri operacije a21 , sa šest operacija

a6 , sa tri operacije a10 , sa µcetiri operacije


a28 , sa pet operacija
7 15
a , sa µcetiri operacije a , sa pet operacija

a8 , sa tri operacije a13 , sa pet operacija a64 , sa šest operacija

Zad. 2.3 Napraviti algoritam i napisati program kojim se rješava bikvadratna jednadµzba:

ax4 + bx2 + c = 0

Algoritmi i programiranje, V.2 12 A.G. 2018/2019, Radni materijal


µ
3 CIKLICNI ALGORITMI

3 Cikliµcni algoritmi
3.1 Uvod
3.1.01. Cikliµcni algoritmi su strukture u kojima postoji skup operacija koje se ponavl-
jaju. Primjer je raµcunanje vrijednosti polinoma jer se mora osigurati da se iskoriste svi
koe…cijenti. Zbog potrebe konaµcnosti algoritma, mora se osigurati uslov završetka. Kod
cikliµcnih algoritama taj uslov se osigurava ili putem brojaµca koraka ili nekog od uslova,
od kojih je najµcešći uslov taµcnosti.

3.1.02. Ako se koristi brojaµc mora postojati cjelobrojna veliµcina koja ima startnu vrijed-
nost, graniµcnu vrijednost i korak povećanja ili smanjenja. Tada se u pseudokodu koristi
struktura :

Algoritam 3.1 Za ... struktura


Za <promjenljiva> od <g1> do <g2> korak <g3>
{...}

Ovo oznaµcava poµcetak ciklusa u kojem <promjenljiva> mijenja vrijednosti od <g1>


do <g2> sa korakom <g3>. Ako je g1<g2 korak mora biti pozitivan, u suprotnom je
negativan.

3.1.03. Druga varijanta je da se ciklus odvija dok se ne zadovolji neki uslov završetka
koji se ispituje unutar ciklusa. U pseudokodu ovo se oznaµcava strukturom:

Algoritam 3.2 RadiDok ... struktura


SveDokJe (<uslov>)
{...}

U ovom sluµcaju, u pravilu, nije poznat broj koraka. Ciklus se izvršava sve dok vrijedi
<uslov>. Primjer je uslov taµcnosti ali to moµze biti bilo koji drugi uslov. Algoritmi sa
uslovom taµcnosti su oni u kojima je kriterij zaustavljanja µzeljeni stepen raµcunske taµcnosti
koja se postiµze pore†enjem dvije uzastopne parcijalne sume, pore†enjem sa nekom vri-
jednosti koja je referenetna (npr. najbliµzi cijeli broj) ili na neki drugi naµcin.

3.1.04. U cikliµcnim algoritmima se µcesto koriste nizovi. Niz je konaµcni skup vrijednosti
jedne promjenljive u kojem svaki µclan ima svoj ’redni broj’odnosno indeks koji oznaµcava
dimenziju niza. Matrice se posmatraju kao dvodimenzionalni nizovi.

Postoje dva koncepta indeksiranja (rednih brojeva) µclanova niza:

Relativno indeksiranje : Indeks µclana se odre†uje kao ’udaljenost’od prvog µclana


niza koji ima indeks 0

Apsolutno indeksiranje : Indeks µclana odgovara stvarnoj poziciji u nizu

U primjerima koji slijede naznaµcen je naµcin indeksiranja.

3.1.05. Realni broj x se u raµcunaru zapisuje u formatu pokretnog zareza odnosno u


formatu koji odgovara zapisu x = xM 10xE gdje su :

Algoritmi i programiranje, V.2 13 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

xM : Signi…kand, broj xM 2 [1; 10)

xE : Eksponent, cijeli (pozitivni ili negativni) broj

U skladu sa IEEE standardima, u ovoj de…niciji termin "mantisa" je zamijenjen termi-


nom "signi…kand", kako bi se izbjegle terminološke nejasnoće koje se mogu pojaviti zbog
znaµcenja kojeg termin "mantisa" ima za logaritme. U jednom broju tekstova uzima se
da signi…kand ima vrijednosti u intervalu [0; 1) ali je znaµcenje identiµcno.

Broj bitova za pohranu eksponenta i signi…kanda je vezan za arhitekturu raµcunara odnosno


procesora.

3.2 Sume i proizvodi


Primjer 3.1 Izraµcunati vrijednost izraza:

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

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

Rješenje. Da bi broj operacija bio maksimalno smanjen, dati izraz se piše u obliku:

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 sljedeći naµcin:

a 2 x 3; b a x + 4; c b x 5; d c x+6

Ovakav naµcin korištenja promjenljivih je neracionalan jer se svaka od njih koristi samo
jednom. Ako se suma koja se traµzi obiljeµzi promjenljivom S tada se ona moµze iskoristiti
tako da se na svakom koraku u nju upiše nova vrijednost. Simboliµcki, to se piše na sljedeći
naµcin:

S 2 x 3; S S x + 4; S S x 5; S S x+6

Ovdje je vidljivo da se prvi broj raµcuna na jedan a ostala tri na drugi naµcin. Ovo se moµze
promijeniti tako da se u svim koracima koristi isti obrazac sumiranja i mnoµzenja:

S 0
S S x + 2; S S x 3; S S x+4
S S x 5; S S x+6

Ovaj naµcin je bitan i po tome što se prvom naredbom vrši inicijalizacija promjenljive a u
svakom narednom izrazu koe…cijenti polinoma se pojavljuju kao sabirci. Ako se uzme da
je polinom napisan u sljedećem obliku:

S = an x n + an 1 x n 1
+ ::: + a1 x + a0

tada se opisani postupak uopšteno moµze zapisati na sljedeći naµcin:

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

Algoritmi i programiranje, V.2 14 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Ovdje k = n; 0; 1 ima znaµcenje : k se mijenja od n do 0 sa korakom 1. To znaµci da se


uzimaju koe…cijenti polinoma opadajućim redom indeksa poµcev od koe…cijenta za najveći
stepen. Najvaµznije u datoj relaciji je da se koriste samo dvije operacije; prva je dodjela
vrijednosti a druga sadrµzi jedno mnoµzenje i jedno sabiranje. Na ovaj naµcin se moµze
opisati raµcunanje vrijednosti polinoma proizvoljnog stepena. Na narednom dijagramu je
dat opisani algoritam.

Raµcunanje polinoma

Algoritam 3.3 Raµcunanje polinoma


Ulaz : fak g ; k = 0; n
Ulaz : x
S 0 //Inicijalizacija sume
Za(k = n do 0 korak 1)
{ S S x + ak }
Izlaz : S

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

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

S = a0 x n + a1 x n 1
+ ::: + an 1 x + an

Primjer 3.2 Napraviti algoritam za raµcunanje sume:


Xn
i2
S=
i=1
i+1

Rješenje. Jedina ulazna veliµcina u ovom sluµcaju je n. Sumiranje se vrši u veliµcinu S


što podrazumijeva potrebu njene inicijalizacije. Kad je u pitanju sumiranje najprirodniji
naµcin inicijalizacije je S = 0. Jedna od varijanti algoritma je u nastavku.

Algoritmi i programiranje, V.2 15 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Algoritam sumiranja

Na dijagramu je vidljivo da se operacija S S + k 2 = (k + 1) ponavlja onoliko puta koliko


k ima razliµcitih vrijednosti, u ovom sluµcaju n, koje se dobijaju tako da se k u svakom
koraku poveća za 1. Na taj naµcin k ima funkciju brojaµca. Pseudokod za ovaj algoritam
je u nastavku.

Algoritam 3.4 Sumiranje - varijanta 1


Ulaz : n
S 0 //Inicijalizacija sume
Za(k = 1 do n korak 1)
k2
{ S S+ }
k+1
Izlaz : S

Ovakav algoritam se naziva cikliµcni zbog µcinjenice da se jedan korak ponavlja odre†en
broj 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 + k 2 = (k + 1) ?

Isti algoritam je mogao biti napravljen na naµcin da se u svakom ciklusu ispituje uslov, u
ovom sluµcaju da li je k dostigao traµzenu vrijednost.

Algoritam 3.5 Sumiranje - varijanta 2


Ulaz : n
S 0 //Inicijalizacija sume
k 1
k2
a:S S+
k+1
k k+1
AkoJe(k n) Idi na korak a:
Izlaz : S

U ovom algoritmu je najinteresantniji korak u kojem se ispituje da li je k n. Ovo


je potencijalno najveći (i najµcešći) izvor greške. Ovaj uslov neće nikada vrijediti ako je

Algoritmi i programiranje, V.2 16 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

n 0, jer tekuća promjenljiva k ide od 1 i u svakom koraku postaje veća, ali je realno da,
pod odre†enim uslovima, parametar n bude inicijalno zadat kao n = 0. Da bi se otklonio
ovaj rizik potrebno je odmah provjeriti da li je n 0 ili ne.

Raµcunanje sume

Jedan od naµcina da se izbjegne skok na labelu je sljedeći algoritam.

Algoritam 3.6 Sumiranje - varijanta 3


Ulaz : n
S 0 //Inicijalizacija sume
k 1
SveDokJe(k n)
k2
{ S S+
k+1
k k+1 }
Izlaz : S

Primjer 3.3 Napraviti algoritam za raµcunanje prvog izvoda polinoma stepena n.

Rješenje. Neka je polinom dat u opštem obliku:

P (x) = an xn + an 1 xn 1
+ ::: + a1 x + a0

Prvi izvod ovog polinoma je:

P 0 (x) = nan xn 1
+ (n 1) an 1 xn 2
+ ::: + 2a2 x + a1

Najlakši naµcin raµcunanja vrijednosti ovog polinoma za datu vrijednost x je sljedeći:

P 0 (x) = (::: (nan x + (n 1) an 1 ) x + ::: + 2a2 ) x + a1

Sliµcno prethodnom primjeru, kalkulacija se provodi sa dvije osnovne operacije:

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

Opisani algoritam je dat na sljedećem dijagramu.

Algoritmi i programiranje, V.2 17 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Raµcunanje prvog izvoda polinoma

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

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

Pitanje 2 : Da li je i na koji naµcin povećan broj operacija koje se obavljaju prilikom


raµcunanja prvog izvoda ?

Primjer 3.4 Napraviti algoritam i napisati pseudokod za nalaµzenje sume:


1 1 1 1
S= + + + ::: +
sin 1 sin 1 + sin 2 sin 1 + sin 2 + sin 3 sin 1 + sin 2 + ::: + sin n
Rješenje. U ovom sluµcaju se radi o dvije sume. Jedna suma se formira u imeniocima
svakog od sabiraka a druga suma se formira putem sabiranja datih razlomaka. Ovo znaµci i
odgovarajuće inicijalizacije za dvije sume; neka su to R za imenioce i S za sabirke konaµcne
sume. Suma u imeniocu se formira izrazom R R + sin i, pri µcemu i uzima vrijednost
od 1 do n, koje se unaprijed zadaje. Imenilac prvog sabirka je sin 1, pa n ne smije biti
manji od 1. Iz tog razloga se vrijednost za n proverava odmah na poµcetku.

Algoritam za ovu osnovnu varijantu je na prvom od naredna dva dijagrama. Kritiµcan


korak je S S + 1=R. S obzirom da R moµze imati i veoma male vrijednosti, koliµcnik
1=R moµze imati vrijednosti koje prelaze …ziµcke mogućnosti zapisa, što se mora izbjeći.
Zbog toga se kao ulazna veliµcina treba uzeti broj " > 0 kojim se odre†uje kriterij taµcnosti
i korak u kojem se ispituje da li je R < "; ako jeste ne raµcuna se vrijednost na sljedećem
koraku. Ovo je jedan od mogućih izbora; drugi izbor je da se algoritam prekine. Izbor
zavisi od konkretnog problema u okviru kojeg se algoritam pravi. Na dijagramu za drugu
varijantu je, iz tehniµckih razloga, ova veliµcina oznaµcena sa e.

Algoritmi i programiranje, V.2 18 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Raµcunanje sume

Pseudokod za drugi algoritam je u nastavku.

Algoritam 3.7 Suma inverznih suma sinusa cijelih brojeva, V.2


Ulaz : n, "
//Provjeriti vrijednost za n
AkoJe(n < 1) Kraj
//Inicijalizacija
R 0
S 0
Za(k = 1 do n korak 1)
{ R R + sin i
AkoJe(jRj ")
{ S S + 1=R }
}
Izlaz : S

Primjer 3.5 Neka je dat niz brojeva fxk g ; k = 1; n. Napraviti algoritam koji raµcuna :
a) najmanji od datih brojeva; b) najve´ci od datih brojeva; c) i najmanji i najve´ci od datih
brojeva

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

Algoritmi i programiranje, V.2 19 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Nalaµzenje minimalnog broja u datom nisu

Pseudokod za ovaj algoritam je u nastavku.


Algoritam 3.8 Nalaµzenje minimalnog broja u nizu
Ulaz : x; y
M in x1
Za(k = 1 do n)
{ AkoJe(xk < M in)
{ M in xk }
}
Izlaz : M in
µ
Citaocu se prepušta da napravi odgovarajući algoritam za nalaµzenje najvećeg broja datog
niza. Za nalaµzenje istovremeno i najvećeg i najmanjeg µclana datog niza brojeva potrebno
je raditi kao i u prethodnom zadatku sa manjom izmjenom u segmentu ispitivanja.

Istovremeno nalaµzenje minimalnog i maksimalnog elementa iz niza brojeva

Algoritmi i programiranje, V.2 20 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Pseudokod za ovaj algoritam je u nastavku.

Algoritam 3.9 Istovremeno nalaµzenje minimalnog i maksimalnog broja u nizu


Ulaz : x; y
M in x1
M ax x1
Za k = 1 do n
{ AkoJe(xk < M in)
{ M in xk }
Inaµce
{ AkoJe(xk > M ax)
{ M ax xk }
}
}
Izlaz : M in; M ax

Primjer 3.6 Napraviti algoritam za raµcunanje sume:


X1
1
S=
i=1
i3

Rješenje. U ovom zadatku je osnovni problem kriterij zaustavljanja (engl. stoping


rule) zbog principa konaµcnosti; algoritam koji traje beskonaµcno je besmislen. Kad su u
pitanju algoritmi sumiranja redova, osnovni kriterij zaustavljanja je razlika izme†u dvije
uzastopne parcijalne sume. Ako je ta razlika manja od nekog unaprijed zadatog broja
" postupak sumiranja se zaustavlja jer dodavanje novih µclanova ne povećava taµcnost
raµcunanja:
jSk+1 Sk j < "
Ovo znaµci da je u dizajnu algoritma na svakom koraku potrebno imati dvije uzastopne
parcijalne sume koje se porede. Ulazni parametar za ovaj algoritam, dat na narednom
dijagramu, je broj ", odabrani nivo taµcnosti raµcunanja.

Sumiranje redova - varijanta 1

Algoritmi i programiranje, V.2 21 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Pseudo kod za ovaj algoritam je u nastavku.

Algoritam 3.10 Sumiranje redova - varijanta 1


Ulaz : "
k 1
S1 0
1
a: S2 S1 + 3
k
AkoJe(jS2 S1 j ")
{ S1 S2
k k+1
Idi Na a: }
Izlaz : S1

Alternativni izgled ovog algoritma je u nastavku.

Algoritam 3.11 Sumiranje redova - varijanta 1a


Ulaz : "
k 1
S1 k
1
a: S2 S1 + 3
k
AkoJe(jS2 S1 j < ") Izlaz:
// Ako ne vrijedi gornji uslov nastavljaju se naredbe nakon uslova "Ako ..."
S1 S2
k k+1
Idi na a:
Izlaz : S1

Ovakav dizajn je pogodan u sluµcajevima kada programski jezik omogućava realizaciju


µ ći je dizajn dat na narednom dijagramu.
naredbe bezuslovnog skoka "Idi na a:". Ceš

Sumiranje redova - varijanta 2

Algoritmi i programiranje, V.2 22 A.G. 2018/2019, Radni materijal


3.2 Sume i proizvodi µ
3 CIKLICNI ALGORITMI

Pseudo kod za ovaj algoritam je u nastavku.

Algoritam 3.12 Sumiranje reda - varijanta 2


Ulaz : "
k 1
S1 0
S2 k
SveDokJe(jS2 S1 j > ")
{ k k+1
S1 S2
1
S2 S1 + 3 }
k
Izlaz : S2

U oba sluµcaja, veliµcina " odre†uje broj koraka u kojem se raµcuna suma.

Ako se traµzi da najveći broj koraka ne pre†e neko n, pored nivoa taµcnosti, ", ulazna
veliµcina je n, najveći broj koraka. Tada mora postojati korak u kojem se ispituje taj
uslov, što je prikazano na Varijanti 3, u kojoj je izbaµcen korak ’Idi na a:’.

Algoritam 3.13 Sumiranje redova, Varijanta 3


Ulaz : "; n
k 1
S1 0
S2 0
AkoJe(jS2 S1 j ")
{ S1 S2
1
S2 S1 + 3
k
k k+1
AkoJe(k > n) Kraj }
Izlaz : S; k

Primjer 3.7 Napraviti algoritam za raµcunanje proizvoda matrica:

Am n Bn p = Cm p

Rješenje. Dijagram za ovaj problem je u nastavku. U ovom sluµcaju je i brojaµc za


redove prve matrice, j je brojaµc za kolone druge matrice a k je brojaµc za elemente u
skalarnom proizvodu (kolone prve matrice). Treba uoµciti korak inicijalizacije c (i; j) = 0
zbira proizvoda. Nije teško napisati pseudo kod na osnovu ovog dijagrama.

Algoritmi i programiranje, V.2 23 A.G. 2018/2019, Radni materijal


3.3 Cijeli brojevi µ
3 CIKLICNI ALGORITMI

Ilustracija uz zadatak 3.0. Proizvod matrica

3.3 Cijeli brojevi


Primjer 3.8 Za dati prirodni broj n uraditi sljede´ce: a) Na´ci koliko ima cifara; b) Na´ci
koliko ima razliµcitih cifara; c) Na´ci sumu njegovih cifara; d) Na´ci prvu i posljednju cifru;
e) Napraviti broj sa obratnim poretkom cifara; f) Ako su f i g, i = 0; :::; k, cifre broja n
na´ci sumu:
k
Xk
S= k k 1 + ::: + ( 1) 0 = ( 1)k i i
i=1

Rješenje. Zadatak ćemo podijeliti na nekoliko logiµcki povezanih cjelina. U nastavku se


podrazumijeva da je k-to cifreni cijeli broj n zapisan u obliku:
X
k 1
n = ak 1 ak 2 :::a1 a0 = aj 10j
j=0

gdje su faj g cifre dekadnog zapisa. Indeksi tih cifara odgovaraju stepenu broja 10. Iz
tog razloga je prikladno u ovom sluµcaju koristiti relativno indeksiranje.

Cifre broja, suma cifara. S obzirom da n ne moµze biti proizvoljno veliko (ograniµceno je
kapacitetima za pohranu cijelih brojeva), u ovom primjeru ćemo se ograniµciti na n 108 ,
što ne mijenja koncept rješenja.

Za nalaµzenje samo broja cifara, ali ne i cifara pojedinaµcno, imamo dva naµcina. Ako je k
broj cifara tada vrijedi:
k = blog10 nc + 1

Algoritmi i programiranje, V.2 24 A.G. 2018/2019, Radni materijal


3.3 Cijeli brojevi µ
3 CIKLICNI ALGORITMI

Drugi naµcin je da n poredimo sa brojevima 10, 100, ..., bilo da se poµcne od niµzih ili viših
vrijednosti. Ovaj naµcin je dobar za neke primjene ali se ne preporuµcuje kao generalno
dobro rješenje.

Ako je osim broja cifara potrebno znati i svaku cifru tada se mora inicirati niz u koji ćemo
ih pohranjivati. Broj cifara nije poznat a time ni dimenzija niza. Ovo nameće koncept
u kojem se algoritam prekida ako se stekne neki uslov u toku raµcunanja. Koncept rada
je da se broj dijeli sa 10, izraµcuna ostatak i tako dobije cifra; koliµcnik je ulaz za sljedeće
dijeljenje. Rad se prekida ako je koliµcnik jednak nuli. U nastavku je psedudokod.

Algoritam 3.14 Broj cifara broja n, prva i posljednja, suma cifara


// Ulaz : n
AkoJe(n 0) Kraj
AkoJe(n 108 ) Kraj
Kol n
m n
k 1
a fg // Inicijalizacija niza
SveDokJe(Kol 6= 0)
{ Kol bm=10c
a [k] m 10 Kol
m Kol
k k+1 }
Izlaz : k // Rezultat : broj cifara
Izlaz : a [0] // Prva cifra
Izlaz : a [k 1] // Posljednja cifra
S 0 // Sumiranje cifara
Za(m = 0 do k 1 korak 1)
{ S S + a [m] }
Izlaz : S

Ovaj algoritam podrazumijeva da se niz proširuje jednim µclanom na svakom koraku. Osim
cifara, algoritam daje prvu i posljednju cifru.

Broj razliµcitih cifara. Uslov za ovaj dio je da su poznate cifre broja, niz fak g, što
je rezultat prethodnog algoritma i duµzina niza, k. Dekadni zapis koristi cifre d =
f0; 1; 2; :::; 9g. Za svaku od ovih cifara moramo ispitati da li se nalazi u nizu fak g i
taj podatak negdje pohraniti. Za to nam moµze posluµziti neki novi niz fbk g, µcija je duµzina
jednaka broju cifara. U nastavku je pseudokod.

Algoritam 3.15 Broj razliµcitih cifara broja n


// Ulaz : fak g, k
// Iniciramo niz b
Za(m = 0 do 9 korak 1)
{ b [m] 0 }
// Uzimamo µclan po µclan niiza a
Za(j = 0 do k 1 korak 1)
{ cif a [j] // sadrµzaj µclana a [j] odre†uje indeks niza b
b [cif ] ! b [cif ] + 1 }

Algoritmi i programiranje, V.2 25 A.G. 2018/2019, Radni materijal


3.3 Cijeli brojevi µ
3 CIKLICNI ALGORITMI

// Moµze i kra´ce: b [a [j]] b [a [j]] + 1 //


}
// Rezultat je niz u kojem su neki µclanovi razliµciti od nule; broj tih µclanova je broj razliµcitih
cifara
br 0 // br : broj razliµcitih cifara
// U nastavku m ima funkciju brojaµca a ne cifara
Za(m = 0 do k 1 korak 1)
{ AkoJe(b [m] > 0)
{ br br + 1 }
}
// Rezultat : broj razliµcitih cifara
Izlaz : br

Ovaj algoritam je prikladan ako je iz bilo kog razloga potreban podatak ne samo o tome
koliko je razliµcitih cifara već i broj pojavljivanja svake od cifara. Ako nam taj podatak
nije bitan, drugi naµcin da se dobiju sve razliµcite cifre je da se iz niza cifara izbace sva
ponavljanja jedne cifre. Drugim rijeµcima, uzmemo cifru na poziciji 1, pretraµzimo cijeli
niz i iz njega izbacimo sve cifre koje su joj jednake, što znaµci i smanjenje duµzine niza,
nakon toga uzmemo cifru na poziciji 2 i ponovimo postupak.

Suma cifara sa naizmjeniµcnim znacima. Prema zadatku, treba naći sumu:

k
X
k
S= k k 1 + ::: + ( 1) 0 = ( 1)k i
i
i=1

Sumu µcine cifre, poµcev od cifre najveće ’teµzine’odnosno µclana ak niza cifara. Za raµcunanje
vrijednosti ( 1)k nije moguće koristiti funkciju stepenovanja koja se interno obavlja log-
aritmovanjem. Vrijednosti ( 1)k su 1 ili +1. Jedan od naµcina da se riješi problem je da
se uzme poµcetna vrijednost +1 za znak i ta vrijednost na svakom koraku mnoµzi sa 1,
µcime se postiµze efekt izmjene znaka za svaki sabirak. Pseudo kod je u nastavku.

Algoritam 3.16 Suma cifara sa promjenljivim znacima


// Ulaz : fak g
S 0 // Iniciramo sumu S
Zn 1 // Iniciramo znak
// Idemo obratnim redom, poµcev od cifre ak
Za(m = k 1 do 0 korak 1)
{ S S + Zn a [m]
Zn Zn ( 1) // Mijenjamo znak
}
// Rezultat : traµzena suma
Izlaz : S

Broj sa obratnim redoslijedom cifara. Rezultat ćemo smjestiti u neki novi broj nb.
Pseudo kod je u nastavku.

Algoritam 3.17 Broj sa obratnim redoslijedom cifara


Ulaz : fak g
nb 0 // Iniciramo broj nb

Algoritmi i programiranje, V.2 26 A.G. 2018/2019, Radni materijal


3.3 Cijeli brojevi µ
3 CIKLICNI ALGORITMI

// Idemo obratnim redom, poµcev od cifre a0


Za(m = 0 do k 1 korak 1)
{ nb 10 nb + a [m] }
// Rezultat : traµzeni broj sa obratnim redoslijedom cifara
Izlaz : nb

Primjer 3.9 Cijeli broj n se moµze na jedinstveni naµcin predstaviti u obliku:

n = ds (s + 1)! + ds 1 s! + ::: + d1 2! + d0

Na´ci brojeve fdk g, k = 0; ::; s, za dati broj n.

Rješenje. U cilju analize, dati izraz ćemo transformisati na sljedeći naµcin:

n = ((ds (s + 1) + ds 1 ) s + ds 2 ) (s 1) + :::) 2 + d0

Ovo se lako provjerava na sljedećem primjeru:

14910 = 74 2 + 1 = (24 3 + 2) 2 + 1
= ((6 4 + 0) 3 + 2) 2 + 1
= (((1 5 + 1) 4 + 0) 3 + 2) 2 + 1
= 1 5! + 1 4! + 0 3! + 2 2! + 1
= 11021f

Naznaµcene su ’cifre’u ovakvom razlaganju, što pokazuje kako ćemo napraviti algoritam:

Prvi µclan dobijamo kao ostatak dijeljenja broja n sa 2


Sljedeću cifru dobijamo kao ostatak dijeljenja koliµcnika iz prethodnog koraka sa 3

Drugim rijeµcima, dijeljenik je koliµcnik iz prethodnog dijeljenja; prvi djelilac je 2, koji se


u svakom koraku povećava za 1. Posao se prekida kad je koliµcnik jednak nuli. Rezultat
je niz cifara koji ćemo pohraniti u niz ns. Pseudokod je u nastavku.

Algoritam 3.18 Predstavljanje broja u formi faktorijela


// Ulaz : n
AkoJe(n 0) Kraj
ns fg // Iniciramo niz ns
dj 2 // Iniciramo djelilac
Broj n // Iniciramo brojilac brojem n
Kol Broj // Iniciramo koliµcnik zbog uslova prekida
k 0 // Iniciramo brojaµc pozicija
SveDokJe(Kol 6= 0)
{ Kol Broj=dj
k k+1 // Pove´cavamo indeks
ns [k] Broj dj Kol // Cifra je ostatak
Broj Kol // Koliµcnik iz prethodnog koraka postaje novi brojilac
dj dj + 1 // Pove´cavamo djelilac za 1
}
// Rezultat : Niz cifara
Izlaz : ns

Algoritmi i programiranje, V.2 27 A.G. 2018/2019, Radni materijal


3.3 Cijeli brojevi µ
3 CIKLICNI ALGORITMI

Zadatak (obratni) : Ako je dato razlaganje broja na faktorijele naći dekadni zapis tog
broja.

Primjer 3.10 Dati broj n predstaviti u bazi p 2. Isto to uraditi za bazu p = 10.

Rješenje. Dekadni zapis broja n znaµci da postoji niz fak g takav da vrijedi relacija:

n = 10k ak + 10k 1
ak 1 + ::: + 10 a1 + a0

Analogno, razlaganje u bazi p 2 znaµci da vrijedi:

n = p m bm + p m 1
bm 1 + ::: + p b1 + b0 = bm bm 1 :::b1 b0 p

U ovim zapisima a0 i b0 odgovaraju ciframa najmanje teµzine. Cifre se dobijaju kao ostaci
dijeljenja sa odabranom bazom p, pri µcemu je koliµcnik na jednom koraku ujedno ulazna
veliµcina za dijeljenje u sljedećem koraku. Cifre novog zapisa smještamo u niz np. Pseudo
kod je u nastavku.

Algoritam 3.19 Predstavljanje broja u bazi p


Ulaz : n, p
np fg // Iniciramo niz np
Broj n // Iniciramo brojilac brojem n
Kol Broj // Iniciramo koliµcnik zbog uslova prekida
k 0 // Iniciramo brojaµc pozicija
SveDokJe(Kol 6= 0)
{ Kol bBroj=pc
k k+1 // Pove´cavamo indeks
np [k] Broj p Kol // Ostatak je nova cifra
Broj Kol // Koliµcnik iz prethodnog koraka postaje novi brojilac
}
// Rezultat : Niz cifara
Izlaz : np

Prilikom konverzije u drugu bazu javlja se problem ako je baza p 11 jer to zahtijeva
simbole za ’cifre’veće od 10. Za sistem baze p = 16, tzv. heksadecimalni sistem, utvr†en
je standard oznaka:

f10; 11; 12; 13; 14; 15g = fA; B; C; D; E; F g


Primjer je broj:
138910 = 86D16
Pitanje : Kako se dobija broj cifara u bazi p ?

Primjer 3.11 Na´ci cifre broja n = 2200 .

Rješenje. Broj cifara ovog broja, C (n), se dobija iz relacije:

log10 n = 200 log10 2 = 60:205999 ) C (n) = 61

Imajući ovo u vidu, cifre ćemo naći kao elemente niza duµzine 61. Inicijalno, niz će imati
vrijednost 1 na poziciji najmanje teµzine. Cifre dobijamo kao rezultat 200 mnoµzenja svih

Algoritmi i programiranje, V.2 28 A.G. 2018/2019, Radni materijal


3.3 Cijeli brojevi µ
3 CIKLICNI ALGORITMI

µclanova niza sa 2. U prvoj verziji ćemo vršiti 200 mnoµzenja, bez postavljanja pitanja
racionalnosti takvog pristupa.

Ako se bilo koja cifra mnoµzi sa 2 najveći rezultat je 18, što znaµci da je prenos ili 1 ili
0. Cifru na tekućoj poziciji mnoµzimo sa 2 i dodajemo prenos sa prethodne pozicije.
Postupak je sljedeći:

Ako je proizvod 2 ak + prenos < 10 nemamo prenosa na sljedeću cifru (taµcnije,


prenos je 0)

Ako je proizvod 2 ak + prenos 10 prenos je 1, a cifra ostatak kada od ovoga


oduzmemo 10

Pseudo kod je u nastavku. Korišteno je relativno indeksiranje.

Algoritam 3.20 Generisanje cifara broja 2 stepenovan sa 200


// Ulaz : –
// Anuliranje niza
Za(k = 0 do 60 korak 1)
{ cif [k] 0 }
cif [0] 1 // Iniciramo prvi µclan niza
Za(k = 1 do 200 korak 1)
{ pren 0 // Prenos od prethodne cifre
Za(m = 0 do 60 korak 1)
{ Broj cif [m] 2 + pren // Cifru na teku´coj poziciji mnoµzimo sa 2 i
dodajemo prenos od prethodne cifre
pren 0
AkoJe(Broj > 9)
{ pren 1
Broj Broj 10 }
cif [m] Broj // Na mjesto teku´ce cifre dolazi nova cifra
}
}
// Rezultat : Niz cifara
Izlaz : cif

Pitanje 1 : Algoritam se moµze generalizirati za bilo koju kombinaciju pq . Šta se mijenja


u tom sluµcaju ?

Pitanje 2 : Prezentirani algoritam podrazumijeva 200 mnoµzenja. Na koji naµcin se broj


mnoµzenja moµze ograniµciti ?
200
Primjer 3.12 Na´ci cifre broja n = 2 .

Rješenje. Broj cifara ovog broja se dobija iz relacije:

log10 n = 200 log10 2 = 60:205999 ) C (n) = 61

Ovdje je C (n) oznaka za broj cifara. Imajući ovo u vidu, cifre ćemo naći kao elemente
niza duµzine 61. Inicijalno, niz će imati vrijednost 1 na poziciji najmanje teµzine. Cifre

Algoritmi i programiranje, V.2 29 A.G. 2018/2019, Radni materijal


3.3 Cijeli brojevi µ
3 CIKLICNI ALGORITMI

dobijamo kao rezultat 200 dijeljenja svih µclanova niza sa 2. U prvoj verziji ćemo vršiti
200 mnoµzenja, bez postavljanja pitanja racionalnosti takvog pristupa.

Koliµcnik dijeljenja cifre na odre†enoj poziciji postaje nova cifra, ostatak se mnoµzi sa 10,
dodaje se sljedeći µclan niza i operacija ponavlja. Pseudo kod je u nastavku. Korišteno je
relativno indeksiranje.

Algoritam 3.21 Generisanje cifara broja 2 stepenovan sa -200


// Ulaz : n
cif fg // Iniciramo niz cif
// Niz anuliramo
Za(k = 0 do 60 korak 1)
{ cif [k] 0 }
cif (1) 5 // Zašto ?
Za(k = 2 do 200 korak 1)
{ Ost 0
Za(m = 0 do 60 korak 1) // Uvijek polazimo od prvog µclana
{ Broj 10 Ost + cif [m]
Kol Broj=2
Ost Broj 2 Kol
cif [m] Kol
}
}
// Rezultat : Niz cifara
Izlaz : cif

Pitanje 1 : Algoritam se moµze generalizirati za bilo koju kombinaciju p q . Šta se mijenja


u tom sluµcaju ?

Pitanje 2 : Prezentirani algoritam podrazumijeva 200 dijeljenja. Na koji naµcin se broj


dijeljenja moµze ograniµciti ?

Primjer 3.13 Za realni broj x 2 [0; 1) na´ci prvih m cifara zapisa u sistemu baze p 2
odnosno niz pozitivnih cijelih brojeva fak g, k = 1; :::; m, takve da je:
1 2 m
x = a 1p + a2 p + ::: + a mq

Rješenje. Svaku cifru zapisa u sistemu baze p u ovom sluµcaju dobijamo kao cijeli dio
proizvoda decimalnog broja x sa p. Drugim rijeµcima, broj x pomnoµzimo sa p, izdvojimo
cjelobrojni dio, oduzmemo ga od proizvoda i taj novi broj je ulaz za sljedeći korak. Prema
uslovima zadatka, ovo moramo uraditi m puta. Cifre koje dobijamo moµzemo usmjeriti u
niz. Pseudokod je u nastavku.

Algoritam 3.22 Decimalni dio broja u bazi p


// Ulaz : x, p, m
AkoJe(x 0 _ x > 1) Kraj
// Niz anuliramo
Za(k = 0 do m 1 korak 1)
{ cif [k] 0 }
Broj x // Formiramo radnu promjenljivu

Algoritmi i programiranje, V.2 30 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

Za(k = 1 do m korak 1)
{ Broj Broj p
pc bBrojc // Izdvajamo cijeli dio novog broja
cif [k] pc // Cifru stavljamo u niz
Broj Broj pc // Dobijamo broj za naredni korak
}
// Rezultat : Niz cifara
Izlaz : cif

3.4 Nizovi brojeva i znakova


U većini narednih zadataka su algoritmi u kojima se obra†uje niz brojeva ili znakova koji
se uµcitava sa nekog izvora. Broj uµcitavanja, u pravilu, nije unaprijed poznat.

Primjer 3.14 Uµcitava se niz realnih brojeva. Uµcitavanje se prekida kad se uµcita simbol
#. Nakon uµcitavanja dati podatak o broju pozitivnih, negativnih i nula vrijednosti, a
zatim izraµcunati veliµcine:
v
u
1 X
n 1 u 1 X n 1
a = aA = ak s = t (ak a)2
n k=0 n 1 k=0

Prva od njih je aritmetiµcka sredina. Druga veliµcina je standardna devijacija, kvadratni


korijen tzv. srednje kvadratne greške (izraz pod korijenom).

Rješenje. Za aritmetiµcku sredinu nam je potrebna suma. Prikladno je imati zasebne


sume pozitivnih i negativnih brojeva; suma nula elemenata je nula. S obzirom da broj
uµcitavanja nije poznat (moµze biti i nula), taj postupak kontroliše logiµcka promjenljiva
U c. Moguća su dva koncepta rješenja ovog problema. Prvi je da se uµcitavanje vrši u niz
fan g. Pravi razlog je raµcunanje sume razlika (ak a)2 . Pseudo kod za ovu varijantu je u
nastavku.

Algoritam 3.23 Aritmetiµcka sredina niza brojeva, Verzija 1


n 0 // Iniciranje brojaµca µclanova
a fg // Iniciranje niza a
Uc 1 // Iniciranje logiµcke promjenljive
br_poz 0 // Iniciranje brojaµca pozitivnih, negativnih i nula vrijednosti
br_neg 0
br_nul 0
S_po 0 // Iniciranje sume pozitivnih brojeva
S_ne 0 // Iniciranje sume negativnih brojeva
Otvori(s) // Otvaranje izvora podataka
// Uµcitavanje
SveDokJe(U c = 1)
{ UµcitajZnak(m)
AkoJe(m = #)
{ Uc = 0 }
Inaµce
{ a [n] m

Algoritmi i programiranje, V.2 31 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

// Ispitujemo znak uµcitanog broja


AkoJe(a [n] > 0)
{ br_poz br_poz + 1
S_po S_po + a [n] }
AkoJe(a [n] = 0)
{ br_nul br_nul + 1 }
AkoJe(a [n] < 0)
{ br_neg br_neg + 1
S_ne S_ne + a [n] }
n n+1 // Pove´cati brojaµc
}
}
Zatvori(s)
// Ako je n = 0 to znaµci da podaci nisu uµcitavani
AkoJe(n = 0) Kraj
M _ar (S_po + S_ne) = (br_poz + br_neg) // Raµcunanje aritmetiµcke sredine
Izlaz : M _ar
// Ako je n 1 tada se ne moµze raµcunati korijen
AkoJe(n 1) Kraj
// Raµcunanje veliµcine s
s_kv 0 // Iniciranje sume kvadrata odstupanja
// Raµcunanje sume
Za(k = 0 do n 1 korak 1)
{ s_kv s_kv + (a [k] a_ar)2 }
s sqrt (s_kv= (n 1))
// Rezultat : Kvadratni korijen prosjeµcne sume kvadrata odstupanja
Izlaz : s

Koncept korištenja niza ima i prednosti i nedostatke. Prednost je što sa nizom moµzemo
brzo obavljati niz operacija. Sa druge strane, ovaj koncept je prihvatljiv ako je broj
uµcitavanja poznat. Ako niz koji se uµcitava ima mnogo µclanova tada njegovo memorisanje
moµze biti problem. Drugi koncept je da se kalkulacije vrše nakon svakog uµcitavanja.
Uslov su sljedeće transformacije:

1X X
n n
a = ak ) ak = n a
n k=1 k=1
v
u
u 1 X n
1 X
n
s = t (ak a)2 ) s2 = (ak a)2 )
n 1 k=1 n 1 k=1
X
n
2
X
n
2
s (n 1) = (ak a) = a2k 2ak a + a2
k=1 k=1
Xn X
n X
n X
n X
n X
n
= a2k 2a ak + a2 = a2k 2a ak + a2
k=1 k=1 k=1 k=1 k=1 k=1
X
n X
n
= a2k 2n a2 + n a2 = a2k n a2
k=1 k=1

Algoritmi i programiranje, V.2 32 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

v !
u
1 X
n
n u 1 X
n
s2 = a2k a2 ) s = t a2k a2
n 1 k=1
n 1 n 1 k=1

Za raµcunanje sume s trebaju nam dva podatka; jedan je suma veliµcina a drugi je suma
njihovih kvadrata. Na osnovu ovoga je jasno da se veliµcina s moµze izraµcunati tako da se
tokom uµcitavanja raµcuna suma kvadrata od koje se na kraju oduzme kvadrat aritmetiµcke
sredine, ta razlika podijeli sa n 1 i izraµcuna kvadratni korijen. Sve ovo se radi bez
memorisanja niza. Veliµcina s se moµze raµcunati i korištenjem imenioca n umjesto n 1.
Pseudo kod je u nastavku.

Algoritam 3.24 Aritmetiµcka sredina niza brojeva, Verzija 2


Uc 1 // Iniciranje logiµcke promjenljive
br_poz 0 // Iniciranje brojaµca pozitivnih, negativnih i nula vrijednosti
br_neg 0
br_nul 0
S_po 0 // Iniciranje sume pozitivnih brojeva
S_ne 0 // Iniciranje sume negativnih brojeva
S_kv 0 // Iniciranje sume kvadrata
Otvori(s)
// Uµcitavanje
SveDokJe(U c = 1)
{ UµcitajZnak(m)
AkoJe(m = #)
{ Uc = 0 }
Inaµce
{ AkoJe(m > 0) // Aµzurirati brojaµc
{ br_poz br_poz + 1
S_poz S_poz + m }
AkoJe(m = 0)
{ br_nul br_nul + 1 }
AkoJe(m < 0)
{ br_neg br_neg + 1
S_neg S_neg + m }
S_kv S_kv + m m // Suma za veliµcinu s
}
}
Zatvori(s)
// Ako je br_poz + br_neg = 0 to znaµci da podaci nisu uµcitavani
AkoJe(br_poz + br_neg = 0) Kraj
M _ar (S_poz + S_neg) = (br_poz + br_neg) // Raµcunanje aritmetiµcke sre-
dine
Izlaz : M _ar
// Ako je n 1 tada se ne moµze raµcunati korijen
AkoJe(n 1) Kraj
// Raµcunanje veliµcine s
M _kv sqrt ((M _kv M _ar M _ar) = (n 1))
Izlaz : M _kv

Algoritmi i programiranje, V.2 33 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

Pitanje 1 : Kako treba izmijeniti algoritam ako se treba traµziti aritmetiµcka sredina i
standardna devijacija: a) brojeva koji su razliµciti od nule; b) samo pozitivnih brojeva; c)
samo negativnih brojeva ?

Napomena 3.1 Ako se vrijednost nula tretira kao validan podatak tada se aritmetiµcka
sredina raµcuna kao:

M _ar (S_po + S_ne) = (br_poz + br_nul + br_neg)

Napomena 3.2 Mogu´ce je rekurzivno raµcunanje. Ako je An teku´ca vrijednost arit-


metiµcke sredine, nova vrijednost, koja se dobije dodavanjem µclana an+1 , raµcuna se izra-
zom:
1
An+1 = (n An + an+1 )
n+1
Na ovaj naµcin je mogu´ce raµcunanje aritmetiµcke sredine na svakom koraku uµcitavanja.

Primjer 3.15 Uµcitava se niz realnih brojeva. Uµcitavanje se prekida kad se uµcita simbol
#. Izraµcunati veliµcinu:
" n #1=n
Y
aG = ak
k=1

U ovom izrazu n oznaµcava broj pozitivnih brojeva.

Rješenje. Veliµcina aG je geometrijska sredina. Prema uslovima zadatka, trebamo znati


da li u nizu ima pozitivnih brojeva i koliko ih je. Ako nema pozitivnih brojeva tada
ne moµzemo raµcunati geometrijsku sredinu. To znaµci da moramo znati broj pozitivnih,
negativnih i nula brojeva. Umjesto raµcunanja proizvoda, moµze se koristiti izraz:

1X
n
log10 aG = log10 ak
n k=1

Moµzemo iskoristiti algoritam raµcunanja aritmetiµcke sredine, sa manjim modi…kacjama.


Pseudo kod, u varijanti kad se ne koristi niz, je u nastavku.

Algoritam 3.25 Geometrijska sredina niza brojeva


n 0 // Iniciramo brojaµc µclanova
Uc 1 // Iniciranje logiµcke promjenljive
br_poz 0 // Iniciranje brojaµca pozitivnih, negativnih i nula vrijednosti
br_neg 0
br_nul 0
S_po 0 // Iniciranje sume
Otvori(s)
// Uµcitavanje
SveDokJe(U c = 1)
{ UµcitajZnak(m)
AkoJe(m = #)
{ Uc = 0 }
Inaµce
{ // Aµzuriranje brojaµca i raµcunanje sume logaritama
AkoJe(m > 0)

Algoritmi i programiranje, V.2 34 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

{ br_poz br_poz + 1
S_po S_po + log10 (m) }
AkoJe(m = 0)
{ br_nul br_nul + 1 }
AkoJe(m < 0)
{ br_neg br_neg + 1 }
}
}
Zatvori(s)
// Ako nema pozitivnih brojeva nema ni sredine
AkoJe(br_poz = 0) Kraj
// Raµcunanje sredine logaritama
M _ge S_po=br_poz
// Antilogaritam
M _ge exp fM _ge ln 10g
Izlaz : M _ge

Napomena 3.3 Mogu´ce je rekurzivno raµcunanje. Ako je Gn teku´ca vrijednost geometri-


jske sredine nova vrijednost, koja se dobije dodavanjem µclana an+1 , raµcuna se izrazom:
1
log Gn+1 = (n log Gn + log an+1 )
n+1
Uporediti ovo sa rekurzivnim raµcunanjem aritmetiµcke sredine. Na ovaj naµcin je mogu´ce
raµcunanje geometrijske sredine na svakom koraku uµcitavanja.

Primjer 3.16 Uµcitava se niz realnih brojeva. Uµcitavanje se prekida kad se uµcita simbol
#. Izraµcunati veliµcinu:
1X 1
n
1
=
aH n k=1 ak
U ovom izrazu n oznaµcava koliko je brojeva razliµcitih od nule.

Rješenje. Veliµcina aH je harmonijska sredina. Prema uslovima zadatka, trebamo znati


da li u nizu ima nula i koliko ih je. Ako nema brojeva razliµcih od nula tada ne moµzemo
raµcunati harmonijsku sredinu. To znaµci da moramo znati broj pozitivnih, negativnih
i nula brojeva. Moµzemo iskoristiti algoritam raµcunanja aritmetiµcke sredine, sa manjim
modi…kacjama. Pseudo kod je u nastavku.

Algoritam 3.26 Harmonijska sredina niza brojeva


n 0 // Iniciramo brojaµc µclanova
Uc 1 // Iniciranje logiµcke promjenljive
br_poz 0 // Iniciranje brojaµca pozitivnih, negativnih i nula vrijednosti
br_neg 0
br_nul 0
S_ha 0 // Iniciranje sume
Otvori(s)
// Uµcitavanje
SveDokJe(U c = 1)
{ UµcitajZnak(m)

Algoritmi i programiranje, V.2 35 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

AkoJe(m = #)
{ Uc = 0 }
Inaµce
{ // Aµzuriranje brojaµca i sume inverznih vrijednosti
AkoJe(m > 0)
{ br_poz br_poz + 1
S_ha ! S_ha + 1=m }
AkoJe(m = 0)
{ br_nul br_nul + 1 }
AkoJe(m < 0)
{ br_neg br_neg + 1
S_ha ! S_ha + 1=m }
}
}
Zatvori(s)
// Ako nema brojeva razliµcitih o nule nema ni harmonijske sredine
AkoJe(br_poz + br_neg = 0) Kraj
// Raµcunanje sredine inverznih vrijednosti
M _ha S_ha= (br_poz + br_neg)
// Raµcunanje inverzne vrijednosti prosjeµcne sume inverznih vrijednosti
M _ha 1=M _ha
Izlaz : M _ha

Pitanje : Šta moµze biti (veliki) problem prilikom raµcunanja harmonijske sredine ?

Napomena 3.4 Mogu´ce je rekurzivno raµcunanje. Ako je Hn teku´ca vrijednost harmoni-


jske sredine nova vrijednost, koja se dobije dodavanjem µclana an+1 , raµcuna se izrazom:
1 1 n 1
= +
Hn+1 n+1 Hn an+1
Uporediti ovo sa rekurzivnim raµcunanjem aritmetiµcke sredine. Na ovaj naµcin je mogu´ce
raµcunanje harmonijske sredine na svakom koraku uµcitavanja.

Primjer 3.17 Iz niza realnih brojeva koji se uµcitava izdvojiti opadaju´ci niz i upisati ga
na izlaz pod nazivom op. Uµcitavanje se prekida kad se uµcita simbol #.

Rješenje. Prvi µclan izlaznog niza će biti prvi µclan polaznog niza. Kad se na†e sljedeći
manji broj prethodni se upisuje na izlaz op a novi µclan postaje element za pore†enje sa
sljedećim uµcitanim znakom. Pseudo kod je u nastavku.

Algoritam 3.27 Opadaju´ci podniz


//Ulaz : ul
Otvori(ul)
Otvori(op)
c_op1 // Prvi uµcitani podatak se pohranjuje u veliµcinu c_op1
Uc 1 // Veliµcina koja kontroliše dinamiku µcitanja
Korak 1 // Kontrola da li se radi o prvom koraku ili ne
SveDokJe(U c = 1)
{ µCitaj(Br,ul) // Uµcitavanje znaka sa Ulaza

Algoritmi i programiranje, V.2 36 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

AkoJe(Br = #)
{ Uc 0 }
Inaµce
{ c_op1 Br // Uµcitano smještamo u c_op1
AkoJe(Korak = 1 _ c_op1 < c_op2)
{ Piši(c_op1; op)
c_op2 c_op1
Korak 0 }
}
}
Zatvori(op)
Zatvori(ul)

Zadatak (dodatno)

Algoritam prilagoditi da se izdvaja rastući niz

Algoritam prilagoditi da se izdvajaju istovremeno opadajući i rastući niz, u dva


razliµcita izlaza

Primjer 3.18 Dat je niz fan g. Napraviti algoritam koji ´ce dati odgovor na pitanje da li
je niz opadaju´ci ili rastu´ci.

Rješenje. Niz je rastući ako za svako k vrijedi da je ak < ak+1 , k = 1; :::; n 1. Ako se u
toku ispitivanja desi da je ak < ak+1 ^ ak+1 > ak+2 imamo promjenu relacije. Brojanjem
ovih promjena dolazimo do zakljuµcka o prirodi niza. Ako nema promjena odnosno ako je
taj broj 0 niz je monoton. U ovom sluµcaju nemamo uµcitavanje (mada je i to moguće).
Pseudo kod je u nastavku.

Algoritam 3.28 Priroda monotonije niza


Ulaz : fan g
T "N " // Podatak o prirodi monotonije niza
AkoJe(a1 < a2 ) { T "R" }
AkoJe(a1 > a2 ) { T "O" }
br_p 0 // Podatak o broju promjena
Za(k = 2 do n 1 korak 1)
{
// Niz je oznaµcen kao rastu´ci / opadaju´ci a za neko k se promijenio odnos izme†u
µclanova
AKoJe(T = "R" ^ ak > ak+1 )
{ br_p ! br_p + 1 }
AKoJe(T = "O" ^ ak < ak+1 )
{ br_p ! br_p + 1 }
}
// Sumiramo zakljuµcak
AkoJe(br_p > 0)
{ Izlaz : Niz nije monoton }
Inaµce
{

Algoritmi i programiranje, V.2 37 A.G. 2018/2019, Radni materijal


3.4 Nizovi brojeva i znakova µ
3 CIKLICNI ALGORITMI

AkoJe(T = "R") { Izlaz : Niz je rastu´ci }


AkoJe(T = "O") { Izlaz : Niz je opadaju´ci }
}
Primjer 3.19 U nekim sportskim takmiµcenjima ocjene se daju tako da ocjenu daje m
sudija (ocjenjivaµca), nezavisno jedan od drugog. Iz skupa datih ocjena se uklanjaju naj-
manja i najve´ca, a za ostale se raµcuna aritmetiµcka sredina. Napraviti algoritam za raµcu-
nanje krajnje ocjene.
Rješenje. Neka su ocjene date nizom focjg. Potrebno je naći sumu µclanova (S), najmanji
(O_ min) i najveći (O_ max) µclan, pa na osnovu toga izraµcunati vrijednost:
1
Oc = (S O_ min O_ max)
m 2
Pseudo kod je u nastavku.
Algoritam 3.29 Raµcunanje ocjene
Ulaz : focjn g
S 0
O_ min ocj [1]
O_ max ocj [1]
Za(k = 1 do m korak 1)
{
S S + ocj [k]
AKoJe(ocj [k] < O_ min)
{ O_ min ocj [k] }
AKoJe(ocj [k] > O_ max)
{ O_ max ocj [k] }
}
Oc (S O_ min O_ max) = (m 2)
Primjer 3.20 Elemente niza fxk g, k = 0; ; n 1, poredati obratnim redoslijedom, bez
korištenja pomo´cnog niza.
Rješenje. Postupak se sastoji u tome da se zamijene µclanovi x0 i xn 1 , µclanovi x1 i xn 2
itd. Vidimo da je suma indeksa ovih µclanova u svim sluµcajevima jednaka n 1. Postoji
potreba da se koristi jedan brojaµc koji ide od 0 do bn=2c, jer je broj zamjena jednak
bn=2c bez obzira da li je n parno ili neparno. Pseudo kod je u nastavku.
Algoritam 3.30 Niz obratnim redom
Ulaz : fxn g, n
// Broj zamjena je bn=2c zbog sluµcaja da je n neparan
k bn=2c
Za(m = 0 do k korak 1)
{ // Zamjena dva µclana niza
a x [m]
x [m] x [n 1 m]
x [n 1 m] a
}
Izlaz : fxn g

Algoritmi i programiranje, V.2 38 A.G. 2018/2019, Radni materijal


4 EUKLIDOV ALGORITAM

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

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

4.2 Kako radi Euklidov algoritam ?


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

a = b q1 + r 1 ; 0 < r1 < b
b = r 1 q2 + r 2 ; 0 < r2 < r1
:::
rj 2 = rj 1 qj + rj ; 0 < rj < rj 1
rj 1 = rj qj+1

Tada je (a; b) = rj odnosno najveći zajedniµcki djelitelj je jednak posljednjem ostatku koji
je razliµcit od nule u Euklidovom algoritmu. Do situacije rj+1 = 0 se dolazi u konaµcno
mnogo koraka jer rj+1 = 0 implicira da je:

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

Na narednom dijagramu je data opšta šema ovog algoritma.

Algoritmi i programiranje, V.2 39 A.G. 2018/2019, Radni materijal


4.3 Sloµzenost 4 EUKLIDOV ALGORITAM

Euklidov algoritam za nalaµzenje najvećeg zajedniµckog djelioca dva broja

Ako je N ZD (m; n) = 1 kaµze se da su m i n uzajamno prosti.

Najmanji zajedniµcki sadrµzalac brojeva m i n je broj:


m n
N ZS (m; n) =
N ZD (m; n)
Zad. 4.1 Euklidovim algoritmom na´ci najve´ci zajedniµcki djelitelj brojeva 3102 i 4002.

4002 = 1 3102 + 900 900 = 2 402 + 96 96 = 5 18 + 6


3102 = 3 900 + 402 402 = 4 96 + 18 18 = 3 6

pa je N ZD (4002; 3102) = 6.

Najmanji zajedniµcki sadrµzalac brojeva m i n je broj:


m n
N ZS (m; n) =
N ZD (m; n)
Za brojeve iz prethodnog primjera je:
3102 4002
N ZS (3102; 4002) = = 2 069 034
6

4.3 Sloµzenost
Pokazuje se da sloµzenost Euklidovog algoritma zavisi o logaritamski manjem broju b,
nezavisno od a b.

Pojedine jednadµzbe u postupku Euklidovog algoritma, kao u prethodnom primjeru, ćemo


zvati Euklidske jednadµzbe. Iz jednakosti Fn = 1 Fn 1 + Fn 2 slijedi da se dijeljenjem
broja Fn sa Fn 1 u svakom koraku dobije kvocijent 1 i ostatak Fn 2 . Generalno, vrijedi
sljedeća teorema.

Algoritmi i programiranje, V.2 40 A.G. 2018/2019, Radni materijal


4.3 Sloµzenost 4 EUKLIDOV ALGORITAM

Teorema 4.1 (Euklidov algoritam). Neka su r0 = a i r1 = b cijeli brojevi takvi da je


a; b > 0. Ako se uzastopnom primjenom algoritma o dijeljenju cijelih brojeva dobije:
rj = rj+1 qj+1 + rj+2 ; 0 < rj+2 < rj+1 (j = 0; 1; :::; n 2); rn+1 = 0
tada je N ZD (a; b) = rn tj. posljednji nenulti ostatak.
Tvrdnja 4.1 U Euklidovom algoritmu za svako i vrijedi ri+2 < ri =2.
Dokaz. Ako je ri+1 ri =2 tada je ri+2 < ri+1 ri =2. Neka je ri+1 > ri =2. Tada je
ri < 2ri+1 . Tada iz ri = qi+2 ri+1 + ri+2 slijedi qi+2 = 1 tj. ri = ri+1 + ri+2 . Odavdje je
ri+2 = ri ri+1 < ri =2. Dakle, tvrdnja vrijedi i u ovom sluµcaju.
Ovaj algoritam vrijedi i za Fibonaµcijeve brojeve što će biti ilustrovano na dva Fibonaµcijeva
broja F11 = 89 i F12 = 144.

144 = 1 89 + 55 34 = 1 21 + 13 8=1 5+3 2=1 1+1


89 = 1 55 + 34 21 = 1 13 + 8 5=1 3+2 1=1 1+0
55 = 1 34 + 21 13 = 1 8 + 5 3=1 2+1
Teorema 4.2 Neka je f1 = 1; f2 = 1; fn = fn 1 +fn 2 (n 3) Fibonaµcijev niz brojeva Za
svako n 2 Euklidov algoritam uzima taµcno n dijeljenja za odre†ivanje GCD (fn+1 ; fn+2 ).
Dokaz. Polazeći od rekurzivne jednakosti fi+2 = fi+1 + fi (i = 1; 2;) dobijamo:
fn+2 = fn+1 1 + fn ; fn+1 = fn 1 + fn 1 ; :::
f4 = f3 1 + f2 ; f3 = f2 2
Dakle, Euklidov algoritam za odre†ivanje GCD (fn+2 ; fn+1 ) uzima taµcno n dijeljenja i
vrijedi GCD (fn+2 ; fn+1 ) f2 1.
Teorema 4.3 (Lame-ov teorem). Broj dijeljenja potrebnih za odre†ivanje najve´ceg za-
jedniµckog djelioca prirodnih brojeva a i b ne prelazi petostruku vrijednost broja decimalnih
cifara manjeg od ta dva broja.
Dokaz. Neka je a > b. Kada se primijeni Euklidov algoritam za odre†ivanje najvećeg
zajedniµckog djelioca brojeva a = r0 i b = r1 dobija se sljedeći niz relacija:
r 0 = r 1 q1 + r 2 ; 0 < r2 < r1
r1 = r2 q2 + r3; 0 < r3 < r2
:::
r n 2 = r n 1 qn 1 + r n ; 0 < rn < rn 1
r n 1 = r n qn
Koristi se n dijeljenja. Potrebno je primijetiti da su svi koe…cijenti q1 ; q2 ; :::; qn 1 veći
ili jednaki 1 i da je qn 2 jer je rn < rn 1 . Zbog toga je:
rn 1 = f2
rn 1 2rn 2f2 = f3
rn 2 rn 1 + rn f3 + f2 = f4
rn 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

Algoritmi i programiranje, V.2 41 A.G. 2018/2019, Radni materijal


4.4 Zadaci 4 EUKLIDOV ALGORITAM

Dakle, ako imamo


p n dijeljenja u Euklidovom algoritmu tada je min fa; bg fn+1 . Neka
je = 1 + 5 =2. Tada je 2 = + 1. Matematiµckom indukcijom se jednostavno
dokazuje da je fn > n 2 za svako n 2 N, n 3. Zbog toga je b fn+1 > n 1 tj.
log b > (n 1) log . Kako je log > 1=5 to je log b > (n 1) =5. Dakle, n 1 < 5 log b.
Ako b ima k cifara u decimalnom zapisu onda je b < 10k pa je log b < k. To znaµci da je
n < 1 + 5k odnosno n 5k.

4.4 Zadaci
Primjer 4.1 Na´ci sve prirodne brojeve koji su manji od datog n i uzajamno su prosti sa
njim.

Rješenje. Za dva broja se kaµze da su uzajamno prosta ako nemaju zajedniµckih djelitelja
koji su razliµciti od 1 tj. ako je N ZD (m; n) = 1. Ako µzelimo naći sve brojeve koji su
uzajamno prosti sa n tada ćemo probati sve brojeve od 2 do n 2. Zašto ? Pseudo kod
je u nastavku.

Algoritam 4.1 Brojevi uzajamno prosti sa n


Ulaz : n
AkoJe(n 4) Kraj
Za(k = 2 do n 2 korak 1)
{ AkoJe(N ZD (n; k) 6= 1)
{ Izlaz : k }
}

U ovom algoritmu je korak Izlaz, koji daje rezultat i koji se moµze dati na displej, usmjeriti
u niz, usmjeriti u datoteku i sliµcno, zavisno od namjene programa.

Primjer 4.2 Za date brojeve m i n na´ci sve najmanje zajedniµcke sadrµzaoce manje od
m n.

Rješenje. Ako izraz za najmanji zajedniµcki sadrµzalac brojeva m i n napišemo u obliku:


m n
N ZS (m; n) = ) N ZD (m; n) N ZS (m; n) = m n
N ZD (m; n)

vidimo da je broj najmanjih zajedniµckih sadrµzalaca jednak vrijednosti N ZD (m; n). Drugim
rijeµcima, sve najmanje zajedniµcke sadrµzaoce manje od m n odre†ujemo ako N ZS (m; n)
mnoµzimo sa k = 1; 2; :::; N ZD (m; n). Pseudo kod je u nastavku.

Algoritam 4.2 Brojevi uzajamno prosti sa n


Ulaz : m; n
AkoJe(m 4 _ n 4) Kraj
br N ZD (m; n)
N _zs m n=br
Za(k = 1 do N _zs korak 1)
{ Izlaz : k br }

Primjer 4.3 Napraviti algoritam za raµcunanje proizvoda dva cijela broja tzv. russian
peasant metodom.

Algoritmi i programiranje, V.2 42 A.G. 2018/2019, Radni materijal


4.4 Zadaci 4 EUKLIDOV ALGORITAM

Rješenje. Neka su data dva broja a i b, a < b, koja treba pomnoµziti. Navedena metoda
se sastoji u tome da se broj a dijeli sa 2, do koliµcnika 1, a broj b mnoµzi sa 2; na kraju se
saberu vrijednosti niza za broj b koji odgovaraju neparnim vrijednostima koliµcnika broja
a. U nastavku je ilustracija za a = 37 i b = 146.

a 37 18 9 4 2 1
b 146 292 584 1168 2336 4672

Proizvod se dobije kao suma:

P = 146 + 584 + 4672 = 5 402


µ
Citaocu se ostavlja da razmotri matematiµcki aspekt ove metode. Algoritam sadrµzi dva
koraka. U prvom se formiraju podnizovi. Posao se završava kad se dostigne koliµcnik 1. U
drugom koraku se µclanovi jednog niza sabiraju, pod uslovom da su odgovarajući µclanovi
drugog niza neparni. Pseudo kod je u nastavku.

Algoritam 4.3 Russian peasant method


Ulaz : a; b
// Provjera da li su na ulazu nule
AkoJe(a = 0 _ b = 0) Kraj
N iz_a fg
N iz_b fg
// Formiramo radne veliµcine
Br_a min fa; bg
Br_b max fa; bg
k 0 // postavljanje brojaµca
AkoJe(Br_a > 1)
{ Br_a bBr_a=2c
Br_b Br_b 2
k k+1 // Pove´cavamo brojaµc
N iz_a [k] Br_a
N iz_b [k] Br_b }
// Sabiranje
AkoJe(k = 0)
// Ako je k = 0 to znaµci da nije bilo mnoµzenja
{ S Br_b }
Inaµce
{
Za(m = 0 do k 1 korak 1)
{ // Provjera da li je N iz_a [m] neparan
Kol bN iz_a [m] =2c
Ost N iz_a [m] 2 Kol
AkoJe(Ost = 1)
{ S S + N iz_b [m] }
}
}
Izlaz : S

Algoritmi i programiranje, V.2 43 A.G. 2018/2019, Radni materijal


4.4 Zadaci 4 EUKLIDOV ALGORITAM

Za prvi broj se uzima veći od data dva broja, kako bi se smanjio broj operacija i spri-
jeµcile devijacije. Provjera neparnosti je obavljena na naµcin da se raµcuna ostatak prilikom
dijeljenja a [m] sa 2. Ako je ostatak 1 broj je neparan. Koristi se cjelobrojno dijeljenje
(funkcija floor).

Zadatak. Algoritam promijeniti tako da se sve obavlja u jednom prolazu.

Algoritmi i programiranje, V.2 44 A.G. 2018/2019, Radni materijal


µ
5 ANALIZA SLOZENOSTI ALGORITAMA

5 Analiza sloµzenosti algoritama


5.1 Uvod
Cilj analize algoritama je da se predvidi njegovo ponašanje, posebno brzina izvršavanja,
bez realizacije na nekom (konkretnom) raµcunaru, tako da procjena vrijedi za svaki raµcu-
nar.

Taµcno ponašanje algoritma je nemoguće predvidjeti osim u najjednostavnijim sluµcaje-


vima. Na ponašanje utiµce mnogo faktora pa se u obzir uzimaju samo glavne karakteristike
a zanemaruju se detalji vezani za taµcnu realizaciju. Iz tog razloga, analiza sloµzenosti daje
pribliµznu ocjenu. Na taj naµcin se, ipak, dobijaju znaµcajne informacije koje omogućavaju
upore†ivanje razliµcitih algoritama za rješavanje istog problema.

Logiµcan korak je zanemariti konstantne faktore jer se brzine izvršavanja algoritama na


raznim raµcunarima razlikuju pribliµzno za konstantan faktor. Od interesa je ocjena algo-
ritma kada ulazna veliµcina teµzi beskonaµcnosti.

U analizi algoritama se za svaki ulaz odre†uje njegova veliµcina (dimenzija) n. Veliµcina


ulaza nije striktno de…nisana; obiµcno je to mjera veliµcine memorijskog prostora potrebnog
za smještanje ulaza.

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

Osnovna pravila za kalkulisanje sloµzenosti algoritama su :

Svaka instrukcija u sekvenci se broji kao 1 bez obzira na to koliko je izraz sloµzen i
koliko se stvarno koristi mašinskih instrukcija
Konstrukcija "ZaSvaki(...<>...)" se broji n + 1 puta ako se tijelo petlje izvrši
n puta, 1 za inicijalizaciju brojaµca a n za broj ciklusa
Konstrukcija "AkoJe(...)Tada" se broji kao 1 svaki put kad se "postavi pitanje";
ono što uslovljava naredba "Ako ..." broji se onoliko puta koliko to zahtijeva konkretni
sluµcaj
Konstrukcija "SveDokJe(<uslov>)" se broji n + 1 puta ako se tijelo petlje izvrši
n puta

5.2 Zadaci
Primjer 5.1 Sekvencijalno sumiranje. U nastavku je pseudo kod za jednostavan
sluµcaj sekvencijalnog sumiranja.
# Sumiranje Opis
1 Sumiraj(a,n) Ulaz : niz fag duµzine n
2 Suma 0 Inicijalizacija
3 Za(i = 1 do n) Poµcetak petlje
4 { Suma Suma + a [i] } Sumiranje

Algoritmi i programiranje, V.2 45 A.G. 2018/2019, Radni materijal


5.2 Zadaci µ
5 ANALIZA SLOZENOSTI ALGORITAMA

Korak na liniji 2 se izvršava jednom. Petlja sa poµcetkom na liniji 3 se izvršava n puta;


na svakom koraku te petlje se izvršavaju dvije operacije na liniji 4 što znaµci da je okvirni
broj koraka dat sa T (n) = 2n + 1 + 1 = 2n + 2.
Primjer 5.2 Ugnjeµzdena petlja. U ovom primjeru je prezentirana analiza sluµcaja kada
je jedna petlja unutar druge (ugnjeµzdena petlja).
# Sumiranje Opis
1 Sumiraj(a,n) Ulaz : niz fag duµzine n + 1
2 Za(i = 0 do n 1) { Poµcetak spoljne petlje
3 Suma 0 Inicijalizacija sume
4 Za(j = i + 1 do n) { Poµcetak unutrašnje petlje
5 Suma Suma + a [j] } Sumiranje
6 Ispisati : Suma Ispisivanje me†u sume
7 }
Spoljašnja petlja, koja poµcinje na liniji 2, izvršava se n puta, uz jedan korak inicijalizacije
brojaµca i. U svakom koraku se izvršava inicijalizacija na liniji 2, koja se raµcuna kao
jedan korak. Petlja koja poµcinje na linji 4 ima jedan korak inicijalizacije brojaµca j (znaµci
ukupno n inicijalizacija) a petlja se izvršava n i puta za svaku vrijednost i. Ako je i = 1
ona se ponavlja n 1 puta; ako je i = 2 ona se ponavlja n 2 puta itd. Korak na liniji
5 ima dvije operacije. Znaµci, broj operacija u ovom algoritmu je:
X
n 1
T (n) = 1 + [2 (n i) + 1 + 1 + 1]
i=0
X
n 1 X
n
n (n 1)
= 1+2 n 2 i + 3n = 1 + 2n2 2 + 3n
i=0 i=0
2
= 1 + 2n2 n2 + n + 3n = n2 + 4n + 1
Zakljuµcak je da ovaj algoritam ima kvadratnu brzinu : ako se obim niza pove´ca dva puta
broj koraka se pove´ca barem 4 puta.
Primjer 5.3 Sumiranje. U sljede´cem primjeru je prezentirano sumiranje grupa po 5
µclanova datog niza.
# Sumiranje Opis
1 Sumiraj(a, n) Ulaz : niz [a] duµzine n
2 Za(i = 5 do n) { Poµcetak spoljne petlje
3 Suma a [i 4] Iniciranje sume µclanom a [i 4]
4 Za(j = i 3 do i) Poµcetak unutrašnje petlje
5 { Suma Suma + a [j] } Sumiranje
6 Ispisati Suma Ispisivanje Suma
7 }
Spoljašnja petlja, koja poµcinje na liniji 2, izvršava se n 4 puta. U svakom koraku se
izvršava inicijalizacija vrijednosti Suma i to sa µclanom koji je µcetiri pozicije udaljen od
µclana od kojeg poµcinje sabiranje. Ako je i = 5 tada je Suma a [1] itd. Ova operacija je
duµzine jedan korak. Petlja na liniji 4 se izvršava 4 puta, za a [i 3] ; a [i 2] ; a [i 1] i
a [i]. U svakom koraku te petlje se izvode dvije operacije na liniji 5. Ispisivanje, na liniji
7, traje jedan korak. To znaµci da je okvirni broj operacija u ovom algoritmu:
T (n) = 1 + (n 4) [(1 + 4) 2] = 10n 39
Zakljuµcak je da ovaj algoritam ima linearnu brzinu.

Algoritmi i programiranje, V.2 46 A.G. 2018/2019, Radni materijal


5.2 Zadaci µ
5 ANALIZA SLOZENOSTI ALGORITAMA

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

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

Ako je Kljuc manji od te vrijednosti tada se pretraµzuje prva polovina niza; u suprot-
nom 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 zapisan sljede´cim pseudo kodom.


# Binarno pretraµzianje niza Opis
1 BinPret(a; n; Kljuc) Ulaz : niz fag, n i Kljuc
2 Lo 1 Inicijalna vrijednost za donju granicu
3 Hi n Inicijalna vrijednost za gornju granicu
4 SveDokJe(Lo Hi){
1
5 M id (Lo + Hi) Raµcunanje indeksa srednjeg µclana
2
6 AkoJe(Kljuc < a [M id]) { Ako je traµzeni element manji od a [M id]
7 Hi M id 1 } M id je gornja granica donje polovine niza
8 Inaµce AkoJe(Kljuc > a [M id]) { Ako je traµzeni element ve´ci od a [M id]
9 Lo M id + 1 } M id je donja granica gornje polovine niza
10 Inaµce { Ako je traµzeni element jednak a [M id]
11 Poruka : Kljuc = a [M id] !Izlaz } Prona†en je Kljuc
12 }
13 }
14 Poruka : Element nije prona†en Kljuc nije prona†en
Petlja, koja poµcinje na liniji 4, izvršava se samo jednom ako je traµzena vrijednost u
sredini (sortiranog) niza. U prvom prolazu se analizira niz duµzine n, u narednom koraku
niz duµzine n=2 i tako redom do duµzine 1. Ako je dijeljenje sa 2 obavljeno k puta, za
posljednji korak mora vrijediti:
n log n
1 ) n = 2k ) log n k log 2 ) k = log2 n := lg n
2k log 2
Na ovaj naµcin je dobijena procjena maksimalnog broja koraka za postupak binarnog pre-
traµzivanja. Ako se broj elemenata pove´ca dva puta broj operacija ne bi bio dvostruko ve´ci
ve´c mnogo manji, što je znaµcajna ušteda vremena rada.

Primjer 5.5 Napraviti algoritam koji raµcuna an uz zahtjev da broj izvršenja ne prelazi
log n, tj. ne bi trebao pre´ci C log n za neku konstantu C.

Rješenje. Ideja rješenja je da se raµcunaju stepeni a2 , a4 , ... sve dok je moguće a nakon
toga postignuti rezultat mnoµziti sa a dok se ne dobije traµzena veliµcina. Pseudo kod je u
nastavku.

Algoritam 5.1 Raµcunanje n-tog stepena broja a


Ulaz : a; n
// Provjera ulaznih veliµcina

Algoritmi i programiranje, V.2 47 A.G. 2018/2019, Radni materijal


5.2 Zadaci µ
5 ANALIZA SLOZENOSTI ALGORITAMA

AkoJe(a 0 _ n 0) Kraj
// Radne veliµcine
k n
b 1
c a
SveDokJe(k <> 0)
{ // Ako je k paran broj dijelimo ga dok ne dobijemo neparan broj
AkoJe(k 0 (mod 2))
{ // Raµcunamo parne stepene...
k k=2
c c c }
Inaµce
{ // Ako je k neparan smanjujemo ga 1
k k 1
b b c }
Izlaz : an

Ako je k na izlazu iz prvog pitanja (upit : AkoJe(...)) paran u narednoj iteraciji će biti
predmet istog uslova; ako je neparan u narednoj iteraciji će biti predmet alternative (red
µe). Algoritam ćemo demonstrirati na primjeru raµcunanja a12 , u sljedećoj tabeli.
: Inac

k 12 6 3 2 1 0
b 1 1 1 a4 a4 a12
c a a2 a4 a4 a8 a8

Za svaki korak vrijedi da je an = b ck . Red dijeljenja odnosno oduzimanja odgovara


binarnom prikazu stepena n. U našem primjeru je 1210 = 11002 . Ako binarni zapis
posmatra s desna ulijevo, svaka nula u binarnom zapisu odgovara koraku dijeljenja sa
2 (paran broj) a svaka jedinica (neparan broj) koraku u kojem se oduzima 1 od tekuće
vrijednosti za k i raµcuna vrijednost za b.

Analiza sloµzenosti. Broj ponavljanja zavisi od prirode broja n. U najboljem sluµcaju


je n = 2m i tada vrijedi:
log n
n = 2m ) log n = m log 2 ) m =
log 2
U najgorem sluµcaju je n = 2m 1 i tada vrijedi:

log (n + 1)
n = 2m 1 ) n + 1 = 2m ) log (n + 1) = m log 2 ) m =
log 2
Na osnovu ovoga je:
log n log (n + 1)
m
log 2 log 2
Drugim rijeµcima, sloµzenost algoritma je log n.

Primjer 5.6 Dat je neopadaju´ci niz cijelih brojeva fxn g. Napraviti algoritam koji prov-
jerava koliko niz ima razliµcitih µclanova. Dati ocjenu sloµzenosti.

Algoritmi i programiranje, V.2 48 A.G. 2018/2019, Radni materijal


5.2 Zadaci µ
5 ANALIZA SLOZENOSTI ALGORITAMA

Rješenje. Zadatkom se ne traµzi da se identi…kuju razliµciti µclanovi već samo broj ra-
zliµcitih µclanova. Koncept je da se svaki µclan xk poredi sa narednim, xk+1 (zbog svojstva
monotonije); ako su razliµciti aµzurira se brojaµc. Ako se po†e od pretpostavke da je naj-
manji broj razliµcitih brojeva jednak 1 tada algoritam ima izgled u nastavku.

Algoritam 5.2 Broj razliµcitih µclanova niza, Verzija 1


Ulaz : fxn g
// Brojaµc razliµcitih µclanova; koristi se apsolutno indeksiranje
k 1
AkoJe(x [1] = x [n]) Izlaz // ***
Za(i = 1 do n 1 korak 1)
{
AkoJe(x [i] <> x [i + 1])
{ k k+1 }
}
Izlaz : k

Analiza sloµzenosti. Algoritam koristi jedan brojaµc koji ide od 1 do n 1. U svakom


od tih koraka upit AkoJe(x [i] <> x [i + 1])se izvršava jednom, ukupno n 1 puta. U
najboljem sluµcaju niz ima sve jednake µclanove, pa se algoritam završava u 2 koraka,
zbog upita koji oznaµcen sa //***. Ako ne vrijedi ovaj uslov (ako prvi i posljednji µclan
nisu jednaki) niz u najboljem sluµcaju ima dva razliµcita µclana. Korak "k k + 1", koji
ima dvije operacije, izvršava se jednom. U najgorem sluµcaju niz ima sve razliµcite
µclanove (strogo rastući ili strogo opadajući) pa se u svakom od n 1 koraka obavljaju
dvije operacije u koraku "k k + 1". Ovome se u oba sluµcaja dodaje korak inicijalizacije
brojaµca k i inicijalizacija brojaµca i. To znaµci da je broj operacija:
1 + 1 + 1 + (n 1) + 2+ T (n) 2 (n 1) + 1 + 1 + 1
n+4 T (n) 2 n+1
Drugim rijeµcima, ovaj algoritam je linearne sloµzenosti. Ako se po†e od pretpostavke da
je najveći broj razliµcitih µclanova jednak n tada algoritam ima izgled u nastavku.

Algoritam 5.3 Broj razliµcitih µclanova niza, Verzija 2


Ulaz : fxn g
// Brojaµc razliµcitih µclanova
k n
Za(i = 1 do n 1 korak 1)
{
AkoJe(x [i] == x [i + 1])
{ k k 1 }
}
Izlaz : k

Pitanje. Da li se ovaj algoritam moµze iskoristiti za sluµcaj nerastućeg niza i šta se mijenja
u tom sluµcaju ?

Primjer 5.7 Dat je niz cijelih brojeva fxn g, za koje ne postoji pretpostavka o monotoniji.
Napraviti algoritam koji provjerava koliko je razliµcitih µclanova ovog niza. Dati ocjenu
sloµzenosti.

Algoritmi i programiranje, V.2 49 A.G. 2018/2019, Radni materijal


5.2 Zadaci µ
5 ANALIZA SLOZENOSTI ALGORITAMA

Rješenje. U ovom sluµcaju ne postoji pretpostavka o ure†enosti niza (nerastući ili


neopadajući). Koncept je da se napravi drugi niz u koji će se smještati brojevi koji su ra-
zliµciti od svih ostalih u nizu. Uzimamo jedan po jedan µclan inicijalnog niza i poredimo ga
sa svim µclanovima drugog niza; ako na†emo neki koji je jednak sa njim, uzimamo sljedeći
µclan poµcetnog niza; ako takvog nema taj µclan stavljamo kao posljednji µclan drugog niza.
Ovakav koncept nalaµze da imamo dva brojaµca. Pritom se moµze poći od pretpostavke
da je najmanji broj razliµcitih cifara 1 ili da je najveći broj razliµcitih cifara jednak n. U
nastavku je pseudo kod za prvu pretpostavku.

Algoritam 5.4 Broj razliµcitih µclanova niza, bez pretpostavke o monotoniji


Ulaz : fxn g
b fg // Iniciramo niz razliµcitih brojeva
b [1] x [1] // Prvi µclan tog niza je x [1]
k 1 // Brojaµc razliµcitih µclanova
Za(i = 2 do n korak 1)
{
j 1
SveDokJe(b [j] <> x [i])
{ // Ako su razliµciti nastavljamo sa ispitivanjem
j j+1
AkoJe(j > k)
{ // Prošli smo sve µclanove niza b i nema jednakih...
b [j] x [i]
k k+1 // Pove´cava se broj razliµcitih brojeva
}
}
}
Izlaz : k, fbk g

Analiza sloµzenosti. Uvodni koraci se broje kao 1 korak, ukupno 3, µcemu se dodaje 1 za
inicijalizaciju brojaµca i (1 korak), ukupno 4. Prva petlja se izvršava n 1 puta. Najbolji
sluµcaj je kad su svi µclanovi polaznog niza jednaki. Tada se za svako i izvršavaju samo
korak pridruµzivanja j 1 i upit SveDokJe(b [j] <> x [i]), ukupno 2 operacije. Znaµci da
je ukupan broj koraka:
T (n) = 4 + 2 (n 1) = 2n + 2
Najgori sluµcaj je kada su svi µclanovi poµcetnog niza razliµciti. Prije upita SveDokJe(b [j] <>
x [i]) je jedna operacija j 1, ukupno n 1 operacija na nivou cijelog algoritma. Kada je
i = 2 upit upita SveDokJe(b [j] <> x [i]) se izvršava 1 put; kada je i = 3 upit se izvršava
2 puta, ... Unutar upita se vrši dodjela j 1 + 1 (dvije operacije) i upit AkoJe(j > k),
ukupno tri operacije. Tri operacije unutar upita AkoJe(j > k) realizuju se samo jednom.
Znaµci, za svako i se obavi 3 (i 1) + 3 = 3i operacija. Konaµcno:

X
n 1
n (n 1)
T (n) = 3 i + (n 1) + 4 = 3 +n+3
i=1
2
3n (n 1) + 4 (n + 3) 3n2 + n + 12
= =
2 2
Drugim rijeµcima, sloµzenost algoritma je n2 .

Algoritmi i programiranje, V.2 50 A.G. 2018/2019, Radni materijal


5.2 Zadaci µ
5 ANALIZA SLOZENOSTI ALGORITAMA

Primjer 5.8 Sekvencijalno pretraµzivanje. U ovom primjeru je prezentirana metoda


sekvencijalnog pretraµzivanja niza u kojem se traµzi vrijednost Kljuc.
# Sekvencijalno traµzenje Opis
1 TraziSek(a; n; Kljuc) Ulaz : niz [a] duµzine n i Kljuc
2 N asao ? Inicijalizacija radne promjenljive
3 Za(i = 1 do n) { Poµcetak unutrašnje petlje
4 AkoJe(a [i] = Kljuc) { Postavljanje upita
5 N asao >} Postavljanje na drugu vrijednost
6 }
Ovdje je q oznaka da li se realizovao uslov "Ako ...". Na osnovu ovoga se moµze zakljuµciti
da se sloµzenost ovog algoritma izraµzava izrazom:

T (n) = 2n + 2

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

Primjer 5.9 Bubble sort. U ovom primjeru je data analiza sloµzenosti algoritma tzv.
Bubble sorta.
# Sortiranje Opis
1 BubbleSort(fag, n) Sortiranje niza fag
2 Za(i = 1 do n 1) { Poµcetak vanjske petlje
3 Za(j = n 1 do i korak 1) { Poµcetak unutrašnje petlje
4 AkoJe(a [j] > a [j + 1]) { Upit
5 b a [j] Zamjena vrijednosti
6 a [j] a [j + 1]
7 a [j + 1] b}
8 }
9 }
Korak na liniji 2 se izvodi 1+(n 1) puta. Korak na liniji 3 se za i = 1 izvodi 1+(n 1)
puta, za i = 2 izvodi 1 + (n 2) puta, ..., sve do i = n 1 kada se izvodi 1 + 1 puta.
Korak na liniji 4 se izvodi n i puta za i = 1; n 1. Najgori sluµcaj je ako je poµcetni
niz sortiran opadaju´cim redom. Koraci na linijama 5, 6 i 7 se izvode isti broj puta kao i
korak (upit) na liniji 4. To znaµci da je ukupan broj koraka ovog algoritma:

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

Ovo je broj za najgori sluµcaj : kada je poµcetni niz sortiran opadaju´cim redom. Najbolji
sluµcaj je ako je niz sortiran rastu´cim redom; tada se ne rade koraci 5, 6 i 7 pa je:
X
n 1
T (n) = n + 2 i = n + n (n 1) = n2
i=1

Zakljuµcak je da je T (n) = O (n2 ) odnosno da se algoritam izvodi u kvadratnom vremenu.


Pritom se u najgorem sluµcaju obavlja bar 2:5 puta više operacija.

Primjer 5.10 Sumiranje sa pove´canjem inkrementa. Sljede´ci primjer ilustruje


sloµzenost u sluµcaju kada se u svakom koraku gornja granica brojaµca pove´cava dva puta.

Algoritmi i programiranje, V.2 51 A.G. 2018/2019, Radni materijal


5.2 Zadaci µ
5 ANALIZA SLOZENOSTI ALGORITAMA

# Korak Broj Opis


1 Sumiraj(n) Ulaz : broj iteracija (n)
2 k 1 1 Inicijalizacija
3 Suma 0 1 Inicijalizacija sume
4 Za i = 1 do n { n + 1 Poµcetak spoljne petlje
5 Za j = 1 do k { Poµcetak unutrašnje petlje
6 Suma Suma + i j } 2n 1 Sumiranje
7 k k+k n Dupliranje promjenljive k
8 }
Prvo ´cemo napraviti analizu šta ovaj algoritam radi. Ako je i = 1 tada se vrši jedno
sumiranje na liniji 6. Ako je i = 2 tada se vrše 4 sumiranja na liniji 6. Razlog je u
µcinjenici da se linija 8, na kojoj se vrijednost za k duplira, izvršava onoliko puta koliko
se promijeni i odnosno n puta. Na taj naµcin unutrašnja petlja vrši uzastopno sumiranje
1; 2; 4; :::; 2n 1 µclanova. Ne treba izgubiti iz vida da se unutrašnja petlja izvršava 2k + 1
puta. Na osnovu toga, broj koraka izvršenja ovog algoritma je:

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


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

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

Algoritmi i programiranje, V.2 52 A.G. 2018/2019, Radni materijal


6 ASIMPTOTSKA PROCJENA

6 Asimptotska procjena sloµzenosti algoritma


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

6.1.1 -notacija
De…nicija 6.1 Neka je g (n) realna funkcija de…nisana na nekom podskupu skupa prirod-
nih brojeva. Sa (g (n)) se oznaµcava skup realnih funkcija f (n) de…nisanih na nekom
podskupu skupa realnih brojeva takvih da postoje pozitivne konstante c1 , c2 i prirodan broj
n0 takvi da je:

0 c1 g (n) f (n) c2 g (n) ; 8n n0


(9c1 ; c2 > 0) (9n0 2 N) (8n n0 ) (0 c1 g (n) f (n) c2 g (n))

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


(g (n)).

6.1.2 O-notacija
De…nicija 6.2 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 nekom
podskupu skupa realnih brojeva takvih da postoji pozitivna konstanta c i prirodan broj n0
takvi da je:

0 f (n) c g (n) ; 8n n0
(9c > 0) (9n0 2 N) (8n n0 ) (0 f (n) c g (n))

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


O (g (n)). Treba primijetiti da f (n) = (g (n)) povlaµci f (n) = O (g (n)). Strogo matem-
atiµcki, ova de…nicija se iskazuje na sljedeći naµcin:
f (n)
f (n) = O (g (n)) , lim sup <1
n!1 g (n)
Veliµcina O ( ) se tumaµci tako da je g (n) gornja granica za f (n). U tom smislu, oznaka
f (n) = O (g (n)) se tumaµci da "f ne raste brµze od g".

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

Postoje dva formalno bliska ali bitno razliµcita korištenja ove notacije: beskonaµcna (in…-
nite) i in…nitezimalna asimptotika. Ova razlika je jedino u primjeni ali nije i principijelna.

Algoritmi i programiranje, V.2 53 A.G. 2018/2019, Radni materijal


6.1 Uvod 6 ASIMPTOTSKA PROCJENA

Formalna de…nicija za O ( ) je jednaka u oba sluµcaja sa razliµcitim limitima za argumente


funkcije.

U nastavku je nekoliko jednostavnih ali znaµcajnih svojstava O notacije.

1. Ako je f (n) = O (g (n)) tada je a f (n) = O (g (n)) za svaku konstantu a > 0

2. Ako je fi (n) = O (gi (n)), i = 1; 2; :::; k tada je:

f1 (n) + f2 (n) + ::: + fk (n) = O ((g1 + g2 + ::: + gk ) (n))

3. Ako je fi (n) = O (g (n)), i = 1; 2; :::; k tada je:

f1 (n) + f2 (n) + ::: + fk (n) = O (g (n))

4. Ako je fi (n) = O (gi (n)), i = 1; 2; :::; k tada je:

f1 (n) f2 (n) ::: fk (n) = O (g1 (n) g2 (n) ::: gk (n))

5. Ako je f (n) monotono rastuća 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 linearne
funkcije.

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

0 c g (n) f (n) ; 8n n0
(9c > 0) (9n0 2 N) (8n n0 ) (0 c g (n) f (n))

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


(g (n)). Strogo matematiµcki, ova de…nicija se iskazuje na sljedeći naµcin:

f (n)
f (n) = (g (n)) , lim sup >0
n!1 g (n)

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

Iz de…nicije asimpotskih notacija direktno slijedi naredni teorem.

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

Algoritmi i programiranje, V.2 54 A.G. 2018/2019, Radni materijal


6.2 Sloµzenosti nekih tipova algoritama 6 ASIMPTOTSKA PROCJENA

6.2 Sloµzenosti nekih tipova algoritama


6.2.1 Algoritmi konstantnog vremena
Primjer algoritma konstantnog vremena je izbor broja iz liste. Nije bitna duµzina liste.
U jednom koraku se odabire jedan broj i posao se završava. Ako se ulaz poveća n puta
vrijeme izvršenja se ne povećava odnosno "mijenja" se za faktor 1. U tom sluµcaju se kaµze
da algoritam ima brzinu O (1).

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

Primjer iz realnog µzivota je izbor prvog dokumenta sa vrha gomile. Nije vaµzno kolika je
gomila. Algoritmi sa konstantnim vremenom su najbolji mogući algoritmi ukoliko vrijeme
same 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

6.2.2 Algoritmi linearnog vremena


Primjeri ovih algoritama su:
- Prolazak kroz listu (povezane liste ili niza) sa n elemenata
- Nalaµzenje maksimalnog ili minimalnog elementa u listi ili sekvencijalno pretraµzivanje
nesortirane liste od n elemenata
- Prolazak stabla sa n µcvorova
- Iterativno raµcunanje faktorijela broja n;
- Iterativno nalaµzenje n-tog Fibonaµcijevog broja
- Utvr†ivanje da li je broj paran ili ne

Linearni algoritmi su uobiµcajeni u programiranju i generalno su prihvaćeni kao e…kasni


ako ne postoji bolji poznati naµcin za njihovo ubrzanje.

Primjer programskog koda je :


Za(i = a do n korak c) // O (n)
{...}
Dodavanje konstante c brojaµcu petlje znaµci da vrijeme trajanja petlje raste linearno u
odnosu na maksimalnu vrijednost za n. U ovom sluµcaju se petlja izvršava bn=cc puta.
Analogno vrijedi ako se brojaµc i smanjuje za konstantu c.

6.2.3 Algoritmi kvadratnog vremena


Primjeri ovih algoritama su :
- Neki jednostavniji algoritmi sortiranja npr. selection sort n elemenata
- Pore†enje dva dvodimenzinalna niza od po n n elemenata
- Nalaµzenje duplikata u nesortiranoj listi od n elemenata (implementirano sa dvije ugn-
jeµzdene petlje)

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


se radi.

Primjer programskog koda je :

Algoritmi i programiranje, V.2 55 A.G. 2018/2019, Radni materijal


6.2 Sloµzenosti nekih tipova algoritama 6 ASIMPTOTSKA PROCJENA

Za(i = a do n2 korak c) // O (n2 )


{...}
Granica petlje je n2 pa je vrijeme izvršenja kvadratno. U ovom sluµcaju petlja se izvršava
bn2 =cc puta.

Primjer ugnjeµzdene petlje je :


Za(i = a1 do n1 korak c1 )
{
Za(j = a2 do n2 korak c2 )
{...}
}
Primjeri algoritama brzine O (nc ), c > 1 su:
- Parsiranje putem stablasto udruµzenih gramatika (tree-adjoining grammar parsing),
- Maksimalno poklapanje (matching) dva bipartitna grafa

6.2.4 Algoritmi logaritamskog vremena


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 rasta veliµcine ulaza. Ako se
ulaz udvostruµci vrijeme izvo†enja se samo malo produµzi. Klasiµcan primjer algoritma u log-
aritamskom vremenu je binarno pretraµzivanje, koje se koristi u poznatoj igri "poga†anje
brojeva". U toj igri jedan igraµc mora pogoditi broj koji zamisli drugi igraµc. Na svakom
koraku se vrši poga†anje na naµcin da saigraµc kaµze da li je predloµzeni broj veći ili manji.
Ako je broj izme†u 1 i 100 prvi prijedlog je 50. Time se prostor poga†anja smanjuje
za polovinu. Naredni korak je predlaganje broja koji je u polovini odgovarajućeg inter-
vala µcime se (grubo) suµzava krug brojeva za poga†anje. Ako se u toj igri poµcetni opseg
udvostruµci broj poga†anja se ne udvostruµcava. Ako se ulaz poveća n puta potrebno je
log2 n lg n koraka da se do†e do inicijalnog opsega.

Primjer programskog koda je :


Za(i = a do n korak ci ) // O(log n)
{...}
Mnoµzenje brojaµca petlje konstantom c znaµci da maksimalna vrijednost za n mora rasti
eksponencijalno kako bi se vrijeme izvršenja petlje povećavalo linearno pa je iz tog razloga
vrijeme izvršenja logaritamsko. U ovom sluµcaju je ck n, gdje je k broj prolaza. Na
osnovu ovoga je k logc n. Analogno vrijedi ako se brojaµc smanjuje za konstantni faktor
c.

Brzinu O (n log n) = O (log n!) (linearitamsko, loglinear, quasilinear) imaju operacije


provo†enja Furijeove transformacije, algoritmi sortiranja, kao što su quick sort, merge
sort heap sort.
p
6.2.5 Algoritmi brzine n
Ovi algoritmi se izvršavaju proporcionalno kvadratnom korijenu od n (veliµcina ulaza). U
ovom sluµcaju se izvršava petlja u kojoj i poµcinje naprimjer od 1 i pravi se korak koji se

Algoritmi i programiranje, V.2 56 A.G. 2018/2019, Radni materijal


6.2 Sloµzenosti nekih tipova algoritama 6 ASIMPTOTSKA PROCJENA

multiplikativno povećava za konstantu dok se ne postigne uslov p i i < n. Ova petlja se


p izvršiti svih n puta već će se zaustaviti kada i dostigne n. Stoga ona ima vrijeme
neće
( n).

Primjer ovog algoritma je traµzenje odgovora na pitanje da li je broj n prost. Odgovor


se moµze dobiti tako da se provjerava da li je djeljiv sa svim brojevima kojip su manji od
njega. Ako je n = 100 tada se moµze stati ako je djelilac veći od 10 koji je 100.

6.2.6 Algoritmi eksponencijalnog vremena


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 povećanje obima ulaza nema uticaja postoje al-
goritmi za koje se µcini da vrijeme izvršenja eksplodira. Kaµze se da se eksponencijalni
algoritmi izvršavaju u O (an ) ili eksponencijalnom vremenu.

Klasiµcni primjer takvog algoritma je Problem trgovaµckog putnika (Traveling Salesman


Problem - TSP), koji je do sada najviše izuµcavan u teoriji algoritama. Zadatak je jednos-
tavan. Dato je n gradova; trgovaµcki putnik mora obići svaki grad taµcno jednom prije nego
ode kući. Cilj je to uµciniti na najbolji mogući naµcin bilo da je u pitanju najjeftiniji ili na-
jkraći put. Pod najopštijim pretpostavkama, jedini poznati naµcin pouzdanog rješavanja
problema je da se ispita svaki mogući put i da se odabere najbolja. Ne postoji poznati
naµcin da se eliminiše razumni dio putanja bez provjere svake od njih. Broj putanja je n!.

Algoritme sa eskponencijalnim vremenom izvršenja je potrebno izbjegavati što je više


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

Formalno gledano, vrijedi sljedeći odnos brzina algoritama


O (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 )

6.2.7 Kombinacije algoritama


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

Konstrukcije Ako ... Inaµce ... Za ove konstrukcije se uvijek uzima najgori mogući
sluµcaj ako ne postoji sigurnost šta će se desiti. Najgori sluµcaj u bilo kojoj konstrukciji

Algoritmi i programiranje, V.2 57 A.G. 2018/2019, Radni materijal


6.3 Zadaci 6 ASIMPTOTSKA PROCJENA

ovog tipa je da se izvršava bilo Ako bilo Inacµe dio, koji god da je od njih najgori. Iz
praktiµcnih razloga se uzima kako da se dešavaju obje strane.

U izboru najgoreg mogućeg sluµcaja mogu se slijediti dva prosta pravila.


1. Ako vrijeme ukljuµcuje stepen od n kao što je n2 ili n1=2 tada je blok sa većim stepenom
od n gori
2. Ako su stepeni od n jednaki ili ako nema stepena od n blok sa više log n je lošiji
p
Naprimjer, ako se poredi n n 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 da
dominira petlja sa većim vremenom izvršenja.

Ugnjeµzdeni blokovi. Ako je blok ugra†en unutar drugog bloka efekti se multipliciraju.
Ukupno vrijeme izvršenja postaje (n2 ). Primjer je pore†enje dvije nesortirane liste
kako bi se vidjelo da li je neka stavka sadrµzana u obje liste. Uzima se element prve liste i
poredi sa svakim elementom druge liste što uzima vrijeme reda n. S obzirom da se posao
ponavlja za n elemenata druge liste obavlja se n n = n2 operacija pore†enja. Dupliranje
obima ulaza ima za posljedicu µcetiri puta duµze vrijeme izvršenja.

6.3 Zadaci
Primjer 6.1 Neka je f (n) = 23 n2 n, n 2 N. Tada je f (n) = (n2 ). Najprije, vrijedi
2 2 2 1
c1 n2 3
n n c2 n2 za svako n0 n ako i samo ako c1 3 n
c2 za svako
2
n0 n. Odavdje slijedi da mora biti c2 3
. Kako c 1 mora biti pozitivan broj to mora
2 1 2 1 1
biti 3 n 0. To znaµci da je dovoljno uzeti n0 = 3. Iz c1 3 3 slijedi c1 3 . Dakle,
vrijedi da je 13 n2 f (n) 23 n2 za svako n 3.

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


je f (n) = (n2 ) ? Potrebno je odrediti konstante c1 i c2 i prirodan broj n0 takve da je
c1 n2 an2 +bn+c c2 n2 za svako n > n0 . Neka je c1 < a i c2 > a. Tada su nejednadµzbe
(a c1 ) n2 + bn + c 0 i (c2 a) n2 + bn + c 0 zadovoljene za sve prirodne brojeve n0
takve da je n0 > max fx1 ; x2 ; y1 ; y2 g gdje su x1 i x2 nule polinoma (a c1 ) n2 + bn + c a y1
i y2 nule polinoma (c2 a) n2 + bn + c ako postoje; ako ne postoje onda je n0 = 1. znaµci,
vrijedi f (n) 2 (n2 ). Tako†e, ako je f (n) polinom stepena m µciji je vode´ci koe…cijent
pozitivan onda je f (n) = (nm ).

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

Rješenje. Prema de…niciji O notacije, T (n) = O (n3 ) ako je T (n) c n3 za neko


20 1
n n0 . Ako je n3 + 20n + 1 c n3 tada 1 + 2 + 3 c. Ovo vrijedi za svako
n n
n n0 = 1 i c 22. Za veće vrijednosti n0 potreban je manji broj c (npr. za n0 = 10 je
c 1:201) ali u svakom sluµcaju vrijedi traµzena nejednakost.

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

Algoritmi i programiranje, V.2 58 A.G. 2018/2019, Radni materijal


6.3 Zadaci 6 ASIMPTOTSKA PROCJENA

Rješenje. Prema de…niciji O notacije, T (n) = O (n3 ) ako je T (n) c n2 za neko


20 1
n n0 . Ako je n3 + 20n + 1 c n2 tada n + + 2 c. Lijeva strana posljednje
n n
nejednakosti raste neograniµceno tako da ne postoji konstanta c. Stoga, O uslov ne moµze
vrijediti u ovom sluµcaju.

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

Rješenje. Prema de…niciji O notacije, T (n) = O (n4 ) ako je T (n) c n4 za neko


1 20 1
n n0 . Ako je n3 + 20n + 1 c n4 tada + 3 + 4 c. Ovo vrijedi za svako
n n n
n n0 = 1 i c 22. Za veće vrijednosti n0 potreban je manji broj c (npr. za n0 = 10 je
c 1:201) ali u svakom sluµcaju vrijedi traµzena nejednakost.

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

Rješenje. Prema de…niciji notacije, T (n) = (n2 ) ako je T (n) c n2 za neko


20
n n0 . Ako je n3 + 20n + 1 c n2 tada n + c. Lijeva strana nejednakosti ima
p n
minimalnu vrijednost 8:94 za n = 20. Stoga uslov za vrijedi za svako n n0 = 5 i
c 9. Za veće vrijednosti n0 potreban je veći broj c (npr. za n0 = 10 je c 12:01) ali u
svakom sluµcaju vrijedi traµzena nejednakost.

Primjer 6.7 Kako je:


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

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

f (n)
lim =1
n!1 log2 n

vrijedi da je f (n) = O (log2 n). Kako je log2 n = ln n= ln 2 to je f (n) = O (ln n).

Primjer 6.9 Sabiranje ili oduzimanje dva n-bitna cijela broja ima sloµzenost O (n).

Rješenje. Za analizu sloµzenosti mnoµzenja dva broja potreban je kratki prikaz postupka.
Jedan od mogućih naµcina mnoµzenja dva cijela n-bitna broja je tzv. digitalni metod. Neka
su:

a = (a2n 1 a2n 2 :::a1 a0 )2


b = (b2n 1 b2n 2 :::b1 b0 )2

Moµze se staviti:

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


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

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

a b = 22n + 2n A1 B1 + 2n (A1 A0 ) (B0 B1 ) + (2n + 1) A0 B0

Algoritmi i programiranje, V.2 59 A.G. 2018/2019, Radni materijal


6.3 Zadaci 6 ASIMPTOTSKA PROCJENA

Ovo znaµci da se za proizvod dva 2n-bitna broja moraju izraµcunati dvije razlike A1 A0
i B0 B1 dva n-bitna broja, tri proizvoda A1 B1 , (A1 A0 ) (B0 B1 ), A0 B0 a zatim
izvršiti pomjeranje ulijevo i sabiranje.

Ako se sa M (n) oznaµci broj bit operacija potrebnih za mnoµzenje dva n-bitna cijela broja,
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.

Teorema 6.2 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 osnovu
prethodnih 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

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

Primjer 6.10 Na´ci O (n!).

Rješenje. Kako je n! = 1 2 ::: n = (::: ((2 3) 4) 5:::) n, za raµcunanje broja n! je


potrebno n 2 mnoµzenja. Najprije se mnoµzi 2 3 pa se dobijeni proizvod pomnoµzi sa 4,
novi rezultat sa 5 itd dok se ne do†e do mnoµzenja sa n. U koraku (i 1) se i! mnoµzi sa
i + 1 pa je stoga broj mnoµzenja jednak n 2. Za odre†ivanje broja bit operacija treba
se podsjetiti µcinjenice da je broj cifara proizvoda dva binarna broja jednak sumi cifara
faktora ili je za 1 manji od te sume. Neka broj n ima k bita. Svaki broj manji od n ima
najviše k bita. Stoga je n!, kao proizvod n brojeva sa najviše k bita, najviše nk bitni broj.
Broj bita broja n! je manji ili jednak sumi bita svakog faktora što je manje ili jednako
nk. Zbog toga je, za svaki prirodan broj i n, broj i! najviše n k-bitni. Za mnoµzenje i!
sa i potrebno je najviše (nk)k = nk 2 bit operacija. Kako ovakvih mnoµzenja ima (n 2),
to je broj bit operacija za izraµcunavanje n! najviše:

(n 2) nk 2 = n (n 2) (1 + blog2 nc)2 = n (n 2) (lg n)2 = O (n lg n)2

Primjer 6.11 Pokazati da za sve a i b vrijedi (n + a)b = nb .

Rješenje. Imamo sljedeće relacije:

Xb
b b k k
(n + a)b = n a
k=0
k
= nb + bnb 1 a + :::bnab 1
+ ab = nb

Algoritmi i programiranje, V.2 60 A.G. 2018/2019, Radni materijal


6.3 Zadaci 6 ASIMPTOTSKA PROCJENA

Primjer 6.12 Da li je 2n+1 = O (2n ) ? Da li je 22n = O (2n ) ?

Rješenje. Vrijede sljedeće relacije:

2n+1 = 2 2n ) 2n+1 = O (2n )


22n = 2n 2n ) 22n 6= O (2n )

Primjer 6.13 Na´ci najve´ci cijeli broj k takav da je f (x) = O nk za svaku od narednih
funkcija: a) f (n) = 2n2 +n3 log n; b) f (n) = 3n5 +(log n)4 ; c) f (n) = (n4 + n2 + 1) = (n4 + 1);
d) f (n) = (n3 + 5 log n) = (n4 + 1).

Rješenje. U svakom od sluµcajeva moramo naći najveći cijeli broj k takav da je f (x) =
O nk tako da moraju postojati konstante c i n0 takve da je f (n) c nk za n n0 .
a) S obzirom da n3 log n nije O (n3 ) (jer log n raste neograniµceno kako se n povećava)
imamo da je k = 3 premalo. Sa druge strane, sigurno je da log n raste puno sporije od n
pa vrijedi:
2n2 + n3 log n 2n4 + n4 = 3n4
Stoga je k = 4 odgovor, uz uslov da je c = 3 i n0 = 1.
b) Broj (log n)4 je beznaµcajan u pore†enju sa µclanom n5 tako da je odgovor k = 5.
Formalno uzimamo da je c = 4 i n0 = 1.
c) Za velike n koliµcnik je blizak vrijednosti 1. Stoga je odgovor k = 0 odnosno f (n) =
O (n0 ) = O (1). Formalo, moµzemo pisati da je f (n) 3n4 =n4 za sve n 1, tako da
moµzemo uzeti da je c = 3 i n0 = 1.
d) Ovdje je odgovor k = 1 s obzirom da je f (n) bliska vrijednosti 1=n za velike n.
Formalno moµzemo pisati da je:

f (n) 6n3 =n4 ; n 1

tako da moµzemo uzeti da je c = 6 i n0 = 1.

Primjer 6.14 Ako je sloµzenost problema P za najbolji sluµcaj (n log n) a za najgori


sluµcaj O (n2 ) i ako algoritam A rješava problem P , šta od sljede´ceg je mogu´ce: a)pA u
najboljem sluµcaju ima sloµzenost (n); b) A u najgorem sluµcaju ima sloµzenost (n n);
c) A ima prosjeµcnu sloµzenost (n3 ); d) A u najgorem sluµcaju ima sloµzenost (n).

Rješenje. a) Moguće. Moµze sep odabrati c takvo da je c n < n log. b) Moguće. Moµze
se odabrati c takvo da je c n n < n2 . c) Moguće. Prosjeµcna sloµzenost znaµci da donja
granica sloµzenosti moµze biti (n2 ). d) Nemoguće. Razlog : narušavanje sloµzenosti u
najgorem sluµcaju (n log n).

Primjer 6.15 Pokazati da je n = o (n lg n).

Rješenje. Trebamo pokazati da za svako c > 0 postoji n0 > 0 takvo da je:

0 < n < c n lg n; n n0

Ovo je ekvivalentno tome da pokaµzemo da za svako c > 0 postoji n0 > 0 takvo da je:

0 1=c < lg n

Za svako c > 0 odaberemo n0 > 21=c . Tada za svako n n0 imamo da je n > 21=c što je
ekvivalentno relaciji lg n > 1=c.(n)

Algoritmi i programiranje, V.2 61 A.G. 2018/2019, Radni materijal


6.3 Zadaci 6 ASIMPTOTSKA PROCJENA

Primjer 6.16 Neka su a i b striktno pozitivne konstante. Sumu:


logb n
X a i
Sn =
i=0
b

izraziti putem notacije što je mogu´ce jednostavnije. Drugim rijeµcima, na´ci što je
mogu´ce jednostavniju funkciju f (n) takvu da je Sn = (f (n)).

Rješenje. Sluµcaj 1: a = b. Vrijedi:


logb n
X
Sn = Sn = 1= (log n)
i=0

Sluµcaj 2: a < b. Vrijedi:


logb n
a 0 X a i
< Sn <
b i=0
b
1 b
1 < Sn < a =b
1 a
b
Zakljuµcujemo da je Sn = (1).
Sluµcaj 3: a > b. Vrijedi:

logb n
a logb n+1
X a i 1 a logb n
Sn = = b =
b a b
i=0 1
b
nlogb a
= = nlogb a 1
n

Transformacija u drugom koraku se oslanja na sljedeće relacije:

alogb n = c ) logb alogb n = logb c


logb c = logb n logb a = logb nlogb a ) c = nlogb a
) alogb n = nlogb a

Algoritmi i programiranje, V.2 62 A.G. 2018/2019, Radni materijal


7 REKURZIJE

7 Rekurzije
7.1 Uvod
Rekurzija se pojavljuje kada se pojam de…niše pomoću samog sebe ili pomoću istog tipa.
Javlja se u niz disciplina, od lingvistike do logike. Najraširenije je korištenje u matematici
i raµcunarskoj nauci, gdje se funkcije de…nišu pomoću same sebe. Pritom se pazi da se ne
pojavi beskonaµcna petlja odnosno neograniµceno ponavljanje. Brojni su primjeri rekurzija
u matematici, kao što su faktorijel i Fibonaµcijevi brojevi.

Na priloµzenom algoritmu je pseudokod za raµcunanje faktorijela putem rekurzije.

Algoritam 7.1 Raµcunanje faktorijela


F akt(n)
AkoJe(n = 0)
{ F 1 }
Inaµce
{ F n F akt (n 1) }

Prednost ovakvog naµcina rada je što slijedi de…niciju faktorijela. Sa druge strane, pri
svakom pozivu funkcije u memoriji se alocira kopija iste procedure. Tu se vidi i najveći
nedostatak rekurzija: trošenje resursa a samim tim i vremena izvršenja. Iz tog razloga je
potrebno rekurzije mijenjati alternativnim procedurama gdje god je to moguće.

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 se ulaz dijeli na
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).

7.2 Rekurentne jednadµzbe


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, ako
se 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 jednadµzbe. Matematiµckom indukcijom se pokazuje da je ovaj


niz jednoznaµcno odre†en sa prvih k µclanova niza F1 ; F2 ; :::; Fk .

Jedna od najpoznatijih diferentnih jednadµzbi 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µcno


za velike n.

Algoritmi i programiranje, V.2 63 A.G. 2018/2019, Radni materijal


7.2 Rekurentne jednadµzbe 7 REKURZIJE

Kod rekurzivnih funkcija, vrijeme T (n) potrebno za izraµcunavanje vrijednosti funkcije


za ulaz dimenzije n moµze se izraziti kao zbir vremena izraµcunavanja za sve rekurzivne
pozive za ulaze manje dimenzije i vremena potrebnog za pripremu rekurzivnih poziva i
objedinjavanje rezultata. Tako se, obiµcno jednostavno, moµze napisati veza oblika:

T (n) = T (n1 ) + ::: + T (nk ) + c

gdje rekurzivna funkcija za ulaz dimenzije n vrši k rekurzivnih poziva za ulaze (ne
obavezno razliµcitih) dimenzija n1 , ..., nk , dok je sa c dato vrijeme potrebno za pripremu
poziva i objedinjavanje rezultata. Izraz kojim se izraµcunava svaki µclan niza koji se generiše
zove se rješenje.

Homogena rekurentna jednadµzba prvog reda. Opšti oblik je:

T (n) = a T (n 1) ; T (0) = c

Jednostavno se pokazuje da je opšte rješenje ove jednadµzbe dato sa T (n) = c an .

Homogena rekurentna jednadµzba drugog reda. Opšti oblik je:

T (n) = a T (n 1) + b T (n 2) ; T (0) = c0 ; T (1) = c1

Ovdje su c0 i c1 poµcetni uslovi. Rješenje se traµzi pomoću tzv. karakteristiµcne jednadµzbe


koja ima oblik:
t2 = a t + b
Ako su korijeni ove jednadµzbe t1 i t2 razliµciti opšte rješenje je:

T (n) = tn1 + tn2

Taµcne vrijednosti za i se dobijaju kao rješenje sistema:

c0 = + ; c1 = t1 + t2

Ako su korijeni ove jednadµzbe t1 i t2 jednaki opšte rješenje je:

T (n) = tn1 + n tn2

Taµcne vrijednosti za i se dobijaju kao rješenje sistema:

c0 = + ; c1 = t1 + n t2

Homogena rekurentna jednadµzba reda k. Opšti oblik je:

T (n) = a1 T (n 1) + a2 T (n 2) + ::: + ak T (n k)
T (0) = c0 ; T (1) = c1 ; :::; T (k 1) = ck 1

Karakteristiµcna jednadµzba ima oblik:

tk = a1 tk1 1
+ a2 tk2 2
+ ::: + ak

Ako su rješenja fti g, i = 1; :::; k, razliµcita opšte rješenje je:


n n n
T (n) = 1 t1 + 2 t2 + ::: + k tk

Algoritmi i programiranje, V.2 64 A.G. 2018/2019, Radni materijal


7.3 Procjena sloµzenosti 7 REKURZIJE

Koe…cijenti i se dobijaju iz poµcetnih uslova. Ako je rješenje ti dvostruko u opštem


rješenju postoje bazne funkcije tni i n tni ; ako je rješenje trostruko u opštem rješenju
postoje bazne funkcije tni , n tni i n2 tni itd.

Nehomogena rekurentna jednadµzba prvog reda. Opšti oblik je:

T (n) = a T (n 1) + b; T (0) = c

Opšte rješenje, za a 6= 1 je:


an 1
T (n) = b + c an
a 1

7.3 Procjena sloµzenosti


Naµcin procjene brzine rekurzivnih algoritma će biti prezentiran na jednom primjeru. Neka
je data rekurzivna relacija:

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

U ovom sluµcaju je 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 strani
pojavi T (1) što znaµci da je:

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

Na osnovu ovoga se nastavlja prethodna jednadµzba 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 Master
teorem, koji je formulisan i dokazan od strane Cormen, Leierson, Rivest i Stein u knjizi
Introduction to Algorithms. Generaliziranu formu Master teorema dali su Akra i Bazzi
1998. godine i on se odnosi na mnogo širu klasu rekuzivnih algoritama.

Teorema 7.1 Asimptotsko ponašanje niza T (n) rješenja rekurentnog izraza:


n
T (n) = a T + f (n) (1)
b
u kojem je a 1 i b > 1 konstante i f (n) asimptotski pozitivna funkcija, dato je sa:
8
< nlogb a f (n) = O nlogb a " ; " > 0
T (n) = 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.

Algoritmi i programiranje, V.2 65 A.G. 2018/2019, Radni materijal


7.3 Procjena sloµzenosti 7 REKURZIJE

Jedna od varijanti formulacije ovog problema je cilj analiza algoritma A pri µcemu je broj
operacija T (n) za ulaz veliµcine n (vremenska sloµzenost) dat rekurentnim izrazom:
n
T (n) = a T + c nk
b
pri µcemu je a; b; c; k > 0, b 6= 0 odnosno f (n) = c nk i zadata je vrijednost T (1).
Ovakva jednadµzba se dobija za algoritam kod kojeg se obrada ulaza veliµcine n svodi na
obradu a ulaza veliµcine n=b poslije µcega je potrebno izvršiti još c nk koraka da bi se od
parcijalnih 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µze
da su tipa "podijeli pa vladaj" (divide-and-conquer) što je drugi naziv za algoritme koji
su zasnovani na dekompoziciji. Uobiµcajeno je da bude b 2 N.

Dokaz. Dokaz će 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:
1
tm = tm 1 + qm; t0 = T (1)
c
1 m
gdje je tm = a T (bm ) i q = bk =a. Rješenje je:
c
X
m
tm = t0 + qi
i=1

Za q 6= 1 je:
X
m
1 q m+1
qi = 1
i=1
1 q
pa se asimptotsko ponašanje niza tm opisuje sljedećim jednakostima:
8
< O (m) q=1
tm = O (1) 0 < q < 1
:
O (q m ) q>1

S obzirom da je T (bm ) = c am tm , 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 (bk > a) dobija:
8
< O (am ) = O bm logb a = O nlogb a a > bk
T (n) = 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)

Algoritmi i programiranje, V.2 66 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

7.4 Zadaci
Primjer 7.1 Napraviti rekurzivni algoritam koji izraµcunava maksimalni element u nizu
cijelih brojeva. Podrazumijeva se postojanje funkcije max fa; bg, koja daje maksimum dva
cijela broja a i b.
Rješenje. Rješenje je u algoritmu u nastavku.
Algoritam 7.2 Rekurzivno raµcunanje maksimalnog elementa niza
Funkcija NadjiMax(a,n)
AkoJe(n = 1)
{ Vrati(a [1]) }
Inaµce
{ Vrati(max fa [n] ,NadjiMax(a; n 1)g) }
Sada ćemo pokazati da je algoritam korektan. Neka je P (n) oznaka za tvrdnju da algo-
ritam nalazi i daje maksimalni cijeli broj na pozicijama a [1] do a [n]. U skladu sa tim,
pokazujemo da je P (n) taµcna za svako n 2 N.
Poµcetni korak: Ako niz ima samo jedan element tj. ako je n = 1 tada je jasno da je taj
element maksimalni i dobija se na liniji 2 algoritma. Ujedno vidimo da je P (1) taµcno.
Indukcijska hipoteza. Pretpostavimo da algoritam nalazi i daje maksimalni element ako
niz a ima taµcno k elemenata. Posmatrajmo sluµcaj kada niz a ima k + 1 elemenata. S
obzirom da je (k + 1) > 1 izvršava se korak na liniji 4. U tom koraku se prvo poziva
funkcija NadjiMax sa taµcno k elemenata. Na osnovu indukcijske hipoteze je poznat
maksimalni element sa pozicija a [1] do a [k]. Sada je maksimalni element ili a [k + 1]
ili maksimalni element na pozicijama a [1] do a [k]; neka je to broj r. Stoga, traµzenjem
maksimuma izme†u a [k + 1] i r jasno se dobija maksimalni element niza a što zaµci da
P (1) ! P (k + 1). Primjenom prvog principa matematiµcke indukcije, zakljuµcujemo da
je P (n) istinita za svako n 2 N. Algoritam je korektan.
n
Primjer 7.2 Neka je T (n) = 8 T + 1000n2 .
2
Rješenje. Ovdje je a = 8, b = 2, f (n) = 1000n2 , logb a = log2 8 = 3. Sada se provjerava
da 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 se
prvi 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.
n
Primjer 7.3 Neka je T (n) = 2 T + 10n.
2
Rješenje. Ovdje je a = 2, b = 2, k = 0, f (n) = 10n, logb a = log2 2 = 1. Sada se
provjerava da li vrijedi:
f (n) = O nlogb a ) f (n) = O (n)
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.

Algoritmi i programiranje, V.2 67 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

n
Primjer 7.4 Neka je T (n) = 2 T + n2 .
2
Rješenje. Ovdje je a = 2, b = 2, f (n) = n2 , logb a = log2 2 = 1. Sada se provjerava da
li vrijedi:
f (n) = nlogb a+" = n1+"
Ako se uzme " = 1 tada se dobije n2 = (n2 ). Koristi se treći sluµcaj Master teoreme, s
tim da se najprije provjerava uslov regularnosti:
n n 2
a f c f (n) ) 2 c n2
b 2
Ako se uzme c = 1=2 tada je uslov zadovoljen 8n 2 N pa je T (n) = (f (n)) odnosno
T (n) = (n2 ). Taµcno rješenje je T (n) = 2n2 n uz uslov da je T (1) = 1.
n
Primjer 7.5 Neka je T (n) = 6 T + n2 log n.
3
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:
n n 2 n
a f c f (n) ) 6 log c n2 log n
b 3 3
2 2 log n log 3 2 log 3
(log n log 3) c log n ) c = 1
3 3 log n 3 log n

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

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


n p
Primjer 7.6 Neka je T (n) = 2T + n n.
4

Rješenje. U ovom sluµcaju je a = 2 i b = 4 pa je nlogb a = n1=2 . Tako†e, vrijedi


f (n) = n3=2 . S obzirom da se radi o sluµcaju (3) Master teoreme provjerava se uslov
regularnosti: r p
n n n n n n f (n)
a f =2 f =2 = =
b 4 4 4 4 4
Ovaj uslov vrijedi za dovoljno veliko n pa se moµze pisati da je:
p
T (n) = (f (n)) = n n

Primjer 7.7 Za sljede´ce izraze, korištenjem Master teoreme, utvrditi da li su rješivi :

Algoritmi i programiranje, V.2 68 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

n n
T (n) = 3 T + n2 T (n) = 3 T +n
2 2
n n p
T (n) = 4 T + n2 T (n) = 3 T + n
2 3
n
T (n) = T + 2n n
2 T (n) = 4 T + cn
2
n
T (n) = 2n T + nn n
2 T (n) = 3 T + n log n
n 4
T (n) = 16 T +n
4 n n
T (n) = 3 T +
n 3 2
T (n) = 2 T + n log n
2 n n
n n T (n) = 4 T +
T (n) = 2 T + 2 log n
2 log n
n
n T (n) = 64 T n2 log n
T (n) = 2 T + n0:51 8
4
n
1 n 1 T (n) = 7 T + n2
T (n) = T + 3
2 2 n
n n
T (n) = 16 T + n! T (n) = 4 T + log n
4 2
p n n
T (n) = 2 T + log n T (n) = T + n (2 cos n)
4 2
Rješenja.
n
T (n) = 3 T + n2 ) T (n) = (n2 ) (sluµcaj 3)
2
n
T (n) = 4 T + n2 ) T (n) = (n2 log n) (sluµcaj 2)
2
n
T (n) = T + 2n ) T (n) = (n2 ) (sluµcaj 3)
2
n
T (n) = 2n T + nn ) ne primjenjuje se (a nije konstanta)
2
n
T (n) = 16 T + n ) T (n) = (n2 ) (sluµcaj 1)
4
n
T (n) = 2 T + n log n ) T (n) = n log2 n (sluµcaj 2)
2
n n
T (n) = 2 T + )ne primjenjuje se (nepolinomijalna razlika izme†u f (n)
2 log n
i nlogb a )
n
T (n) = 2 T + n0:51 ) T (n) = (n0:51 ) (sluµcaj 3)
4
1 n 1
T (n) = T + )ne primjenjuje se (a < 1)
2 2 n

Algoritmi i programiranje, V.2 69 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

n
T (n) = 16 T + n! ) T (n) = (n!) (sluµcaj 3)
4
p n p
T (n) = 2 T + log n ) T (n) = ( n) (sluµcaj 1)
4
n
T (n) = 3 T + n ) T (n) = nlg 3 (sluµcaj 1)
2
n p
T (n) = 3 T + n ) T (n) = (n) (sluµcaj 1)
3
n
T (n) = 4 T + c n ) T (n) = (n2 ) (sluµcaj 1)
2
n
T (n) = 3 T + n log n ) T (n) = (n log n) (sluµcaj 3)
4
n n
T (n) = 3 T + ) T (n) = (n log n) (sluµcaj 2)
3 2
n n
T (n) = 4 T + ) T (n) = (n2 ) (sluµcaj 1)
2 log n
n
T (n) = 64 T n2 log n )ne primjenjuje se jer f (n) nije pozitivna
8
n
T (n) = 7 T + n2 ) T (n) = (n2 ) (sluµcaj 3)
3
n
T (n) = 4 T + log n ) T (n) = (n2 ) (sluµcaj 1)
2
n
T (n) = T + n (2 cos n) )Ne primjenjuje se. Pripada sluµcaju 3 ali je narušen
2
uslov regularnosti (pretpostavimo da je n = 2 k gdje je k neparan i proizvoljno
veliki. Za svaki takav izbor od n pokazuje se da je c 3=2 pa je narušen uslov
regularnosti)
U primjeru 7 razlika izme†u f (n) i nlogb a se moµze prikazati kao koliµcnik:
n
f (n) log n n 1
= = =
nlogb a nlog2 2 n log n log n
1
Jasno je da je < n" za bilo koje " > 0. Stoga razlika nije polinomijalna i ne moµze
log n
se primijeniti Master teorema.
p
Primjer 7.8 Riješiti rekurziju T (n) = 2 T ( n) + 1, metodom smjene promjenljivih.
Rješenje treba biti asimptotski taµcno.
Rješenje. Napravimo smjenu m = lg n ) n = 2m , na osnovu µcega rekurzija postaje:
T (2m ) = 2 T 2m=2 + 1
Neka je S (m) = T (2m ) tako da rekurzija postaje:
S (m) = 2 S (m=2) + 1 ) S (m) = O (lg m)
Vraćamo smjenu i dobijamo:
T (n) = T (2m ) = S (m) = O (lg m) = O (lg lg n)

Algoritmi i programiranje, V.2 70 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

Primjer 7.9 Rekurzija T1 (n) = 7 T1 (n=2) + n2 opisuje vrijeme izvršenja algoritma A.


Konkurentski algoritam B se izvršava u vremenu T2 (n) = a T2 (n=4) + n2 . Koja je
najve´ca vrijednost za a takva da je B asimptotski brµzi od A ?

Rješenje. U prvom sluµcaju, na osnovu Master teoreme je a = 7, b = 2 i f (n) = n2 . S


obzirom da je:
nlogb a = nlg 7 n2:8
radi se o prvom sluµcaju. Za " 0:8 imamo da je T1 (n) = nlg 7 . S obzirom da je f (n)
jednaka u oba sluµcaja, sa drugom rekurzijom postupamo kao da pripada prvom sluµcaju.
Mora biti zadovoljena relacija:

log4 a = lg 7 ) a = 48

Drugim rijeµcima, algoritam B je asimptotski brµzi od A ako je a < 48. Drugi sluµcajevi
Master teoreme se ne primjenjuju za a > 48.

Primjer 7.10 Neko je otkrio naµcin da matrice 68 68 pomnoµzi sa 132464 mnoµzenja, ma-
trice 70 70 pomnoµzi sa 143640 mnoµzenja i matrice 72 72 pomnoµzi sa 155424 mnoµzenja.
Koja metoda daje asimptotski najbolje vrijeme izvršenja ako se koristi strategija "podijeli
i vladaj" ?

Rješenje. Za svaki od sluµcajeva formulišemo rekurentnu relaciju i rješavamo je putem


Master teoreme.

T (n) = 132464 T (n=68) + n2 ) T (n) = nlog68 132464 (n2:795128 )

T (n) = 143640 T (n=70) + n2 ) T (n) = nlog70 143640 (n2:795123 )

T (n) = 155424 T (n=72) + n2 ) T (n) = nlog72 152464 (n2:795147 )

Primjer 7.11 Korištenjem matematiµcke indukcije pokazati da je taµcno rješenje rekurentne


relacije:
n
T (n) = 2 T + n; T (1) = 0
2
dato sa T (n) = n log2 n = n lg n.

Rješenje. Poµcetak. Za n = 2 su zadovoljene i rekurentna relacija i rješenje.


Indukcijska hipoteza. Pretpostavimo da je T (r) = r log r za sve 2 r k.
Induktivni korak. Sada razmatramo T (k + 1). Prema uslovima, vrijedi:

k+1
T (k + 1) = 2 T + (k + 1)
2
k+1 k+1
= 2 log2 + (k + 1)
2 2
= (k + 1) [log2 (k + 1) log2 2] + (k + 1)
= (k + 1) log2 (k + 1) (k + 1) + (k + 1)
= (k + 1) log2 (k + 1) (k + 1) lg (k + 1)

Algoritmi i programiranje, V.2 71 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

Primjer 7.12 Metodom zamjene riješiti rekurziju:

1X
n 1
T (n) = T (k) + n
n k=1

Pretpostaviti da rekurzija vrijedi za sve n > 1 i T (1) = 1. Koristiti relaciju T (n) cn2
za sve n n0 kao procjenu. Identi…kovati speci…µcne vrijednosti za c i n0 za koje procjena
vrijedi.

Rješenje. Izaberimo da je n0 = 1.
Osnovni sluµcaj. Trebamo pokazati da je T (1) c 12 . Izborom c T (1) = 1 ovo je
osigurano.
Induktivna hipoteza. Za sve k, 1 k < n vrijedi T (k) c k 2 .
Induktivni korak. Zamjenom induktivne hipoteze u datu rekurziju imamo:

3X
n 1
3c n (n 1) (2n 3)
T (n) c k2 + n = +n
n k=1 n 6
c c
= (n 1) (2n 3) + n = 2n2 5n + 3 + n
2 2
2 5cn 3c
= c n + +n
2 2
Da bi ovo bilo najviše c n2 mora biti:
5cn 3c
+ +n 0
2 2
Ovo je taµcno za sve c 1 i n 1, što znaµci da je izbor c = 1 dovoljan da vrijedi osnovni
sluµcaj i induktivna hipoteza.

Primjer 7.13 Riješiti rekurziju:


n
T (n) = 4 T + n2 log n
2
Rješenje. Direktnim korištenjem Master teoreme imamo da je a = 4, b = 2 i f (n) =
n2 log n. Stoga je f (n) 2 nlogb a log1 n odakle slijedi da je T (n) = n2 log2 n .

Primjer 7.14 Dati donje i gornje granice za T (n) za svaku od sljede´cih rekurzija, pod
pretpostavkom da je T (1) konstatno: a) T (n) = T (n 1)+n; b) T (n) = T (n 1)+1=n;
n
c) T (n) = T (n 1) + lg n; d) T (n) = 2T (n=2) + n lg n; e) T (n) = 5T (n=5) + .
lg n

Rješenje. Za ove rekurzije se ne koristi Master teorema. a) Pretpostavimo da je T (1) = 1


i razvijmo rekurziju:

T (n) = T (n 1) + n
= n + (n 1) + (n 2) + ::: + 2 + T (1)
Xn
n (n + 1)
= k= = n2
k=1
2

Algoritmi i programiranje, V.2 72 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

b) Pretpostavimo da je T (1) = 1 i razvijmo rekurziju:


1
T (n) = T (n 1) +
n
1 1 1 1 1 X1 n
= + + + ::: + + =
n n 1 n 2 2 T (1) k=1 k

Granice sume moµzemo naći pomoću integrala:

X
n Z
n+1
1 dx
T (n) = = ln (n + 1) ln n = (ln n)
k=1
k x
1

X
n Xn Zn
1 1 dx
T (n) = =1+ 1+ = 1 + ln n = O (ln n)
k=1
k k=2
k x
1
) T (n) = (ln n) = (lg n)

c) Pretpostavimo da je T (1) = 0 i razvijmo rekurziju:

T (n) = T (n 1) + lg n
= lg n + lg (n 1) + lg (n 2) + ::: + lg 2 + lg 1
!
Xn Yn
= lg k = lg k = lg (n!) = (n lg n)
k=1 k=1

Korištena je Stirlingova aproksimacija.

d) Pretpostavimo da je n = 2m , za neko m, i da je T (1) = c, a zatim razvijmo rekurziju:


n
T (n) = 2 T + n lg n
2
n n n
= 2 2T + lg + n lg n
4 2 2
n n n n n
= 2 2 2T + lg + lg + n lg n
8 4 4 2 2
n n n n
= 2 2 :::2 (2 (2T (1) + 2 lg 2n) + 4 lg 4) + ::: + lg + lg + n lg n
4 4 2 2
n n
= n c + lg 2 + lg 4 + ::: + lg + lg + lg n
! 4 2
lg n
X lg2 n + lg n
= n c+ k =n c+
k=1
2
1 1
= n lg2 n + n lg n + cn = n lg2 n
2 2

Algoritmi i programiranje, V.2 73 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

e) Pretpostavimo da je n = 5m , za neko m, i da je T (1) = c, a zatim razvijmo rekurziju:


n
T (n) = 5T (n=5) +
lg n
n n=5 n
= 5 5T + +
25 lg (n=5) lg n
5 25 n=25 n=5 n
= 5 5 :::5 5 5T (1) + + + ::: + + +
lg 5 lg 25
lg (n=25) lg (n=5) lg n
1 1 1 1 1
= n c+ + 2
+ ::: + 2
+ +
lg 5 lg 5 lg (n=5 ) lg (n=5) lg n
lg5 n
! lg5 n
X 1 n X 1
= n c+ k
= nc + = (n lg lg n)
k=1
log 5 lg 5 k=1
k

Primjer 7.15 Sljede´ce rekurzije riješiti metodom iteracije. Za svaki problem pretpostaviti
da je T (n) = (1) za n 1 i T (n) za n > 1 kako slijedi: a) T (n) = aT (n=b) + (n);
b) T (n) = 5T (n=5) + n2 ; c) T (n) = T (n=2) + T (n=3) + n; d) T (n) = T (n 2) + 7;
e) T (n) = n T (n 1) + 1. U taµcki a) je potrebno zasebno analizirati sluµcajeve a > b,
a = b i a < b.

Rješenje. a) T (n) = aT (n=b) + (n). Ovdje su a i b pozitivni cijeli brojevi. Iteracijom


(k 1) puta i razvijanjem desne strane rekurzije daje:
!
n X
k 1
a i
T (n) = ak T k + n
b i=0
b

Izaberimo k takvo da je n=bk 1 i n=bk 1


> 1. Ovo povlaµci da k zadovoljava uslove:

n bk < b n ) logb n k < logb n + 1

kao i da vrijedi:
nlogb x xk < x nlogb x
Sada razmatramo sluµcajeve a = b i a 6= b zasebno.
Sluµcaj 1: a = b. Prethodna rekurzija implicira da je:
n
T (n) = bk T + (nk)
bk
Zamjenom u nejednakosti za k dobijamo:

T (n) = (n) (1) + (n log n) = (n log n)

Sluµcaj 2: a 6= b. U ovom sluµcaju prethodna nejednakost se pojednostavljuje na:


n a k
T (n) = ak T + n
bk b
Zamjenom nejednakosti koja sadrµzi k u rekurziju dobijamo:

T (n) = nlogb a (1) + nlogb (a=b)+1


= nlogb a + nlogb a = nlogb a

Algoritmi i programiranje, V.2 74 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

b) T (n) = 5T (n=5) + n2 . Iteracijom (k 1) puta daje rekurziju:

n X 1 k 1
k
T (n) = 5 T k + n2
5 i=0
5i

Izaberimo k tako da zadovoljava uslove n=5k 1 i n=5k 1


> 1. Ako uzmemo u obzir da
X
k 1
1
je i
= (1) i izvršimo zamjenu, dobijamo:
i=0
5

T (n) = (n) (1) + n2 (1) = n2

c) T (n) = T (n=2) + T (n=3) + n. Prva iteracija daje:


n n n 5
T (n) = T 2
+2 T +T 2 + n+n
2 2 3 3 6
Druga iteracija daje:
2 1 0
n n n 5 5 5
T (n) = T 3 + 3 T 2 +T 3 + n+ n+ n
2 2 3 3 6 6 6
Iteracija u (k 1)-om koraku daje:

Xk
k n X
k 1
5
i
T (n) = T j k j
+n
j=0
j 23 i=0
6

Sada se koristi µcinjenica da je T (n) monotono rastuća kako bi se dobile sljedeće granice
sumiranja:
Xk
k n X
k 1
5
i Xk
k n X
k 1
5
i
T k +n T (n) T k +n
j=0
j 3 i=0
6 j=0
j 2 i=0
6

Sada koristimo µcinjenice da je:


Xk
k X
k 1
5
i X
1
5
i
= 2k ; 1 =6
j=0
j i=0
6 i=0
6

kako bi izvršili zamjenu i redukciju nejednakosti, pa se dobije:


n n
2k T + n (1) T (n) 2k T + n (1) (1)
3k 2k
U cilju redukcije lijeve strane nejednakosti (1) izabiremo k takvo da je n=3k 1 i n=3k 1
>
1. Ovo povlaµci da je:

n 3k ^ log3 n k 1 + log3 n )
log3 2
n 2k 2 nlog3 2

Zamjenom na lijevoj strani u (1) dobijamo:

nlog3 2 (1) + (n) T (n)


(n) T (n)

Algoritmi i programiranje, V.2 75 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

U cilju redukcije desne strane nejednakosti (1) izabiremo k takvo da je n=2k 1 i


k 1 k
n=2 > 1. Ovo povlaµci da je n 2 < 2n. Zamjenom na desnoj strani u (1) do-
bijamo:
T (n) (n) (1) + n (1) = (n)
S obzirom da je (n) T (n) (n) imamo da je T (n) = (n).

d) T (n) = T (n 2) + 7. Nakon (k 1) iteracija imamo:

T (n) = T (n 2k) + 7k

Izbor k takvog da je:


n 1 n+1
k<
2 2
i zamjena u rekurziji daje:

T (n) = (1) + 7 (n) = (n)

e) T (n) = n T (n 1) + 1. Nakon (k 1) iteracija imamo:

T (n) = n (n 1) (n 2) ::: (n (k 1)) T (n k) + k

Izbor k takvog da je n 1 j < n daje:

T (n) = n! T (1) + n = n! (1) + n = (n!)

Primjer 7.16 Korištenjem Master teoremep riješiti sljede´ce rekurzije: a) T (n) = 5


T (n=2) + n2 ; b) T (n) = 5 T (n=2) + n n; c) T (n) = a T (n=a) + n2 lg n.

Rješenje. a) Vrijedi da je a = 5, b = 2 i nlogb a = nlog2 5 , kao i f (n) = n2 . S obzirom da


je log2 5 > 2 postoji " > 0 takvo da je log2 5 " > 2. Stoga je n2 = O nlog2 5 " za neko
" > 0. Primjenjuje se Sluµcaj 1 Master teoreme i imamo da je T (n) = nlog2 5 .
b) Rješenje je gotovo identiµcno onom u taµcki a) osim što je sada f (n) = n3=2 . Ponovo se
koristi Sluµcaj 1 Master teoreme i dobijamo da je T (n) = nlog2 5 .
loga a
c) Ovdje je n = n i f (n) = n lg n. Za neko " 2 (0; 1] je n2 lg n = (n1+" ). Za
2

korištenje Sluµcaja 3 Master teoreme trebamo provjeriti uslov regularnosti.

n n 2 n 1
af =a lg = n2 (lg n lg a)
a a a a

Kako je a > 1 vrijedi da je lg a 0 pa je (lg n lg a) lg n. Stoga je:

1 1
n2 (lg n lg a) n2 lg n
a a

Kako je a > 1 vrijedi da je 1=a < 1 pa vrijedi uslov regularnosti. U skladu sa tim se
koristi Sluµcaj 3 Master teoreme i imamo da je T (n) = (n2 lg n).

Primjer 7.17 Sljede´ce rekurzije riješiti metodom zamjene. Pretpostaviti da svaka rekurz-
ija vrijedi za n > 1 i da je T (n) = (1) za n < 1: a) T (n) = T (n=2) + T (n=3) + n,
uz T (n) = O (n); b) T (n) = T (n=3) + T (2n=3) + n, uz T (n) = (n lg n); c) T (n) =
T ( n) + n, 2 (0; 1), uz T (n) = (n).

Algoritmi i programiranje, V.2 76 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

Rješenje. a) Neka je n0 = 1.
Osnovni korak. Trebamo pokazati da je T (1) c 1. Ako odaberemo c T (1) ovaj
uslov je zadovoljen.
Indukcijska hipoteza. Neka vrijedi da je T (n) c k za sve k takve da je n0 k < n.
Sada ćemo pokazati da je T (n) c n. Zamjenom indukcijske hipoteze u rekurziju za
T (n) dobijamo:
n n 5n
T (n) c +c +n=c +n
2 3 6
5n
Da bi se pokazalo da je T (n) c n dovoljno je pokazati da je c + n c n za neko
6
c > 0. Ovo vrijedi za c 6. Stoga osnovni korak i indukcijska hipoteza vrijede ako je
c max fT (1) ; 6g.
b) Neka je n0 = 2.
Osnovni korak. Trebamo pokazati da je T (2) c 2 lg 2 = 2c. Ako odaberemo c T (2) =2
ovaj uslov je zadovoljen.
Indukcijska hipooteza. Neka vrijedi da je T (n) c k lg k za sve k takve da je n0 k < n.
Zamjenom indukcijske hipoteze u rekurziju za T (n) dobijamo:

n n 2n 2n
T (n) c lg +c lg +n
3 3 3 3
cn
= [lg n lg 3 + 2 lg (2n) 2 lg 3] + n
3
cn
= [lg n 3 lg 3 + 2 lg n + 2] + n
3
cn
= [3 lg n 3 lg 3 + 2] + n
3
2
= c n lg n c n lg 3 + cn + n
3
Da bi se pokazalo da je T (n) cn lg n dovoljno je pokazati da je:
2
c n lg n c n lg 3 + cn + n c n lg n
3
Ovo je ekvivalentno uslovu da je:
2
cn + n c n lg 3
3
Rješenje po c daje:
1
c
2
lg 3
3
Kako je lg 3 > 1 > 2=3 vrijedi da je 1= (lg 3 2=3) > 0, pa postoji c > 0 takvo da nije
veće od ove veliµcine. Izbor c min fT (2) ; 1= (lg 3 2=3)g osigurava da vrijede i osnovni
sluµcaj i indukcijska hipoteza.

c) Neka je n0 = 1.
Osnovni korak. Trebamo pokazati da je c1 1 T (1) c2 1. Ako odaberemo c1 T (1)
i c2 T (1) uslov će biti zadovoljen.

Algoritmi i programiranje, V.2 77 A.G. 2018/2019, Radni materijal


7.4 Zadaci 7 REKURZIJE

Indukcijska hipoteza. Neka vrijedi da je c1 k T (k) c2 k za sve k takve da je


n0 k < n. Zamjenom indukcijske hipoteze u rekurziju za T (n) dobijamo:
c1 ( n) + n < T (n) < c2 ( n) + n
Da bi se pokazalo da je c1 n T (n) dovoljno je pokazati da je c1 n c1 ( n) + n. Ovo
vrijedi ako je c1 1= (1 ). Sliµcno, da bi se pokazalo da je c2 n T (n) dovoljno je
pokazati da je c2 n > c2 ( n) + n. Ovo vrijedi ako je c2 1= (1 ). S obzirom da je
< 1 a time i 1 > 0, moguće je naći vrijednosti:
c1 < min fT (1) ; 1= (1 )g ; c2 > max fT (1) ; 1= (1 )g
Primjer 7.18 Riješiti naredne rekurzije odnosno na´ci funkcije g (n) takve da je T (n) =
(g (n)). U svim sluµcajevima
p je pretpostavka da je T (n) > 0 za sve male
p vrijednosti n.
a) T (n) = 2 T (n=5) + n; b) T (n) = T (n=2) + 1=n; c) T (n) = T ( n) + 1.
Rješenje. a) Koristimo Master teoremu pa imamo:
a = 2 ^ b = 5 ) nlogb a = nlogb 2
Tako†e je f (n) = n0:5 . Stoga postoji " > 0 takvo da f (n) = nlogb a+" . Tako†e je:
p p
af (n=b) = 2f (n=5) = 2 n=5 = 0:894427 n
što znaµci da jepzadovoljen uslov regularnosti. Prema Sluµcaju 3 Master teoreme imamo da
je T (n) = ( n).

b) Ako koristimo metodu iteracije vidimo da je:


1 2 4 2k
T (n) = + + + ::: + + (1)
n n n n
2k < n ^ 2k+1 n
Stoga je T (n) = 2k+1 1 =n + (1). Kako je 2k+1 2n dobijamo:
n 1 2n 1
+ (1) < T (n) + (1)
n n
Na osnovu ovoga imamo da je T (n) = (1). Alternativa je dokaz korištenjem Master
teoreme. Imamo da je:
1
a = 1 ^ b = 1 ) nlogb a = n0 = 1; f (n) = =n 1
n
Znaµci da postoji " > 0 takvo da je f (n) = O nlogb a "
i korištenjem Sluµcaja 1 Master
teoreme imamo da je T (n) = (1).

c) Korištenjem metode iteracije dobijamo:


X
k
T (n) = 1+ (1)
i=1
k k+1
gdje je n1=2 > 2 i n1=2 2. Ovo implicira da je:
lg lg n 1 lg lg n ) T (n) = (lg lg n)

Algoritmi i programiranje, V.2 78 A.G. 2018/2019, Radni materijal


8 SORTIRANJA

8 Sortiranja
8.1 Uvod
Algoritmi sortiranja su primjer matematiµckih algoritama koji se rješavaju putem mnogih
drugih razliµcitih metoda.

U opštem sluµcaju, sortiranje se shvata kao proces pregrupisavanja datog skupa objekata u
nekom odre†enom redoslijedu. Cilj sortiranja je olakšati pretraµzivanje elemenata u tako
sortiranom skupu. To je skoro univerzalni, fundamentalni zadatak. U svakodnevnom
µzivotu se srećemo 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 je
skoro zakon, a u sluµcaju sortiranja takva zakonitost je toliko duboka da se odgovarajuće
metode dijele na dvije klase, sortiranje nizova i sortiranje fajlova. Nekada se nazivaju
unutrašnje i vanjsko sortiranje, s obzirom da se nizovi pohranjuju u brzo internoj memoriji
dok su fajlovi pohranjeni na spoljnim, sporijim ure†ajima (diskovi,...). Ovo je moguće
ilustrovati na primjeru sortiranja igraćih karata. Ako se karte posmatraju u obliku niza
onda su posloµzene na stolu i onaj ko ih sortira vidi ih sve pojedinaµcno i ima neposredan
pristup svakoj od njih. Ako karte obrazuju fajl to podrazumijeva da je vidljiva samo ona
na 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 niz
ak1 ; 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 već se µcuva
kao 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 moguće sortirati veoma velike liste bez potrebe alokacije (dodjeljivanja)
dodatnog memorijskog prostora.

Metod sortiranja je stabilan ako se u procesu sortiranja odgovarajući odnos elemenata sa


jednakim kljuµcevima ne mijenja. Ovo je µcesto poµzeljna osobina ako se radi o elementima
koji su već sortirani nekim metodom koji nema uticaja na kljuµc.

8.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 odgovarajući
poredak obavljaju na tom istom mjestu. Drugim rijeµcima, metode koje podrazumijevaju
da se elementi niza a premještaju u niz b predstavljaju bitno manji interes. Zbog ovakvih
ograniµ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 , broj
premještanja (permutacija) elemenata. Ovi brojevi su funkcija od n, dimenzije niza koji
se sortira.

Mada dobri algoritmi sortiranja trebaju n log n upore†ivanja, analiza poµcinje od prostijih
i 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

Algoritmi i programiranje, V.2 79 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

Postupci tih metoda se lako pamte i kratki su. Ne treba zaboraviti da i programi
zauzimaju memoriju

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

Metode sortiranja na tekućoj poziciji se dijele na :

Sortiranja putem umetanja (insertion)

Sortiranja putem podjele (selection)

Sortiranja putem zamjene (exchange)

Napomena. U narednom izlaganju se koristi relativno indeksiranje nizova koje sastoji


u tome da prvi µclan niza ima indeks 0 a da svi ostali imaju indeks koji odgovara broju
pozicija nakon tog elementa. U takvoj notaciji je a4 je peti element niza jer je 4 pozicije u
odnosu na a0 . Iz tog razloga je vaµzno razumjeti da npr. Duzina [a] 1 oznaµcava, ustvari,
indeks posljednjeg a ne pretposljednjeg µclana niza.

U apsolutnom indeksiranju µclanovi niza imaju indeks koji odgovara njihovoj stvarnoj pozi-
ciji (a1 ; a2 ; :::; an ; :::). Pomoću jednostavne transformacije je moguće pretvoriti jednu no-
taciju u drugu.

8.2.1 Sortiranje putem umetanja (Insertion sort)


Algoritam sortiranja umetanjem (Insertion sort) se temelji na me†usobnom upore†ivanju
vrijednosti kljuµceva pri µcemu se u svakoj iteraciji odrµzavaju sortirani i nesortirani dio niza.
U svakom sljedećem koraku se iz nesortiranog dijela uzima jedan element i taj element se
umeće na odgovarajuće mjesto u sortiranom dijelu. Prema tome, svakim novim korakom
nesortirani dio niza se smanjuje, dok se sortirani dio niza postepeno povećava.

Insertion sort će biti objašnjen na primjeru sortiranja niza A = fa0 ; a1 ; :::; an 1 g u ras-
tućem poretku. Na poµcetku algoritma sortirani dio se sastoji samo od prvog elementa a0
dok svi ostali elementi µcine nesortirani dio niza. U prvom koraku se porede elementi a1 i
a0 (drugi i prvi element u nizu). Ako je element a0 veći od elementa a1 tada se element a1
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 lokacije
priv. U ovom trenutku sortirani dio niza sadrµzi dva elementa (a0 i a1 ) a nesortirani dio
sadrµzi n 2 elemenata (a2 , a3 ,...an 1 ).

Pretpostavimo da je algoritam došao do nekog i-tog koraka. Poslije prethodnog (i 1)-


og koraka u sortiranom dijelu se nalaze elementi a0 , a1 ,..., ai 1 . U i-tom koraku se iz
nesortiranog dijela uzima element ai nakon µcega se prema kraju niza pomjeraju svi ele-
menti iz sortiranog dijela niza koji su veći od elementa ai da bi se oslobodio prostor za
pohranjivanje tog elementa na odgovarajuće mjesto u nizu. Na taj naµcin se veliµcina sorti-
ranog dijela niza povećava sa i 1 na i. Sortiranje se završava kada u nesortiranom dijelu
niza nema više elemenata odnosno kada zadnji element an 1 zauzme svoju odgovarajuću
poziciju. Algoritam je ilustrovan na primjeru u sljedećoj tabeli.

Algoritmi i programiranje, V.2 80 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

0 1 2 3 4 5 priv 0 1 2 3 4 5 priv 0 1 2 3 4 5 priv


4 11 2 9 3 10 2 4 11 3 10 9 2 4 9 11 10 3
4 11 2 9 3 10 2 4 11 3 10 9 2 3 4 9 11 10
4 11 9 3 10 2 2 4 9 11 3 10 9 2 3 4 9 11 10
4 11 9 3 10 2 2 4 9 11 3 10 2 3 4 9 11 10
4 11 9 3 10 2 2 4 9 11 10 3 2 3 4 9 11 10
2 4 11 9 3 10 2 4 9 11 10 3 2 3 4 9 10 11
2 4 11 9 3 10 2 4 9 11 10 3

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

Algoritam 8.1 Insertion sort, direktni metod, relativno indeksiranje


Ulaz : n; fan g
// Poµcetak od prve pozicije
i 1
Za(i = 1 do Duzina [a] 1 korak 1)
{
// Element ide na rezervnu lokaciju
priv a [i]
// Umetanje elementa a [i] u sortirani niz a [1; ::; j 1]
j i 1
DokVrijedi(j 0 & a [j] > priv)
{ a [j + 1] a [j] // Element se stavi jednu poziciju desno
j j 1 // Pomjeramo se za jedno mjesto ulijevo
}
a [j + 1] priv // Element sa privremene lokacije se smješta na svoje
mjesto
j j+1
}
Izlaz : Sortirani niz fan g

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

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 ponavljajućeg procesa sa dva uslova završetka dozvoljava korištenje
graniµcnika (sentinel). U ovom sluµcaju to moµze biti element a0 (što znaµci da je dovoljno
raspon indeksa proširiti indeksom 0). Analiza sloµzenosti ove metode je data dijelom na
sljedećoj tabeli.

Algoritmi i programiranje, V.2 81 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

Korak Dinamika
0 1 i 1
1 Za(i = 1 do Duzina [a] 1 korak 1) { n 1+1
2 priv a [i] n 1
3 j i 1 n 1
4 DokVrijedi (j 0 & a [j] > priv) {
5 a [j + 1] a [j]
6 j j 1}
7 a [i + 1] priv n 1
8 j j+1 n 1
0 }

Najbolji sluµcaj se pojavljuje u situaciji kada je niz već sortiran pa je za pozicioni-


ranje svakog elementa potrebna samo jedna operacija pore†enja. Tom operacijom se
zapravo samo utvr†uje da je prethodnik svakog elementa manji od tog elementa, te
svi elementi ostaju na svojim mjestima. To znaµci da je u najboljem sluµcaju ukupan
broj operacija pore†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 nesortiranog


dijela 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µcetak
sortiranog dijela niza. To se doga†a kada je niz sortiran u obrnutom poretku. Tada je
ukupni broj operacija pore†enja Tc (n) :

X
n
n (n 1)
Tc (n) = i=
i=1
2

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

Analiza ove metode putem broja pore†enja i premještanja pokazuje da broj pore†enja
kljuµ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. Broj
premještanja Mi je jednak Ci + 2 (ukljuµcujući barijeru, sentinel). Na sljedećoj tabeli su
procjene brzine ovog algoritma.

C M
min n 1 3 (n 1)
n2 + n 4 n2 + 9n 10
prosjek
4 4
n2 + n 2 n2 + 3n 4
max
4 4
Minimalne ocjene se mogu desiti kod već sortiranih nizova a najgore kada je niz sortiran
opadajućim redoslijedom.

Poboljšanja. Kod ovog algoritma se obavlja pretraµzivanje sortiranog dijela niza da bi


se odredila pozicija umetanja prvog elementa iz nesortiranog dijela niza. Poboljšanje

Algoritmi i programiranje, V.2 82 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

e…kasnosti postupkom da se pozicija umetanja pronalazi binarnim umjesto sekvencijal-


nim pretraµzivanjem temelji se na svojstvu da je prvi dio niza sortiran, kao što je to
sluµcaj u osnovnoj varijanti algoritma. U toj poboljšanoj varijanti prosjeµcan broj op-
eracija pore†enja u svakoj iteraciji se smanjuje sa i=2 na pribliµzno 1 + log2 i. To znaµci
da je u poboljšanoj varijanti vremenska sloµzenost za operacije pore†enja reda O(n log n)
što je znatno poboljšanje, ali samo za te operacije. Me†utim, e…kasnim pronalaµzenjem
mjesta umetanja ne smanjuje se i broj potrebnih operacija premještanja koji zapravo
ostaje isti kao i u osnovnoj varijanti. Taj broj operacija je dominantan u odnosu na broj
operacija u pore†enju za velike vrijednosti n pa ukupna vremenska sloµzenost algoritma
ostaje O(n2 ). Pseudo kod za ovu varijantu algoritma sortiranja je u nastavku.

Algoritam 8.2 Binary insertion sort, relativno indeksiranje


Ulaz : n; fan g
Za(i = 1; Duzina [a] 1; 1)
{
//Uzeti element niza
x a [i]
L 1; R 1
// Odrediti lijeve i desne granice
DokVrijedi(L < R)
{
m = b(L + R) =2c
AkoJe(a [m] < x)
{ L m+1 }
Inaµce
{ R m }
}
//Pretraµziti sortirani niz
Za(j = i; R + 1; 1)
{ a [j] a [j 1] }
a [R] x
}
Izlaz : Sortirani niz fan g

8.2.2 Shell sort


U osnovnoj varijanti algoritma sortiranja umetanjem elementi se pomjeraju za samo
jednu poziciju, što za posljedicu ima veliki broj premještanja. E…kasnost algoritma se
moµze poboljšati na naµcin da se porede elementi koji su odvojeni nekim brojem pozicija
pa da se umetanje elemenata obavlja tako da se prave premještanja elemenata koji su
razdvojeni sa više od jednog mjesta razmaka. Neka je, na primjer, u nizu element koji ima
neku malu vrijednost koja se prije sortiranja nalazi pri kraju niza i da niz treba sortirati
niz u rastućem poretku. Koristeći osnovnu varijantu algoritma sortiranja umetanjem
bio bi potreban veliki broj operacija pore†enja i premještanja dok taj element ne bi bio
umetnut na odgovarajuću poziciju. E…kasnost se moµze poboljšati tako da se elementi prvo
pomjeraju prema konaµcnoj poziciji koristeći velike skokove, tako da bi se, na primjer,
element koji ima malu vrijednost pomjerio prema konaµcnoj poziciji uz samo nekoliko
operacija pore†enja i premještanja. Poboljšanje koje se temelji na prethodno opisanoj
strategiji je predloµzio Donald Shell, po kojem je algoritam nazvan Shell sort.

Algoritmi i programiranje, V.2 83 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

Prethodno je reµceno da je osnovna varijanta algoritma umetanjem e…kasna ako ulazni


niz već ima visok stepen ure†enosti. Algoritam Shell sort razdvaja poµcetni niz na grupe
tako što se u svakoj grupi nalaze elementi koji su odvojeni jednakim razmakom, koji će
biti oznaµcen sa h1 . Zatim se svaka grupa sortira posebno primjenom osnovne varijante
sortiranja umetanjem, nakon µcega se dobija niz sa većim stepenom ure†enosti u odnosu
na poµcetni niz. U sljedećem koraku se uzima razmak h2 koji je manji od razmaka h1 . U
ovom koraku je smanjen broj grupa, ali svaka grupa ima veći broj elemenata. Grupe se
ponovo posebno sortiraju primjenom osnovne varijante algoritma sortiranja umetanjem
pa se dobija još veći stepen ure†enosti ulaznog niza. U sljedećim koracima se biraju
sve 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. Drugim
rijeµcima, u zadnjem koraku, kada je ulazni niz „već gotovo sortiran“, primjenjuje se
osnovna varijanta metoda umetanjem. U opisanim fazama algoritma sortiranja Shell sort
koristi niz razmaka h = [h1 ; h2 ; :::; ht 1 ] pri µcemu je hi > hi+1 , i = 1; :::; t 2.

Za razumljiviji opis ovog algoritma će biti korišten konkretan primjer. Neka je zadatak
sortirati sljedeći niz brojeva:

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

Pošto Shell sort poredi brojeve iz niza uzimajući neki razmak, neka je u prvoj fazi taj
razmak 7 tj. h1 = 7. To znaµci da će se porediti i me†usobno eventualno razmjenjivati
mjesta sljedeći brojevi: 28, 33 i 59 (jer su razmaknuti za 7 mjesta). Isto tako, porediće
se i eventualno me†usobno razmjenjivati mjesta brojevi 17, 12 i 49 (jer su tako†er raz-
maknuti za 7 mjesta). Da bi proces bio jasnije objašnjen, moµze se koristiti drugaµciji
naµcin prikaza. Naime, ako je odabran razmak 7 onda se gornji poµcetni niz brojeva moµze
prikazati sljedećom tabelom koja ima 7 kolona, pri µcemu svaka kolona sadrµzi elemente
pojedine grupe koji se posebno sortiraju:

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

Ovakav prikaz je napravljen samo u cilju vizueliziranja procesa pore†enja i sortiranja


pojedinih grupa, koji se obavljaju u pojedinim fazama primjene algoritma Shell sort.
Sada se sortira svaka kolona (grupa) posebno. Rezultirajuća tabela je:

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

Ova tabela se sada moµze prikazati u obliku jednodimenzionalnog niza, što zapravo i
odgovara 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 rezultirajući niz u trenutnoj fazi sortiranja, kada je uzet razmak 7,
ima veći stepen ure†enosti od poµcetnog niza. Vidljivo je pomjeranje elemenata sa većim
vrijednostima 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.

Algoritmi i programiranje, V.2 84 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

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 elemenata
koji se tretiraju kao posebne grupe moµze prikazati u obliku sljedeće tabele sa 3 kolone
(lijeva tabela) :
28 12 5 9 12 5
9 13 29 10 13 17
15 33 17 15 23 29
10 54 36 ) 28 33 36
67 23 59 49 54 59
49 64 79 67 64 79
80 86 80 86
Opet se grupe (kolone) sortiraju primjenom osnovne varijante sortiranja umetanjem te
se dobija se tabela desno koja zapravo prikazuje sljedeći niz:

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

Rezultujući niz ima veći stepen ure†enosti u odnosu na niz u prethodnoj fazi. Naime,
došlo je do daljnjeg pomjeranja većih brojeva prema kraju niza i manjih brojeva prema
poµcetku niza. Rezultujući niz ipak jošnije sortiran, te je ostalo da se napravi jošjedna faza
nakon µcega će niz biti konaµcno sortiran. Pošto je trenutni niz „skoro sortiran”, razumno je
zapravo uzeti razmak h3 = 1 a to znaµci primijeniti osnovnu varijantu algoritma sortiranja
umetanjem, jer će biti potreban mali broj pore†enja i premještanja s obzirom da je niz već
„skoro sortiran”. Dakle, primjenom algoritma sortiranja umetanjem s razmakom h3 = 1,
dobija se rezultirajući sortirani niz:

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 na
svakom koraku. U našem primjeru je H = f7; 3; 1g.

Algoritam 8.3 Shell sort, relativno indeksiranje


// Ulaz : Niz fag, fHg
// Niz fHg je niz koraka za koje se obavlja sortiranje
Za(i = 0 do Duzina [h] 1)
{ h H [i]
Za(j h do Duzina [a] 1)
{ priv a [j]
k j h
SveDokJe((k 0) ^ (a [k] > priv))
{ a [k + h] a [k]
k k h }
a [k + h] priv
}
}

Analiza ShellSort algoritma je postavila nekoliko veoma teških matematiµckih problema


od kojih neki jošnisu riješeni. Kao najbitnije, nije pokazano koja rastojanja daju najbolji
rezultat. Postoji zaµcu†ujuća µcinjenica : rastojanja ne smiju biti me†usobni mnoµzitelji.

Algoritmi i programiranje, V.2 85 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

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 moguće.

Do sortiranog niza će dovesti primjena bilo kojeg niza razmaka H = fh0 ; h1 ; :::; ht 1 g
takvih 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 je
ova vrijednost bitno bolja od n2 to ne znaµci da se ne mogu praviti nova poboljšanja.

Pitanje : da li se i u kom dijelu ovaj algoritam mijenja ako se za niz fHg uzmu brojevi
Fibonaµcijevog niza ?

8.2.3 Sortiranje putem direktne podjele (Selection sort)


Jedan od nedostataka algoritma Insertion sort je to što zahtijeva veliki broj operacija
pomjeranja unutar sekvence. Primjer jednostavnog algoritma sortiranja, oblikovan tako
da se bitno smanjuje broj premještanja, je Selection sort (sortiranje selekcijom). Kod ovog
algoritma pomjeranje podataka pri sortiranju obavlja se direktno na njihovu konaµcnu
poziciju u sortiranom nizu.

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

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

pripadaju nesortiranom dijelu, a zatim se sekvencijalnim pretraµzivanjem nalazi najmanji


element, koji se premješta na prvu poziciju, dok se prethodni element s prve pozicije
premješta na poziciju prona†enog minimalnog elementa. Na taj naµcin, u prvom koraku
je oblikovan sortirani dio niza, koji µcini element a0 dok ostali elementi fa1 ; a2 ; :::; an 1 g
µcine nesortirani dio. Poslije nekog (i 1)-og koraka u sortiranom dijelu su elementi
a0 ; a1 ; :::; ai 2 dok su u nesortiranom dijelu elementi ai 1 ; ai ; :::; an 1 . U sljedećem, i-tom
koraku, u nesortiranom dijelu se pronalazi najmanji element pa se taj element pozicionira
na prvo mjesto u neure†enom dijelu a to je pozicija i 1. U tom trenutku sortirani dio je
a0 ; a1 ; :::; ai 1 a nesortirani dio je ai ; ai+1 ; :::; an 1 . Postupak sortiranja se završava kada
u nesortiranom dijelu na poziciji 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 nad


elementima nesortiranog dijela niza, za razliku od sortiranja umetanjem, kod kojeg se
usporedba elemenata obavlja nad elementima sortiranog dijela niza. Ova razlika ima za
posljedicu da postupak sortiranja selekcijom ne moµze zapoµceti sve dok nisu prisutni svi
elementi koji se trebaju sortirati, što nije sluµcaj kod sortiranja umetanjem, kod kojeg
elementi koji se sortiraju mogu pristizati jedan za drugim.

Algoritmi i programiranje, V.2 86 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

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

0 1 2 3 4 5 0 1 2 3 4 5
4 11 2 9 3 10 2 3 4 9 11 10
2 11 4 9 3 10 2 3 4 9 11 10
2 11 4 9 3 10 2 3 4 9 11 10
2 3 4 9 11 10 2 3 4 9 11 10
2 3 4 9 11 10 2 3 4 9 10 11

Naglašena je pozicija za koju se u procesu sortiranja u pojedinim fazama selekcionira


minimalni element iz nesortiranog dijela, dok je podvuµcena pozicija na kojoj je prona†en
minimalni element u nesortiranom dijelu. U prvom koraku je oznaµcena pozicija sa indek-
som 0 na kojoj je element 4 te je prona†en minimalni element 2 na poziciji s indeksom
2. U sljedećem koraku elementi 4 i 2 mijenjaju pozicije te se u nizu razlikuju sortirani
dio niza koji se sastoji samo od elementa 2 i nesortirani dio niza koji ukljuµcuje sve ostale
elemente. U sljedećem koraku je oznaµcena pozicija s indeksom 1 na kojoj se nalazi ele-
ment 11 i prona†en je minimalni element 3 u nesortiranom dijelu niza, pa elementi 11 i 3
mijenjaju pozicije u nizu. U tom trenutku sortirani dio niza µcine elementi 2 i 3 a elementi
4, 9, 11 i 10 µcine nesortirani dio.

Postupak se ponavlja za ostale pozicije i (i = 2; ; n 2), sve dok se na pretposljednje


mjesto u nizu ne umetne element 10. Zadnji preostali element 11 zauzima jedinu moguću
(zadnju) poziciju, pa se postupak završava selekcijom elementa za poziciju i = n 2.

Algoritam 8.4 Selection sort, relativno indeksiranje


Za(i 0 do Duzina [a] 2)
{ najm a [i]
pnajm i
Za( j i + 1 do Duzina [a] 1)
{
AkoJe((a [j] < najm))
{ najm a [j]
pnajm j }
}
a [pnajm ] a [i]
a [i] najm
}

Selction sort algoritam je opisan na priloµzenom algoritmu. Ulazni argument u proceduru


je niz a koji se sortira. Vanjska for petlja omogućuje ponavljanje postupka pronalaµzenja
minimalnog elementa u nesortiranom dijelu za svaku od lokacija i = 0; 1; 2; :::; Duzina [a]
2. Za zadnju lokaciju Duzina[a] 1 nije potrebno ponavljati postupak, jer se u tom sluµcaju
nesortirani dio niza sastoji samo od jednog elementa, pa je taj podniz sortiran sam po
sebi. U svakoj i-toj iteraciji se prvo inicijaliziraju vrijednosti privremeno minimalnog
elementa najm i indeksa njegove pozicije pnajm a zatim se u sklopu unutarnje for petlje
izvode iteracije kojima se u nekom j-tom prolazu u nesortiranom dijelu niza a, kojeg µcine
elementi na pozicijama i do Duzina[a] 1, pronalazi minimalni element. Na kraju svake
i-te iteracije vanjske for petlje element na poziciji pnajm i prvi element a[i] iz nesortiranog
dijela niza izmjenjuju svoje pozicije.

Algoritmi i programiranje, V.2 87 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

Algoritam sortiranja selekcijom je speci…µcan po tome što je i broj pridruµzivanja i broj


pore†enja uvijek isti, bez obzira na duµzinu niza. Algoritam se izvršava u n 1 prolaza kroz
nesortirani dio niza, a svaki prolaz ima jednu zamjenu pozicija koja ukljuµcuje 3 operacije
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 pitanju
operacije pridruµzivanja. U prvom prolazu ima n 1 operacija pore†enja, u drugom
prolazu ih ima n 2 a u nekom i-tom prolazu broj pore†enja je n i. Dakle, ukupan
broj pore†enja je:
X
n 1
n (n 1)
Tc (n) = (n i) =
i=1
2
Broj zamjena je minimalno Mmin = 3 (n 1) u sluµcaju da su kljuµcevi odmah sortirani
a maksimalno Mmax = (n2 =4) + 3 (n 1) ako su poµcetni kljuµcevi poredani opadajućim
redom.

Za proraµcun prosjeµcnog vremena trajanja uzima se da je oµcekivani broj premještanja


jednak sumi Hn = 1 + 1=1 + 1=2 + ::: + 1=n. Pri tome su 1=i vjerovatnoće da je i-ti
element manji od prethodnih i 1 elemenata. Ova vrijednost se moµze iskazati i sa:

Hn = ln n + g + 1=2n 1=12n2 + :::

gdje je g = 0; 577216::: Eulerova konstanta. Za dovoljno veliko n se mogu zanemariti


razlomci 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:
X
n
Mavg = n (g + 1) + ln i
i=1

Ova se suma aproksimira integralom:


Zn
ln xdx = x (ln x 1)jn1 = n (ln n 1) n+1
1

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

8.2.4 Sortiranje putem zamjene (Bubble sort)


Ovaj algoritam se zasniva na pore†enju i zamjeni mjesta parova susjednih elemenata i
obavljanja 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 niza
premješta na lijevi kraj niza. Ako se nizovi posmatraju vertikalno a ne horizontalno ele-
mente je moguće interpretirati kao mjehure, pri µcemu "teµzina" svakog elementa odgovara
njegovom kljuµcu. Na taj naµcin se svaki element poput mjehura podiµze do pozicije koja
mu pripada. Ovaj metod je stoga poznat pod nazivom BubbleSort.

Bubble sort je jedan od najjednostavnijih algoritama sortiranja. Ovaj algoritam radi tako
da više puta sekvencijalno prolazi kroz niz, pri µcemu se pri svakom prolazu upore†uje svaki

Algoritmi i programiranje, V.2 88 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

element sa elementom koji se nalazi neposredno iza njega. Ako se nakon pore†enja utvrdi
da susjedni elementi nisu u µzeljenom poretku, onda elementi me†usobno izmjenjuju svoje
pozicije, što ima za posljedicu da se prema kraju niza postepeno pomjeraju elementi sa
većim vrijednostima ako je µzeljeni poredak sortiranja rastući, ili da se prema kraju niza
postepeno pomjeraju elementi sa manjim vrijednostima ako je µzeljeni poredak sortiranja
opadajući.

U prvom prolazu kroz niz na zadnjem mjestu će se pozicionirati najveći (najmanji) el-
ement, pa sortirani dio µcini element a [n 1], a nesortirani dio µcine a [k], k = 0; ; n 2.
U drugom prolazu, porede se elementi na pozicijama 0 do n 2, te će se nakon tog pro-
laza na poziciju s indeksom n 2 sigurno pozicionirati najveći element iz nesortiranog
dijela. Općenito, prije nekog i-tog prolaza, za i > 1, sortirani dio µcine elementi a [k],
k = n i + 1; ; n 1 a nesortirani dio elementi a[k], k = 0; ; n i. U nekom i-tom
prolazu pore†enja i izmjene pozicija susjednih elemenata, na (n i)-tu poziciju će doći
najveći element iz nesortiranog dijela. Sekvencijalni prolazi se nastavljaju do (n 1)-og
prolaza odnosno dok se na drugu poziciju u nizu s indeksom 1 ne pozicionira odgovarajući
element. Naime, n-ti prolaz kroz niz nije ni potreban jer je ostao samo jedan element i
samo jedna dostupna pozicija s indeksom 0, pa je praktiµcno niz nakon (n 1)-og prolaza
već 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 dio
niza, pri µcemu svaki prolaz osigurava smještanje najvećeg elementa iz nesortiranog dijela
na zadnju poziciju tog dijela niza. Ta pozicija je na slici za svaki prolaz istaknuta linijom
s 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 su
oznaµcene prva pozicija sa indeksom 0 na kojoj se nalazi element 10 i druga pozicija sa
indeksom 1 na kojoj se nalazi element 11. Pošto su elementi 10 i 11 u µzeljenom poretku,
ne dolazi do zamjene njihovih pozicija. U sljedećem koraku se porede elementi 11 i 3.
Budući da se ovi elementi ne nalaze u µzeljenom poretku, dolazi do zamjene njihovih
pozicija. Prvi prolaz kroz niz se nastavlja sve dok promjenljiva j ne dostigne vrijednost
j = 5. Nakon prvog prolaza će se najveći element 11 nalaziti na svojoj konaµcnoj poziciji s
indeksom i = 5. U ovom trenutku sortirani dio niza µcini jedino element 11 dok svi ostali
elementi predstavljaju nesortirani dio niza.

U drugom prolazu kroz niz (i = 4) na poziciju s indeksom 4 će se pozicionirati najveći


element iz nesortiranog dijela niza a to je element 10. Nakon drugog prolaza sortirani
dio niza µcine elementi 10 i 11, a nesortirani dio niza µcine elementi 3, 4, 9 i 2. Opisani
postupak se ponavlja za sve ostale vrijednosti promjenljive i (i = 3; 2; 1), sve dok se na
drugo mjesto u nizu ne umetne element 3. Jedini preostali element u nesortiranom dijelu
niza je element 2, koji na kraju zauzima jedinu slobodnu poziciju s indeksom 0. Svi koraci
algoritma Bubble sort za ovaj primjer su tako†er ilustrirani na sljedećoj tabeli.
0 10 10 10 10 10 10 10 3 3 3 3 3 3 3 3 3 2
1 11 11 3 3 3 3 3 10 4 4 4 4 4 4 4 2 3
2 3 3 11 4 4 4 4 4 10 9 9 9 9 2 2 4 4
3 4 4 4 11 9 9 9 9 9 10 2 2 2 9 9 9 9
4 9 9 9 9 11 2 2 2 2 2 10 10 10 10 10 10 10
5 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

Algoritmi i programiranje, V.2 89 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

Ovaj algoritam je prikazan u obliku procedure u nastavku. Ulaz u proceduru je niz a koji
se sortira. Vanjskom for petljom se implementira Duzina[a] 1 prolaza kroz nesortirani
dio niza, µcime se osigurava smještanje najvećeg elementa na zadnju poziciju tog dijela
niza. Unutarnjom for petljom se implementira jedan prolaz u kojem se nakon pore†enja
susjednih elemenata i utvr†ivanja da nisu u µzeljenom poretku izmjenjuju njihove pozicije.

Algoritam 8.5 Bubble sort, V.1


Za(i Duzina [a] 1 do 1)
{
Za(j 1 do i)
{
AkoJe(a [j 1] > a [j])
{ a [j 1] $ a [j] }
}
}

Pretpostavimo da je ulazni niz a već sortiran. U toj situaciji će broj potrebnih operacija
ostati opet isti, bez obzira na poµcetnu ure†enost niza. Me†utim, da bi se u odre†enoj
mjeri povećala e…kasnost, moguće je oblikovati takvu varijantu algoritma Bubble sort
koja će detektirati prolaz kroz niz u kojem nije došlo ni do jedne zamjene pozicija, što
je zapravo znak da je niz već sortiran. Nakon takve detekcije proces sortiranja se moµze
prekinuti da bi se izbjegle nepotrebne operacije pore†enja. Postoji mogućnost da je samo
jedan dio niza već sortiran pa se e…kasnost moµze povećati i tako što će se identi…cirati
taj dio niza kojeg u sljedećoj iteraciji neće biti potrebno prolaziti. Detekciju prolaza kroz
niz u kojem nije došlo ni do jedne zamjene pozicija, a isto tako i identi…ciranje dijela
niza koji je već sortiran, moµze se napraviti tako da se u svakom prolazu kroz niz zapamti
pozicija sa najvećim indeksom j na kojoj je izvršena zamjena. Neka se, na primjer, sortira
niz koji ima n = 9 elemenata, te da je nakon trećeg prolaza raspored elemenata kao na
sljedećoj tabeli.

0 1 2 3 4 5 6 7 8
i = 5; j = 1; p = 1 27 24 17 28 31 33 35 38 43 a
i = 5; j = 2; p = 2 24 27 17 28 31 33 35 38 43 b
i = 5; j = 3; p = 2 24 17 27 28 31 33 35 38 43 c
i = 5; j = 4; p = 2 24 17 27 28 31 33 35 38 43 d
i = 5; j = 5; p = 2 24 17 27 28 31 33 35 38 43 e

U µcetvrtom prolazu promjenljiva i ima vrijednost 5 dok se vrijednost promjenljive j


mijenja od 1 do 5. U ovom µcetvrtom prolazu zadnja izmjena je izvršena kada je vrijednost
promjenljive j bila 2 što zapravo znaµci da su elementi na pozicijama s indeksom 2, 3, 4
i 5 već u pravilnom poretku. Pozicija zadnje zamjene je zapamćena u promjenljivoj
p. Nadalje, to znaµci da u sljedećem prolazu neće biti potrebno porediti elemente koji
se nalaze na pozicijama s indeksom većim ili jednakim od p = 2 pa se zapravo nakon
µcetvrtog prolaza na svojim konaµcnim pozicijama ne nalaze samo 4 već 7 elemenata. Ako
je nakon nekog od prolaza kroz niz vrijednost promjenljive p = 0, to je znak da je µcitav
preostali dio niza zapravo već sortiran, pa se proces sortiranja moµze prekinuti.

Prethodno opisana mogućnost poboljšanja je data u narednom algoritmu. Promjenljiva


p se koristi da se zapamti pozicija iza koje u nekom prolazu kroz niz nije bilo izmjene

Algoritmi i programiranje, V.2 90 A.G. 2018/2019, Radni materijal


8.2 Sortiranje nizova - osnovne metode 8 SORTIRANJA

pozicija. Prolazi se izvode u sklopu repeat-until petlje, te pri svakom novom prolazu
se vrijednost promjenljive p postavlja na nulu. Ako se dogodi da u nekom prolazu već
postoji sortiran poredak elemenata tada će i na kraju prolaza biti p = 0 pa će algoritam
završiti svoj rad. Unutarnjom for petljom ostvaruje se jedan prolaz kroz nesortirani dio
niza ali samo do pozicije i = p 1 jer na pozicijama iznad p nije bilo izmjena, pa je taj
dio niza već sortiran.

Algoritam 8.6 Bubble sort, modi…kacija


p Duzina [a]
Ponavljati
{ i p 1
p 0
Za(j 1 do i)
{
AkoJe(a [j 1] > a [j])
{ a [j 1] $ a [j]
p p+1 }
}
}
SveDokNije(p = 0)

Treća mogućnost poboljšanja je da se premještanje vrši naizmjeniµcno u oba pravca tako


da 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 sljedećoj tabeli.

L 2 3 3 4 4
R 8 8 7 7 4
Smjer " # " # " # "
44 06 06 06 06 06 06 06
55 44 44 12 12 12 12 12
12 55 12 44 44 18 18 18
42 12 42 42 42 44 44 42
94 42 55 55 55 42 42 44
18 94 18 18 18 55 55 55
06 18 67 67 67 67 67 67
67 67 94 94 94 94 94 94

Pseudokod za ShakerSort algoritam je dat na narednom algoritmu.

Algoritam 8.7 Shake sort


Ulaz : Niz fan g
Izlaz : Sortiran niz fan g
Inicirati j; k; L; R; x
L 2; R n; k n
Ponavljati
{
Za(j = R; L; 1)
{
AkoJe(a [j 1] > a [j])

Algoritmi i programiranje, V.2 91 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

{ x a [j 1] ;
a [j 1] a [j]
a [j] x
k 1 }
}
L k+1
Za(j = L; R; 1)
{
AkoJe(a [j 1] > a [j])
{ x a [j 1] ;
a [j 1] a [j]
a [j] x
k 1 }
}
R k 1
}
SveDokJe(L > R)

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 Shaker Sort-a, je dosta sloµzena. Minimalni broj
pore†enja je Cm = n 1. Knuth smatra dap je prosjeµcan broj prolaza u poboljšanom Bub-
ble Sort algoritmu proporcionalan sa n k1 n a prosjeµcan broj pore†enja proporcionalan
sa (1=2) (n2 n (k2 + ln n)). Predloµzena poboljšanja ne utiµcu na broj premještanja, oni
jedino skraćuju nepotrebna binarna pore†enja. Naµzalost, zamjena dva elementa je mnogo
µcešća operacija tako da se ne dobiju oµcekivana poboljšanja. Pokazuje se da je Bubble Sort
po karakteristikama negdje izme†u sortiranja umetanjem i sortiranja zamjenom. Faktiµcki,
Bubble Sort ne donosi ništa novo osim privlaµcnog naziva. Shaker Sort se uspješno koristi
u sluµcajevima kada je niz dosta sortiran, što se u praksi dosta rijetko dešava.

Moguće 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 koraku
pomjeraju za jednu poziciju što je razlog da trebaju O (n2 ) takvih prolaza. U skladu sa
tim, poboljšanja se mogu uvesti ako se usvoji princip da se vrši razmjena elemenata na
većem rastojanju.

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

8.3 Poboljšane metode (sloµzenost n log n)


8.3.1 Merge sort
Algoritam Merge sort koristi strategiju „podijeli-pa-vladaj“ kod koje se do rješenja nekog
problema 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 iz

Algoritmi i programiranje, V.2 92 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

sortiranih podnizova na e…kasan naµcin mogu spajanjem tih podnizova dobiti novi sorti-
rani podnizovi. Prije faze spajanja sortiranih podnizova, koja zapravo predstavlja drugu
fazu algoritma, Merge sort u svojoj prvoj fazi dijeli poµcetni nesortirani niz na manje i
manje podnizove. Minimalni niz je niz sa samo jednim elementom, pa je takav niz sam
po sebi već sortiran. Zato algoritam Merge sort dijeli poµcetni nesortirani niz na manje i
manje dijelove, sve dok se ne dobiju nizovi sa samo jednim elementom. Nakon te prve faze
dijeljenja, slijedi druga faza spajanja sortiranih podnizova u kojoj se od manjih sortiranih
podnizova njihovim objedinjavanjem stvaraju sve veći i veći sortirani podnizovi, sve dok
se na kraju ove faze ne kreira cijeli sortirani niz.

Merge sort se moµze realizovati kao rekurzivni algoritam, pri µcemu se na svakom nivou
rekurzije obavljaju sljedeći koraci:

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

rekurzivno sortiranje dobijena dva podniza koristeći Merge sort;

spajanje sortiranih podnizova.

U nastavku je procedura M ergeSort koja predstavlja rekurzivnu implementaciju algo-


ritma.

Algoritam 8.8 Merge sort, rekurzivna de…nicija


M ergeSort(a; l; u)
AkoJe(u > l)
{ p b(l + u 1) =2c
q p+1
M ergeSort (a; l; p)
M ergeSort (a; q; u)
M erge (a; l; p; q; u)
}

Ulazni argument a predstavlja niz koji se treba sortirati. Argument l oznaµcava indeks
prve pozicije a argument u oznaµcava indeks zadnje pozicije podniza a [l::u] koji se sortira.
Postupak sortiranja se ostvaruje tako što se ulazni podniz a [l::u] dijeli na dva podniza
a zatim se proces nastavlja rekurzivnim pozivima procedure M ergeSort koji kao ulazne
nizove imaju podnizove nastale dijeljenjem. Dijeljenje ulaznog niza na dva podniza se
ostvaruje izraµcunavanjem vrijednosti promjenljivih p i q. Promjenljiva p predstavlja in-
deks zadnje pozicije prvog podniza, a vrijednost promjenljive q oznaµcava prvu poziciju
drugog podniza. Na taj naµcin ulazni niz a [l::u] je podijeljen na podnizove a [l::p] i a [q::u].
U proceduri M ergeSort se nalaze dva rekurzivna poziva ove procedure. Prvim pozivom
M ergeSort (a; l; p) proces se nastavlja nad prvom polovinom podijeljenog niza, dok se
pozivom M ergeSort (a; q; u) proces nastavlja nad drugom polovinom podijeljenog niza.
Nesortirani niz se rekurzivno dijeli na podnizove, sve dok se ne dobiju podnizovi koji
sadrµze samo jedan element, tj. dok vrijedi u > l. Nakon povratka iz obje ove proce-
dure na svakom nivou rekurzije se pozivom procedure M erge obavlja spajanje sortiranih
podnizova. Taj postupak, opisan procedurom M erge, je dat kasnije. Na primjer, nakon
povratka iz obje procedure M ergeSort na zadnjem nivou rekurzije, kada podnizovi nastali
dijeljenjem imaju veliµcine 1 poziva se procedura M erge za spajanje tih podnizova da bi

Algoritmi i programiranje, V.2 93 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

se kreirao niz veliµcine 2. Na sljedećem, višem nivou, su dva sortirana niza veliµcine 2 koji
će se spojiti u sortirani podniz veliµcine 4. Ovaj proces se nastavlja sve dok se ne do†e do
prvog poziva, koji spaja dva sortirana podniza koji sadrµze po pola elemenata poµcetnog
nesortiranog niza.

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-
jući podnizovi ne sadrµze samo jedan element. Nakon toga se prelazi u drugu fazu, u kojoj
nakon završavanja rekurzivnih poziva procedure M ergeSort na svakom nivou rekurzije
imamo procese spajanja podnizova. Kretanjem prema prvom rekurzivnom pozivu pod-
nizovi se spajaju, te se oblikuju sve veći i veći sortirani podnizovi.

Kljuµcni koraci u algoritmu Merge sort su koraci spajanja dva sortirana podniza. Neka su
nizovi b [0::5] i b [6::12] sortirani, naprimjer, u rastućem poretku. Da bi ta dva sortirana
podniza bila spojena u jedan sortirani niz a prvo treba odrediti najmanji element iz oba
podniza. Sigurno je da je najmanji element ili b [0] ili b [6]. Isto tako, najveći element je
ili b [5] ili b [12]. Operacija spajanja poµcinje tako da se u a [0] smjesti manji od elemenata
b [0] ili [6]. Neka je b [0] < b [6] pa je tada a [0] = b [0]. Nisu raspore†eni elementi b [1::5] i
b [6::12]. U a [1] se treba smjestiti manji od elemenata na prvim pozicijama neraspore†enih
dijelova podnizova b [1::5] i b [6::12]. Dakle, u a [1] se treba smjestiti manji od elemenata:
b [1] ili b [6]. Neka je manji element b [1] pa je a [1] = b [1]. Sada su neraspore†eni elementi
b [2::5] i b [6::12].

Algoritam 8.9 Merge procedura


M erge (a; l; p; q; u)
i 0
j q l
k l
Za((m 0) do u l)
{ b [m] a [l + m] }

Algoritmi i programiranje, V.2 94 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

SveDokJe(i p l ^ j u l)
{
AkoJe(b [i] < b [j])
{ a [k] b [i]
i i+1 }
Inaµce
{ a [k] [j]
j j+1 }
k k+1
}
SveDokJe(i p 1)
{ a [k] b [i]
k k+1
i i+1 }
SveDokJe(j u l)
{ a [k] b [j]
k k+1
j j+1 }

Moµze se zakljuµciti da za formiranje sortiranog niza a treba mehanizam koji će omogućiti
oznaµcavanje raspore†enih i neraspore†enih elemenata iz podnizova b [0::5] i b [6::12]. Ovaj
mehanizam praćenja se realizuje uvo†enjem dva indeksa za spomenute podnizove, koji
će oznaµcavati poziciju u oba podniza na kojoj se trenutno nalaze kandidati za minimalni
element od preostalih neraspore†enih elemenata. Neka je i indeks za praćenje podniza
b [0::5] a j indeks za praćenje 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 koraku
sadrµzavao minimalni element se povećava za 1. Dakle, preostali neraspore†eni elementi u
podnizu b [0::5] će biti elementi b [i::5] a u podnizu b [6::12] će biti neraspore†eni elementi
b [j::5]. U jednom trenutku će se rasporediti svi elementi iz jednog od podnizova pa će se
preostali elementi iz podniza u kojem je ostalo jošneraspore†enih elemenata jednostavno
nadovezati na spojeni niz. Postupak spajanja je opisan procedurom M erge.

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 p i u
oznaµcavaju indekse zadnjih pozicija prvog i drugog podniza, respektivno. Promjenljiva i
u proceduri M erge je promjenljiva pridruµzena prvom podnizu i oznaµcava indeks pozicije
iznad koje su još neraspore†eni elementi iz prvog podniza. Promjenljiva j je pridruµzena
drugom podnizu i oznaµcava indeks pozicije iznad koje su još neraspore†eni elementi iz
drugog podniza. U proceduri M erge se koristi i privremeni niz b u koji se privremeno sm-
ještaju sortirani podnizovi koji se trebaju spojiti. Promjenljiva k oznaµcava indeks pozicije
u rezultirajućem nizu a na koju će se smjestiti trenutno odre†eni minimalni element iz
sortiranih podnizova.

Iz algoritma se vidi da je na prvom nivou rekurzije za oblikovanje konaµcnog sortiranog


niza potrebno još spojiti podnizove b [0::5] i b [6::12]. Algoritam spajanja M erge će biti

Algoritmi i programiranje, V.2 95 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

ilustrovan za sluµcaj spajanja na prvom nivou rekurzije, na sljedećoj tabeli.

0 1 2 3 4 5 6 7 8 9 10 11 12
Niz B 4 11 16 18 20 25 5 7 10 14 28 32 35 a
i = 0; j = 6; k = 0 4 b
i = 1; j = 7; k = 1 4 5 c
i = 1; j = 7; k = 2 4 5 7 d
i = 1; j = 8; k = 3 4 5 7 10 e
i = 1; j = 9; k = 4 4 5 7 10 11 f
i = 2; j = 9; k = 5 4 5 7 10 11 14 g
i = 2; j = 10; k = 6 4 5 7 10 11 14 16 h
i = 3; j = 10; k = 7 4 5 7 10 11 14 16 18 i
i = 4; j = 10; k = 8 4 5 7 10 11 14 16 18 20 j
i = 5; j = 10; k = 9 4 5 7 10 11 14 16 18 20 25 k
i = 5; j = 10; k = 10 4 5 7 10 11 14 16 18 20 25 28 l
i = 5; j = 11; k = 11 4 5 7 10 11 14 16 18 20 25 28 32 m
i = 5; j = 12; k = 12 4 5 7 10 11 14 16 18 20 25 28 32 35 n

Promjenljiva i = 0 na poµcetku procesa predstavlja indeks pozicije od koje poµcinje prvi


podniz a promjenljiva j = 6 oznaµcava indeks pozicije od koje poµcinje drugi podniz.
Promjenljiva k oznaµcava poziciju u rezultirajućem nizu a na koju se u nekom od pojedinih
koraka spajanja treba smjestiti manji od elemenata b [i] ili b [j]. Ako je manji element
b [i] tada se u rezultirajući niz a na poziciju k smješta taj element a indeks i povećava.
Tada podniz [i::5] predstavlja trenutno neraspore†ene elemente iz prvog podniza.

Ako se utvrdi da je manji element b [j] tada se u rezultirajući niz a na poziciju k smješta taj
element pa se povećava indeks j. Tada podniz b [j::12] predstavlja trenutno neraspore†ene
elemente iz drugog podniza. Nakon svakog smještanja elementa u rezultirajući niz a,
inkrementira se promjenljiva k. Promjenljive 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
pa se taj element u nizu a smješta na poziciju k = 0, a[0] = 4. Pošto je u ovom koraku
izabran element iz prve polovine, inkrementira se promjenljiva i kao i promjenljiva k,
koja se inkrementira u svakom pojedinom koraku smještanja elemenata u rezultirajući
niz a. U ovom trenutku vrijednosti promjenljivih su: i = 1, j = 6, k = 1. U sljedećem
koraku se izabire manji od elemenata b [1] i b [6]; vidi se da je manji element b [6] = 5 pa
se taj element u nizu a smješta na poziciju k = 1, a [1] = 5 (c). Na tabeli su ilustrovani
i ostali koraci spajanja podnizova. U koraku k svi elementi iz prvog podniza (b[0::5]) su
već raspore†eni u rezultirajući niz a pa je u nastavku algoritamskog procesa potrebno
samo da se preostali elementi (b[10::12]) jednostavno dodaju u rezultirajući niz a (l do
n).

8.3.2 Quick sort


Ovaj sort radi rekurzivno tako da se iz niza najprije selektira "pivot vrijednost". Zatim
se niz dijeli na elemente koji su manji i koji su veći od pivota a zatim se rekurzivno
sortira svaki od dijelova. Za QuickSort se, generalno, smatra da je najbrµzi od algoritama
sortiranja (na modernim mašinama). Jedno od objašnjenja je da unutrašnja petlja poredi
elemente sa jednom vrijednosti pivota koja je pohranjena u registru za brz pristup. Drugi
algoritmi porede dva elementa niza. Ovo se naziva algoritmom lokalnog sortiranja jer ne

Algoritmi i programiranje, V.2 96 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

koristi drugi niz za pohranu. Nije stabilan. Postoji stabilna verzija QuickSort algoritma
ali ona nije lokalna. Ovaj algoritam je (n log n) u oµcekivanom i (n2 ) u najgorem
sluµcaju. Ako je implementiran prikladno, vjerovatnoća da će algoritam trajati asimptotski
duµ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 dijeli
na dva dijela tako što se taj niz reorganizira tako da su svi elementi u prvom donjem
dijelu manji od svih elemenata u drugom gornjem dijelu niza. Ta dva dijela nakon
reorganizacije su nesortirana i razdvojena elementom koji se naziva pivot i koji se nalazi
na nekoj poziciji j. Dakle, donji dio µcine elementi koji imaju vrijednost manju ili jednaku
vrijednosti pivota (a [i] pivot, i = 0; 1; : : : ; j 1) a gornji dio µcine elementi koji imaju
vrijednost veću ili jednaku vrijednosti pivota (a[i] pivot, i = j + 1; j + 2; : : : ; n 1).
Mogući su razliµciti naµcini izbora pivota. Na primjer, pivot se moµze napraviti tako da
se uzme prvi element niza koji se dijeli, mada postoje i e…kasniji naµcini. Idealno, pivot
element bi trebao dijeliti niz na dva podniza sa jednakim brojem elemenata. Zbog naµcina
na koji je ulazni niz reorganiziran moµze se zakljuµciti da je pivot element pozicioniran na
svoju konaµcnu poziciju j te se u daljnjem postupku više neće pomjerati. Nadalje, moµze
se zakljuµciti da se sortiranje moµze nastaviti tako da se isti algoritam rekurzivno primijeni
na dobijena dva dijela ulaznog niza. Rekurzivni postupak se nastavlja sve dok se ne
postigne da rezultirajući dijelovi imaju samo jedan element. Završetkom rekurzivnog
postupka dobiva se sortirani niz.

Kljuµcni dio u algoritmu Quick sort je naµcin reorganizacije niza na dvije particije odvojene
pivotom, bez korištenja dodatnog pomoćnog memorijskog prostora. Taj naµcin je opisan
funkcijom P articija u tabeli. Funkcija P articija vraća indeks pozicije na kojoj je sm-
ješten pivot. Neka se kao pivot koristi prvi element u nizu. U primjeru na tabeli za pivot
se uzima element 42 (oznaµcen tankom donjom crtom). Funkcijom P articija potrebno je
reorganizirati niz tako da se prona†e odgovarajuća pozicija za pivota te da svi elementi
manji od njega budu na pozicijama ispred njega a svi veći elementi da budu na pozicijama
iza njega. Na tabeli p oznaµcava poziciju elemenata koji se trenutno porede sa pivotom.
Kada se prona†e prvi element veći od pivota, tada se za oznaµcavanje pozicija elemenata
koji se trenutno porede sa pivotom koristi oznaka i. Te pozicije su na tabeli istaknute
donjom podebljanom crtom. Poµcevši od drugog elementa u nizu zapoµcinje pronalaµzenje
prvog elementa koji je veći ili jednak pivotu (42) te na poziciji s indeksom 3 pronalazimo
prvi takav element a to je 54. Prona†ena pozicija p = 3 se oznaµcava kao privremeni poµce-
tak druge particije (koja će 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 veći ili jednak piv-
otu, taj element se ostavlja na svojoj poziciji, te se nastavlja proces pore†enja pivota i
elemenata na preostalim pozicijama. Na primjer, na tabeli na poziciji i = 4 je element 49
pa 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 povećava za
1 tako da oznaka p pokazuje na novi poµcetak druge particije. Na primjer, na poziciji s
indeksom 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 vrijednost
indeksa p za poµcetak druge particije se povećava za 1 pa sada ima vrijednost p = 4. Ovaj
proces se nastavlja sve dok se ne do†e do kraja niza. Svi ostali koraci u reorganizaciji
niza s ciljem njegovog particioniranja su tako†er ilustrirani na tabeli.

Algoritmi i programiranje, V.2 97 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

Pri kraju procesa, kada indeks i dostigne vrijednost 9 (i = n 1) pivot se jošuvijek nalazi
na prvoj poziciji. Me†utim, niz je prethodno reorganiziran tako da su svi elementi od
pozicije 1 do pozicije 4 (p 1) manji od pivota, dok su elementi na pozicijama 5 do 9 (p do
n 1) veći 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 particioniranje
niza. Dakle, na kraju opisanog procesa, pivot element 42 se nalazi na poziciji 4. Svi
elementi na pozicijama s indeksima 0 do 3 su manji od pivot elementa 42 dok su svi
elementi na pozicijama 5 do 9 veći od pivot elementa. Inicijalni raspored elemenata
niza je prikazan prvim rasporedom na sljedećoj tabeli (na kojoj je ilustrovan postupak
particije).

0 1 2 3 4 5 6 7 8 9
p=1 42 36 17 54 49 22 63 57 20 46
p=2 42 36 17 54 49 22 63 57 20 46
p=3 42 36 17 54 49 22 63 57 20 46
p = 3; i = 4 42 36 17 54 49 22 63 57 20 46
p = 3; i = 5 42 36 17 54 49 22 63 57 20 46
p = 4; i = 5 42 36 17 22 49 54 63 57 20 46
p = 4; i = 6 42 36 17 22 49 54 63 57 20 46
p = 4; i = 7 42 36 17 22 49 54 63 57 20 46
p = 4; i = 8 42 36 17 22 49 54 63 57 20 46
p = 5; i = 8 42 36 17 22 20 54 63 57 49 46
p = 5; i = 9 42 36 17 22 20 54 63 57 49 46
j = 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 u


donjoj particiji. Na primjer, na tabeli je nakon izmjene poredak elemenata koji pripadaju
donjoj particiji (36; 17; 22; 20) promijenjen u poredak (20; 36; 17; 22). To, naravno, utiµce
na izbor pivota u sljedećim fazama algoritma, s tim da u prosjeµcnom sluµcaju to ne utiµce na
e…kasnost algoritma. Algoritam kojim se na prethodno opisani naµcin moµze particionirati
niz dat je u nastavku.

Algoritam 8.10 Procedura Particija


P articija (a; lijevi; desni)
pivot a [lijevi]
p lijevi + 1
SveDokJe(p desni&a [p] < pivot)
{ p p+1 }
ZaSve((i p + 1) do desni)
{
AkoJe(a [i] < pivot)
{ a [i] $ a [p]
p p+1 }
}
a [lijevi] $ a [p 1]
Vrati : p 1

Nakon opisa postupka particioniranja nizova moguće je opisati rekurzivnu implementaciju.


Algoritam je opisan procedurom QuickSort u nastavku. Pošto na poµcetku µcitav niz

Algoritmi i programiranje, V.2 98 A.G. 2018/2019, Radni materijal


8.3 Poboljšane metode (sloµzenost n log n) 8 SORTIRANJA

predstavlja jednu particiju, algoritam se poziva sa poµcetnim argumentima prvi = 0 i


zadnji = n 1.

Algoritam 8.11 Quick sort


QuickSort (a; prvi; zadnji)
AkoJe(prvi < zadnji)
{ j P articija (a; prvi; zadnji)
QuickSort (a; prvi; j 1)
QuickSort (a; j + 1; zadnji)
}

Mehanizam rada procedure Quick Sort je ilustrovan na slici u nastavku.

20 36 17 22 42 54 63 57 49 46 (a)

20 36 17 22 42 54 63 57 49 46 (b)

17 20 36 22 42 54 63 57 49 46 (c)

17 20 36 22 42 54 63 57 49 46 (d)

17 20 22 36 42 54 63 57 49 46 (e)

17 20 22 36 42 46 49 54 63 57 (f)

17 20 22 36 42 46 49 54 63 57 (g)

17 20 22 36 42 46 49 54 57 63 (h)

Na slici je raspored elemenata u nizu nakon prve particije. Izabrani pivot u pojedinim
fazama je oznaµcen pojaµcno a elementi koji su zauzeli svoje konaµcne pozicije su uokvireni
obiµcnom linijom. Bez linija su elementi koji u pojedinim fazama algoritma µcine podnizove
koji u nastavku ulaze u proces particije. U sljedećem koraku kao pivot se uzima element
20, a proces particije se nastavlja sa podnizom koji µcine elementi koji se nalaze na pozi-
cijama 0 do 3. Rezultat particije je prikazan u liniji (c). Pivot element 20 je zauzeo svoje
konaµcno mjesto na poziciji s indeksom 1, donju particiju µcini samo jedan element (17),
dok gornju particiju µcine dva elementa (36 i 22). Na linijama (d) do (h) su ilustrirane i
ostale faze u radu algoritma.

Algoritmi i programiranje, V.2 99 A.G. 2018/2019, Radni materijal


9 GRAFOVSKI ALGORITMI

9 Grafovski algoritmi
9.1 Uvod
U cilju potpunog razumijevanja grafovskih algoritama potrebno je de…nisati odgovarajuće
pojmove i utvrditi konvencije.

Predmet analize su samo prosti grafovi, koji nemaju petlje u pojedinim µcvorovima
i nemaju ponavljajućih 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 izbjeći
konfuziju

Jedan od prvih problema koji se rješava kada se raµcunarski simuliraju grafovski algoritmi
je predstavljanje odnosno na koji naµcin tu informaciju prenijeti raµcunaru. Postoje tri
naµcina:

Lista µcvorova (edge list) : formira se jednostavna numerisana lista koja u nekim
sluµcajevima moµze biti sortirana

Matrica povezanosti (adjacency matrix) : matrica n n koja se sastoji od 1 i 0 u


zavisnosti od toga da li su dva µcvora povezana (1) ili ne (0). Primjer je:
0 1
0 1 1 1
B1 0 0 0C
A=B @1 0 0 1A
C

1 0 1 0

U ovoj listi vrijedi da je aij = aji što znaµci da je graf neusmjeren. U sluµcaju da je aij 6= aji
radi se o usmjerenom grafu.

Lista povezanosti (adjacency list) : lista od n elemenata u kojoj je svaki element


lista µcvorova koji su povezani sa tim µcvorom. Ako se radi o usmjerenom grafu tada
su elementi liste ure†eni parovi

Ne postoji "najbolja" grafovska prezentacija jer to bitno zavisi od informacija koje se


prezentiraju putem grafa. Prezentacija je diktirana, prije svega, brojem veza a zatim
ostalim elementima.

Ako se svakoj grani dodijeli neka vrijednost govori se o teµzinskom grafu (ponderisani
graf, weighted graph, ...). "Teµzina" je u tom sluµcaju veliµcina koja je od interesa kao
npr. rastojanje, cijena, vjerovatnoća i sliµcno. Namjena ovog teksta nije da se bavi inter-
nom prezentacijom. U tom smislu će za svaki tip problema biti korištena odgovarajuća
notacija.

Algoritmi i programiranje, V.2 100 A.G. 2018/2019, Radni materijal


9.2 Algoritmi pretraµzivanja 9 GRAFOVSKI ALGORITMI

9.2 Algoritmi pretraµzivanja


Problem pretraµzivanja se formuliše na sljedeći 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 najkraća ?

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 da


li se moµze doći do w. Ako se radi na taj naµcin potrebno je µcuvati informaciju o tome koji
µcvorovi su posjećeni 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 se
pretraµzuju µcvorovi kojima se nastavlja zapoµceta putanja (tzv. child µcvorovi) mora se
osigurati da se ne obra†uju ponovo pa se oznaµcavaju kao Sivi. Inicijalno, svi µcvorovi su
oznaµceni Bijelo.

Generiµcki (opšti) algoritam pretraµzivanja je u nastavku.

Algoritam 9.1 Pretraµzivanje grafa


Oznaµciti sve µcvorove bijelo
Odabrati poµcetni µcvor i obojiti ga u Sivo
SveDok( postoji Sivi µcvor )
{
Odaberi µcvor i
Oznaµci Bijele susjede Sivo
Obraditi µcvor i
Oznaµ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. Bilo
koji µ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 mora
biti povezan sa poµcetnim µcvorom. Stoga, putanja od µcvora n do µcvora m postoji ako i
samo ako je w oznaµcen kao Crno na kraju algoritma. U suštini, ovo je naµcin da se na†u
povezane komponente, zasebne cjeline grafa koje nisu povezane ivicama.

Na taj naµcin je prezentiran prvi dio rješenja problema.

Algoritam 9.2 Oznaµcavanje grafa


De…nisati nizove cc [:] i boja [ ] duµzine n
numCC 0
ZaSvaki (µcvor i)
{
Obojiti Bijelo }
µ
ZaSvaki Cvor(i od 1 do n)
{

Algoritmi i programiranje, V.2 101 A.G. 2018/2019, Radni materijal


9.2 Algoritmi pretraµzivanja 9 GRAFOVSKI ALGORITMI

AkoJe(boja [i]=Bijelo)
{
numCC numCC + 1
cc [i] numCC
boja [i] Sivo
SveDok(Postoji µcvor Sivo)
{
Uzmi Sivi µcvor j
Obojiti sve njegove Bijele susjede Sivo
cc [j] numCC
boja [j] Crno }
}
}

Kad se ovaj algoritam završi veliµcina numCC sadrµzi ukupan broj povezanih komponenti
a 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 se


najprije obra†uju svi µcvorovi povezani sa startnim µcvorom zatim µcvorovi na distanci
2 itd.

depth-…rst-search (DFS) : uzeti µcvor koji je prona†en najkasnije. Ovo znaµci da se


najprije istraµzuju µcvorovi koji su na dugaµckom lancu (sve dok se ne do†e do kraja
lanca)

Ova dva pristupa se bitno razlikuju po sloµzenosti i dinamici pretraµzivanja i oba pristupa
imaju 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 se
zove minimalno razapinjuće 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 u
ove svrhe. Sloµzenost 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 tako
stvoren lanac ima odre†ena svojstva "separabilnosti".

Primjer. Neka je data mreµza raµcunara. Potrebno je naći sve kompjutere koji, ako se
uklone, µcine da se mreµza raspada.

Algoritmi i programiranje, V.2 102 A.G. 2018/2019, Radni materijal


9.3 Algoritmi najkraćeg puta 9 GRAFOVSKI ALGORITMI

9.3 Algoritmi najkraćeg puta


Oµcigledna generalizacija problema najkraćeg puta ima izvor u µcinjenici da grane (ivice)
imaju razliµcite "teµzine". Formalno, potrebno je imati naµcin na koji se "teµzine" dodjelju
ivicama. To se µcini putem sljedeće de…nicije.

De…nicija 9.1 Teµzinski graf je graf G = (V ; E) zajedno sa funkcijom w : E ! R. Kaµze


se da je w (i; j) = 1 ako (i; j) 2
= E.

Sliµcno se formalizuje problem "najkraćeg puta".

De…nicija 9.2 Putanja x = x0 ; x1 ; :::; xm = y je najkra´ci put od x do y ako ta putanja


minimizira:
X1
m
w (xi ; xi+1 )
i=0

Duµzina najkraćeg puta od x do y se oznaµcava sa d (x; y). Sada se problem najkraćeg puta
lako formuliše.

Problem 9.1 Za dati teµzinski graf G i dva µcvora x i y na´ci d (x; y). Pretpostavka je
w (i; j) > 0.

9.3.1 Dijkstra algoritam


Ovaj algoritam je namijenjen traµzenju najkraćeg puta u usmjerenim grafovima. Pret-
postavlja se da ivice grafa imaju svoje vrijednosti i cilj je naći najkraće putanje iz jednog
µcvora u sve µcvorove grafa.

Distanca izme†u dva µcvora u i v, u oznaci (u; v), je minimalna duµzina od u do v.

Problem najkraćeg puta iz jednog µcvora (single source shortest path) se de…niše na sljedeći
naµcin. Dat je usmjeren graf sa nenegativnim teµzinama ivica G = (V ; E) i izdvojenim
poµcetnim µcvorom s 2 V . Problem je odrediti distancu poµcetnog µcvora do svakog µcvora u
grafu.

Moguće je imati grafove sa negativnim teµzinama ivica ali kako bi najkraći putevi bili
dobro de…nisani potrebno je dodati zahtjev da uopšte nema ciklusa µcija je ukupna teµzina
negativna (inaµce bi se mogao napraviti beskonaµcno kratak put kretanjem zauvijek u tom
ciklusu). Ovdje se naglašava posao raµcunanja minimalne distance od poµcetnog µcvora
do svakog µcvora. Raµcunanje stvarne duµzine je dosta lagano proširenje problema. Za
svaki µcvor se formira pointer pred (v) koji ukazuje na prethodnika. Slijedeći pointere
prethodnika unazad od bilo kojeg µcvora konstruiše se reverzna slika najkraćeg puta do v.

Osnovna struktura Dijkstra algoritma je odrµzavanje procjena najkraćeg puta za svaki


µcvor, u oznaci d [v]. Intuitivno gledano, d [v] će biti duµzina najkraćeg puta od s do v koji
je poznat algoritmu. Ova vrijednosti je uvijek veća ili jednaka sa stvarno najkraćim putem
od s do v. Inicijalno, putevi su nepoznati tako da je d [v] = 1. Inicijalno je d [s] = 0 a
svi ostali d [v] su postavljeni na 1. Kako algoritam napreduje i kako se ukljuµcuje više
cµ vorova aµzurira se d [v] za svaki µcvor u grafu sve ove vrijednosti ne konvergiraju ka stvarno
najkraćoj distanci.

Algoritmi i programiranje, V.2 103 A.G. 2018/2019, Radni materijal


9.3 Algoritmi najkraćeg puta 9 GRAFOVSKI ALGORITMI

Proces kojim se vrši aµzuriranje procjene se zove relaksacija. Intuitivno gledano, ako nije
postignuta optimalna vrijednost ona je bliµza ka optimumu. Ako se otkrije put od s do v
koji je kraći od d [v] tada se vrši aµzuriranje te vrijednosti. Ovaj metod je zajedniµ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 postoje
procjene za d [u] i d [v]. Poznato je da postoji put od s do u sa teµzinom d [u]. Ako se uzme
ta putanja i ako se slijedi ivica (u; v) dobija se putanja do v duµzine d [u] + w (u; v). Ako
je ta putanja bolja od postojećeg puta do v duµzine d [v] tada se d [v] aµzurira na vrijednost
d [u] + w (u; v). Potrebno je zapamtiti da najkraći put do v prolazi kroz u što se µcini tako
da se aµzurira pointer prethodnika za v.

Treba primijetiti da kad god se d [v] postavi na konaµcnu vrijednost uvijek postoji trag
o putanji te duµzine. Stoga je d [v] (s; v). Ako je d [v] = (s; v) tada naknadne
relaksacije ne mogu promijeniti tu vrijednost.

Nije teško vidjeti da ako se relaksacija provedi sa svim ivicama grafa, vrijednosti d [v]
obavezno konvergiraju konaµcnoj stvarnoj vrijednosti iz s. Cilj svakog dobrog algoritma
nalaµzenja najkraćeg puta je da se aµzuriranja obavljaju na naµcin da je konvergencija što
je moguće brµza. Posebno, najbolji naµcin bi bio da se operacije relaksacije poredaju na
naµcin da se za svaku ivicu provode taµcno jednom. Taµcno ovo radi Dijkstra algoritam.

Dijkstra algoritam je zasnovan na izvršavanju ponovljenih relaksacija. On radi tako da


odrµ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 povećanje poretka distance od izvora.


Na taj naµcin, kad god se provodi relaksacija moguće je zakljuµciti da rezultat relaksacije
daje konaµcnu vrijednost distance. Za implementaciju ovog koncepta za svaki µcvor u 2
V nS se odrµzava procjena distance d [u]. Pohlepni dio algoritma se odnosi na to da se
uzima µcvor iz V nS za koji je d [v] minimalno tj. uzima se neobra†eni µcvor koji je (prema
procjeni) najbliµzi ka s.

Kako bi se ova selekcija izvršila e…kasno, µcvorovi iz V nS se stavljaju u red prioriteta


(tj. heap - gomila) gdje je kljuµcna vrijednost svakog µcvora u jednaka d [u]. Primjetna
je sliµcnost sa Primovim algoritmom iako se koriste razliµcite vrijednosti. Za svaki µcvor je
poznata lokacija u redu prioriteta i svaka stavka u redu prioriteta "poznaje" koji µcvor
prezentira.

Algoritmi i programiranje, V.2 104 A.G. 2018/2019, Radni materijal


9.4 Pohlepni algoritmi na grafovima 9 GRAFOVSKI ALGORITMI

Zbog sliµcnosti sa Primovim algoritmom vrijeme izvršenja je jednako, (E log V ).

Drugi algoritmi kojima se rješava problem najkraćeg puta su :


- Floyd Warshall-ov algoritam
- Algoritam mravlje kolonije

9.4 Pohlepni algoritmi na grafovima


Uobiµcajeni problem u komunikacionim mreµzama i dizajnu elektriµcnih kola je povezivanje
skupa µcvorova (komunikacionih µcvorova ili elemenata elektriµcnog kola) pomoću najkraće
moguće mreµze, µcija je duµzina suma duµzina pojedinih veza. Pretpostavlja se da je mreµza
neusmjerena. 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 minimalnog razapinjućeg stabla (Minimum Spanning


Tree, kraće MST). Formalnije, za dati povezani neusmjereni graf G = (V ; E) razapinjuće
stablo je acikliµcni skup ivica T R koje povezuju sve µcvorove. Pretpostavlja se da svaka
ivica 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 razapinjućeg stabla:
X
w (T ) = w (u; v)
(u;v)2T

Minimalno razapinjuće stablo je ono koje ima minimalnu teµzinu. Ovo stablo ne mora biti
jedinstveno. Ako sve ivice imaju razliµcitu teµzinu tada su minimalna razapinjuća stabla
razliµcita. Ovo još nije dokazano već je µcinjenica koja se koristi.

Slika prikazuje tri razapinjuća stabla za isti graf. U sredini i desno su su dva minimalna
razapinjuća stabla.

Algoritmi i programiranje, V.2 105 A.G. 2018/2019, Radni materijal


9.4 Pohlepni algoritmi na grafovima 9 GRAFOVSKI ALGORITMI

Za nalaµzenje minimalnog razapinjućeg stabla postoje dva pohlepna algoritma, Kruskalov


i Primov. Podsjetimo se da je pohlepni algoritam onaj koji rješenje nalazi ponavljan-
jem selekcije najje…tinije (ili generalno lokalno optimalnog izbora) od raspoloµzivih opcija
na svakoj etapi. Vaµzna karakteristika pohlepnih algoritama je da prave izbor koji ne
opozivaju. Prije prezentacije potrebne su neke bitne µcinjenice o slobodnim stablima.

Lema 9.1 Vrijede tvr†enja:

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 tog
ciklusa 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 jedna
ivica sve dok A ne postane MST. Kaµze se da je S E most (prelaz) ako je podskup ivica
nekog MST (ne moµze se reći 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 siguran
izbor tako da A još uvijek moµze formirati MST. Ako je A prelaz ne moµze sadrµzavati
ciklus. Izvorni (generiµcki pohlepni algoritam radi tako da dodaje sigurne ivice na tekuće
razapinjuće stablo. Potrebno je voditi raµcuna da je prelaznost svojstvo podskupa ivica a
sigurnost svojstvo pojedine ivice.

Neka je S podskup µcvorova S V . Podjela (cut) (S; V nS) je particija µcvorova u dva
disjunktna podskupa. Ivica (u; v) prelazi podjelu ako je jedna njena krajnja taµcka u S a
druga u V nS. Za dati podskup ivica A se kaµze da podjela poštuje A ako ne postoje ivice
u A koje prelaze podjelu. Nije teško vidjeti zašto je poštovanje podjele vaµzno za ovaj
problem. Ako je formiran djelimiµcni MST i ako se µzeli znati koje ivice koje mogu biti
dodate i koje ne formiraju ciklus u tekućem MST, bilo koja ivica koja prelazi poštujuću
podjelu je mogući kandidat.

Ivica u E je lagana ivica koja prelazi podjelu ako ima minimalnu duµzinu od svih ivica
koje prelaze podjelu. Lagana ivica moµze ne biti jedinstvena. Prema intuiciji, s obzirom
da sve ivice koje prelaze poštujuću podjelu ne formiraju ciklus tada je lagana ivica koja
prelazi podjelu prirodan izbor.

Lema 9.2 (MST) Neka je G = (V; E) povezan neusmjereni graf sa ivicama realnih vri-
jednosti. Neka je A prelazni podskup od E (odnosno podskup nekog MST) i neka je
(S; V nS) bilo koja podjela koja poštuje A i neka je (u; v) lagana ivica koja prelazi podjelu.
Tada je (u; v) sigurna za A.

9.4.1 Kruskalov algoritam


Kruskalov algoritam radi tako da se ivice dodaju na A u rastućem redoslijedu teµzina
(najprije lakše ivice). Ako naredna ivica ne formira ciklus unutar tekućeg skupa ivica
tada se dodaje u A. Ako formira ciklus tada se ivica propušta i razmatra se sljedeća ivica
u poretku. Kako algoritam odmiµce formiraju se stabla u µcvorovima. Tokom algoritma
ova stabla se udruµzuju sve dok se ne dobije stablo koje sadrµzi sve µcvorove.

Algoritmi i programiranje, V.2 106 A.G. 2018/2019, Radni materijal


9.4 Pohlepni algoritmi na grafovima 9 GRAFOVSKI ALGORITMI

Ova strategija vodi ka korektnom algoritmu. Uzmimo npr. ivicu (u; v) koja se treba
dodati i pretpostavimo da ta ivica ne formira ciklus u A. Neka je A0 stablo u šumi A
koje sadrµzi µcvor u. Posmatra se Podjela (A0 ; V nA0 ). Svaka ivica koja prelazi podjelu nije
u A tako da ta podjela poštuje A i (u; v) je lagana ivica preko podjele (jer su sve laganije
ivice 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 uzima
jako puno vremena. Potreban je brz i pouzdan test koji nam daje odgovor na pitanje
da li je u ili v u istom stablu A. Ovo se moµze uraditi putem strukture podataka koja
se zove Unija-Traµzenje (Union-Find) dva disjunktna skupa. Ova struktura podrµzava tri
operacije:

KreiratiSet(u) : Kreiranje skupa koji sadrµzi stavku u.


NaćiSet(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 µcvorovi


u svakom stablu A. Skup A moµze biti pohranjen kao jednostavna lista ivica. Primjer je
pokazan na narednoj slici.

Analiza. Koliko dugo traje Kruskalov algoritam ? Kao i obiµcno, neka je V broj µcvorova
i E broj ivica. S obzirom da je graf povezan moµze se uzeti da je E V 1. Za sortiranje
ivica potrebno je (E log E). Petlja se ponavlja E puta a svaka iteracija ukljuµcuje
konstantan broj pristupa Union-Find strukturi na skupu od V stavki. Stoga, za svaki
pristup treba (V ) vremena a skupa (E log V ). Stoga je ukupno vrijeme izvršenja
jednako njihovoj sumu koja je ((V + E) log V ). S obzirom da V u asimptotskom smislu
nije veće od E slijedi da je vrijeme izvršenja (E log V ).

9.4.2 Primov algoritam


Primov algoritam je drugi pohlepni algoritam za minimalno razapinjuće stablo. Od
Kruskalovog algoritma se razlikuje samo u naµcinu odabira naredne sigurne ivice koja

Algoritmi i programiranje, V.2 107 A.G. 2018/2019, Radni materijal


9.4 Pohlepni algoritmi na grafovima 9 GRAFOVSKI ALGORITMI

se dodaje na svakom koraku. Vrijeme izvršenja je potpuno jednako kao za Kruskalov


algoritam. Ovaj algoritam pokazuje da postoji više od jednog naµcina da se riješi ovaj
problem. Veoma je sliµcan Dijkstra algoritmu, kojim se rješava potpuno druga vrsta prob-
lema : najkraći put u mreµzi.

Kruskalov algoritam radi tako da sortira ivice i umeće ih jednu po jednu u razapinjuće
stablo vodeći 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 istom
stablu.

Za razliku od njega, Prim-ov algoritam gradi stablo dodavanjem po jednog lista na tekuće
stablo. Startuje se sa korijenskim µcvorom r koji moµze biti bilo koji. U bilo koje vrijeme
podskup ivica A formira jedno stablo (u Kruskalovom algoritmu se formira šuma). Traµzi
se dodavanje µcvora kao lista na stablo. Proces je ilustrovan na narednoj slici.

Ako se posmatra skup µcvorova S koji je dio stabla i njegov komplement tada postoji
podjela grafa i tekući skup ivica A poštuje tu podjelu. MST lema kaµze da je sigurno
dodavanje 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 podjelu
koju su presijecale prije ovog koraka, nestaju a javljaju se nove koje nisu presijecale tu
podjelu.

Lako je vidjeti da je za e…kasnu implementaciju Prim-ovog algoritma kljuµcno e…kasno


aµzuriranje podjele i brzo odre†ivanje lagane ivice. Da bi se to uµcinilo koristi se struktura
podataka 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.

Algoritmi i programiranje, V.2 108 A.G. 2018/2019, Radni materijal


9.4 Pohlepni algoritmi na grafovima 9 GRAFOVSKI ALGORITMI

Za analizu Prim-ovog algoritma raµcuna se vrijeme potrošeno na svakom µcvoru nakon što se
preuzme iz reda prioriteta (priority queue). Ova aktivnost uzima O (log V ) vremena. Za
svaku ivicu se potroši oko O (log V ) vremena kako bi se smanjio kljuµc susjednih µcvorova pa
je vrijeme O (log V + deg (u) log V ). Ostali koraci aµzuriranja se obavljaju u konstantnom
vremenu. Na osnovu ovoga je:
X X
T (V; E) = (log V + deg (u) log V ) = (1 + deg (u)) log V
u2V u2V
X
= log V (1 + deg (u)) = (log V ) (V + 2E) = ((V + E) log V )
u2V

S obzirom da je G povezan V asimptotski nije veći od E tako da je rezultat (E log V ).


To je taµcno jednako sa procjenom za Kruskalov algoritam.

Algoritmi i programiranje, V.2 109 A.G. 2018/2019, Radni materijal


9.5 Zadaci 9 GRAFOVSKI ALGORITMI

9.5 Zadaci
Zadatak 01. Kruskalovim algoritmom naći minimalno razapinjuće stablo na sljedećem
grafu.

Rješenje je dato na narednoj tabeli.

Korak Raspoloµzivo Uzeto


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

Algoritmi i programiranje, V.2 110 A.G. 2018/2019, Radni materijal


9.5 Zadaci 9 GRAFOVSKI ALGORITMI

Zadatak 02. Kruskalovim algoritmom naći minimalno razapinjuće stablo na sljedećem


grafu.

Rješenje. Postupak rješavanja je prikazan na narednoj tabeli.

Korak Raspoloµzivo Uzeto


1 (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 1: Graf 02

Dobijeno je stablo na narednoj slici.

Algoritmi i programiranje, V.2 111 A.G. 2018/2019, Radni materijal


9.5 Zadaci 9 GRAFOVSKI ALGORITMI

Zadatak 03. Primovim algoritmom naći minimalno razapinjuće stablo na sljedećem


grafu.

Rješenje. Postupak rješavanja je dat na narednoj tabeli.

Korak µ
Cvorovi Raspoloµzivo Uzeto
1 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 mora
uvijek biti sluµcaj.

Algoritmi i programiranje, V.2 112 A.G. 2018/2019, Radni materijal


9.5 Zadaci 9 GRAFOVSKI ALGORITMI

Zadatak 04. Dijkstra algoritmom naći najkraći put u sljedećem grafu.

Rješenje. Postupak je dat na sljedećoj tabeli.

Korak µ
Cvorovi Veze Uzeto
1 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) (c,d)
11 d, g, l h(13) (l,h)

Dobijena je putanja na sljedećoj slici.

Algoritmi i programiranje, V.2 113 A.G. 2018/2019, Radni materijal


9.6 Zadaci za vjeµzbu 9 GRAFOVSKI ALGORITMI

Zadatak 05. Dijkstra algoritmom naći najkraći put u sljedećem grafu.

Postupak je dat na sljedećoj tabeli.

Korak µ
Cvorovi Veze Uzeto
1 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 sljedećoj slici.

9.6 Zadaci za vjeµzbu


Na sljedećim grafovima odabranim algoritmom naći minimalno razapinjuće stablo i na-
jkraći put. Za poµcetni uzimati µcvor a.

Algoritmi i programiranje, V.2 114 A.G. 2018/2019, Radni materijal


9.6 Zadaci za vjeµzbu 9 GRAFOVSKI ALGORITMI

Algoritmi i programiranje, V.2 115 A.G. 2018/2019, Radni materijal


9.6 Zadaci za vjeµzbu 9 GRAFOVSKI ALGORITMI

Algoritmi i programiranje, V.2 116 A.G. 2018/2019, Radni materijal


9.6 Zadaci za vjeµzbu 9 GRAFOVSKI ALGORITMI

Algoritmi i programiranje, V.2 117 A.G. 2018/2019, Radni materijal


9.6 Zadaci za vjeµzbu 9 GRAFOVSKI ALGORITMI

Algoritmi i programiranje, V.2 118 A.G. 2018/2019, Radni materijal


9.6 Zadaci za vjeµzbu 9 GRAFOVSKI ALGORITMI

Algoritmi i programiranje, V.2 119 A.G. 2018/2019, Radni materijal


10 PROGRAMSKI JEZIK C++

10 Programski jezik C++


10.1 Uvod u C++
12.01. Tipovi promjenljivih. 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 :

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ćen 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ći
program :

Algoritam 10.1 Podaci o duµzinama promjenljivih u 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");
}

Algoritmi i programiranje, V.2 120 A.G. 2018/2019, Radni materijal


10.1 Uvod u C++ 10 PROGRAMSKI JEZIK C++

U programskom jeziku C++ tip se moµze promijeniti u toku izvršenja koraka unutar
programa. Moguće je napisati npr. x=sqrt(float(a)). Ovo znaµci da ako je broj a bio
npr. cjelobrojan tada se sa float(a) pretvara u broj u pokretnom zarezu a zatim se
izvršava naredba sqrt().

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

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 inicirana
daje potpuno neizvjestan rezultat.

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

Programski jezik C++ pravi razliku izme†u velikih i malih slova. Tako su promjenljive
JedanBroj, jedanbroj, Jedanbroj, jedanBroj sa stanoviša C++ jezika potpuno ra-
zliµcite.

Dizajn algoritma ukljuµcuje obaveznu kontrolu njegove ispravnosti kako bi se ustanovilo


da algoritam daje µzeljeni rezultat.

12. 02. Nizovi i matrice. Niz u C++ jeziku 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 realnih
brojeva pod nazivom indeksi koji ima 12 elemenata. U ovakvom naµcinu deklarisanja
mora se navesti dimenzija niza u zagradi. To znaµci da dizajner mora unaprijed znati ili
pretpostaviti najveću moguću dimenziju niza.

U C++ jeziku se koristi tzv. relativno referenciranje. U tom sistemu prvi µclan niza ima
indeks 0 a svi ostali, drugi µclan indeks 1 itd. Drugim rijeµcima, indeks svakog µclana
odgovara ’rastojanju’od prvog (nultog) µclana.
µ
Cest praktiµcni problem je kako unijeti µclanove niza, posebno kada je u pitanju veći 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šće iz neke datoteke

Algoritmi i programiranje, V.2 121 A.G. 2018/2019, Radni materijal


10.1 Uvod u C++ 10 PROGRAMSKI JEZIK C++

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 obzirom


na 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 nekog
od µ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 već program odre†uje
dimenziju nakon uµcitavanja.

Ako se u deklaraciji navede dimenzija niza i nabroji manje elemenata od te dimenzije


nedostajući elementi se inicijaliziraju na nulu. Primjer je niz:
int a[8] ={-2,3,1,6,-3};

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

Primjer unosa µclanova niza iz datoteke će biti objašnjen kasnije.

U nastavku je primjer potpuno funkcionalnog programa kojim se vrši unos µclanova niza
sa proizvoljnim brojem µclanova.

Algoritam 10.2 Unos µclanova niza


#include <iostream>
#include <cmath>
using namespace std;
int main()
{
// Broj µclanova niza
int n;
// Brojaµc na uµcitavanju
int k;
// Deklaracija niza; uzeto je da je niz cjelobrojni
int 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 µclan
cout << "µClan broj " << k << " je : " << endl;
cin >> niz[k]; }
cout << "Ispisuje se upisani niz " << endl;
for(k=1;k<=n;k++)
{
cout << niz[k] << "nt"; }

Algoritmi i programiranje, V.2 122 A.G. 2018/2019, Radni materijal


10.2 Primjeri iz prethodnih poglavlja 10 PROGRAMSKI JEZIK C++

cout << "nn";


system("PAUSE");
}

Matrice su dvodimenzionalni nizovi tako da vrijede ista pravila u pogledu referenciranja.


Ako se matrica inicijalizira nabrajanjem tada se inicijalizacijska lista sastoji od 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


cµ emu se tada ona automatski odre†uje na osnovu broja podlisti za inicijalizaciju redova
unutar inicijalizacione liste. Tako će, u sljedećem primjeru, prva dimenzija niza biti
automatski 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 formata


m n.

10.2 Primjeri iz prethodnih poglavlja


Algoritam 10.3 Kvadratna jednaµcina
#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 << "Jednadµzba ima kompleksne korijenenn" << endl;
real = -b/(2*a);
cout << "Realni dio jenn" << real << endl;

Algoritmi i programiranje, V.2 123 A.G. 2018/2019, Radni materijal


10.2 Primjeri iz prethodnih poglavlja 10 PROGRAMSKI JEZIK C++

imag = sqrt(-D)/(2*a);
cout << "Imaginarni dio jenn" << imag << endl; }
else
{
if(D==0)
{
cout << "Jednadµzba ima jednake korijenenn" << endl;
x1 = -b/(2*a);
cout << x1 << endl; }
else
{
cout<<"Jednadµzba 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);
}

Algoritam 10.4 Minimalni i maksimalni element 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 odgovaraju´ce poruke
cout << "Najveći broj je : " << Mak << endl;
cout << "Najmanji broj je : " << Min << endl;
system("PAUSE");
}

Algoritam 10.5 Vrijednost polinoma


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

Algoritmi i programiranje, V.2 124 A.G. 2018/2019, Radni materijal


10.2 Primjeri iz prethodnih poglavlja 10 PROGRAMSKI JEZIK C++

{
// Deklaracija i inicijalizacija niza
int koef[]={2,-3,4,-5,6}, k;
float x, S;
cout << "Unesite broj x :";
cin >> x;
// Inicijalizacija promjenljive S
S=koef[4];
for(k=3;k>=0;k--)
{
S=S*x+koef[k]; }
cout << "Vrijednost polinoma je : " << S << endl;
system("PAUSE");
}

Raµcunanje sume
Xn
i2
S=
i=1
i+1

Algoritam 10.6 Raµcunanje sume


#include <iostream>
using namespace std;
int main()
{
int n, k;
float m, S;
cout << "Unesite broj za sumu :";
cin >> n;
// Inicijalizacija promjenljive S
S=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 zarezu
m = float(k);
S = S+(k*k)/(k+1); }
cout << "Traµzena suma je : " << S << endl;
system("PAUSE");
}

NAPOMENA : U tekstu priloµzenog C++ programa bitan je korak m=float(k). Ovim


postupkom se cijeli broj pretvara u broj u pokretnom zarezu. Bez ovoga se k 2 = (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µciji
rezultat. Ako se program pokrene bez ove konverzije za n = 15 dobije se rezultat S = 105

Algoritmi i programiranje, V.2 125 A.G. 2018/2019, Radni materijal


10.2 Primjeri iz prethodnih poglavlja 10 PROGRAMSKI JEZIK C++

(zašto ?) dok se sa konvezijom dobija rezultat S = 107:381. U pseudokodu ova µcinjenica


nije igrala bitnu ulogu ali u realnom programiranju ovo je veoma vaµzan aspekt rada u
C++ programskom jeziku o kojem se treba voditi raµcuna jer je µcest izvor grešaka.

Raµcunanje sume:
1 1 1 1
S= + + + ::: +
sin 1 sin 1 + sin 2 sin 1 + sin 2 + sin 3 sin 1 + sin 2 + ::: + sin n
U ovom algoritmu je vršena konverzija k= jer argumenti trigonometrijskih funkcija u
C++ jeziku moraju biti izraµzeni u radijanima. Potpuno drugaµcija bi se vrijednost dobila
ako bi na tom mjestu umjesto float(k)/PI stajalo float(k/PI). U drugom sluµcaju bi
se konverzija u tip float vršila nakon izraµcunavanja koliµcnika k= . U ovoj verziji nije
korištena veliµcina ".

Algoritam 10.7 Raµcunanje sume


#include <iostream>
#include <cmath>
using namespace std;
int main()
{
// De…nisanje konstante PI
const 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 S
S=S+1/R; }
cout << "Traµzena suma je : " << S << endl;
system("PAUSE");
}

Algoritam 10.8 Proizvod matrica


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

Algoritmi i programiranje, V.2 126 A.G. 2018/2019, Radni materijal


10.2 Primjeri iz prethodnih poglavlja 10 PROGRAMSKI JEZIK C++

// De…nisanje matrica
int 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µcitavanju
int i, j, k;
// Deklaracija niza; uzeto je da je niz cjelobrojni
cout << "Najprije ćemo 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 reda
cout << "nn";
}
// Prelazak na novi red
cout << "nn" << endl;
// Saµcekaj dok se ne pritisne taster
system("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 reda
cout << "nn" << endl;
}
// Prelazak na novi red
cout << "nn" << endl;
// Saµcekaj dok se ne pritisne taster
system("PAUSE");
// 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]; }

Algoritmi i programiranje, V.2 127 A.G. 2018/2019, Radni materijal


10.3 Rad sa datotekama 10 PROGRAMSKI JEZIK C++

}
}
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 reda
cout << "nn" << endl;
}
// Prelazak na novi red
cout << "nn" << endl;
// Saµcekamo da vidimo je li sve u redu
system("PAUSE");
}

10.3 Rad sa datotekama


Jedan od vaµznijih problema u programiranju je kako preuzeti ulazne veliµcine. Ovo je
posebno vaµzno riješiti u situacijama kao što su :

Preuzimanje podataka koji su rezultat neke druge obrade ili procesa

Uzimanje većeg obima podataka kao što su matrice većih dimenzija

Spremanje rezultata programa radi arhiviranja, kasnijih analiza ili obrada od strane
nekih 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 većeg broja podataka kako zbog vremena za unos tako
i zbog mogućih grešaka. Jedno od rješenja je korištenje datoteka za ulaz, me†ukorake i
izlaz.

Operacije u radu sa datotekama su :

kreiranje datoteka, obiµcno za izlaz

µcitanje iz datoteka

upis u datoteku

Ako su datoteke već 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, mora
imati naziv. Na sljedećem algoritmu je primjer programa koji u datoteku kvadrati.txt
upisuje brojeve od 1 do 100 i njihove kvadrate, odvojene zarezom.

Algoritmi i programiranje, V.2 128 A.G. 2018/2019, Radni materijal


10.3 Rad sa datotekama 10 PROGRAMSKI JEZIK C++

Algoritam 10.9 Upis u datoteku


#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 #include


naredbi. Sljedeći bitan element je naµcin deklaracije izlazne datoteke pomoću naredbe
ofstream (što se moµze tumaµciti kao output file stream). Umjesto naredbe cout rezultat
se usmjerava na izlazni tok koji se naziva izlaz. Naziv datoteke se daje prema pravilima
operativnog sistema pod kojim se radi. Ako okolnosti nalaµzu da ime datoteke sadrµzi znak
n (backslash) tada se taj znak uduplava. Npr. ako datoteka treba imati naziv

"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 mu
postavlja "upit"). Na sljedećem algoritmu je primjer takvog pristupa.

Algoritam 10.10 Kreiranje datoteke


char 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 sljedećem algoritmu.

Algoritam 10.11 Kreiranje datoteke


string 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 ime
a funkcijom ime.c_str() se iz upisanog tekstualnog niza odbacuju evenutalni blankovi
sa 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 naredbe
ofstream koristi ifstream a ulazni tok cin mijenja oznakom ulazne datoteke. Na
sljedećem algoritmu je primjer u kojem se elementi matrice uµcitavaju iz datoteke.

Algoritmi i programiranje, V.2 129 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

Algoritam 10.12 Uµcitavanje podataka iz datoteke


#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 ulaz
ulaz >> 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 dalje
else if(ulaz.bad()) cout << "Datoteka je vjerovatno oštećena!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);
}

Otvaranje datoteke se vrši metodom open a zatvaranje metodom close. Druge varijante
rada sa datotekama kao ulaznim odnosno izlaznim tokovima nisu predmet daljeg rada.

Zad. 10.1 Programe iz prethodnih poglavlja prilagoditi tako da podatke preuzimaju iz


datoteke i rezultat smještaju u datoteku.

10.4 Klase i objektno programiranje


Za µcuvanje i rad sa razliµcitim tipovima podataka u C jeziku moµze se koristiti sloµzeni tip
promjenljive koji se zove struct. Primjer je rad sa datumima tako da se moµze napraviti
de…nicija data u sljedećem algoritmu.

Algoritam 10.13 Struktura Datum


struct Datum
{

Algoritmi i programiranje, V.2 130 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

int dan, mjesec, godina;


};

Na sljedećem algoritmu su primjeri mogućih deklaracija.

Algoritam 10.14 Deklaracije datuma


Datum d;
d.dan=33;
d.mjesec=14;
d.godina=2004;

Ovaj tip je veoma pogodan za neke upotrebe jer se osigurava bolji kontekst. Sa druge
strane, oµcito je, kao u ovom primjeru, da nedostaje mogućnost kontrole sadrµzaja u smislu
me†usobne veze pojedinih komponenti strukutre. Jedna od mogućnosti da se ovaj prob-
lem, makar djelimiµcno, riješi je de…nicija funkcija koje pristupaju poljima strukture na
strogo kontrolisan naµcin i koje se koriste za tu svrhu. Jedan od boljih primjera za ilus-
traciju ovih kontrola je rad sa datumima, što će 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 datuma
unutar strukture a koja moµze imati izgled dat na sljedećem algoritmu.

Algoritam 10.15 Postavljanje datuma


void 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 upućuje odrednica &d i to tako da se


napiše npr:
Datum dd;
PostaviDatum(dd,33,14,2012);
Ovakav pristup znaµci da programer mora koristiti navedenu funkciju ako µzeli potpunu
kontrolu jer ga ništa ne ograniµcava da radi direktno sa elementima strukture, u ovom
sluµcaju to je struktura Datum. Ovo ne bi bio problem u sluµcaju kad jedan programer
kontroliše cijeli programski kod ali jeste u sluµcaju kada na programima rade, nekad veoma
veliki, razvojni timovi, jer je teško (a nekad i nemoguće) mijenjati ili nametati pravila koja
svi moraju poštovati kako bi se saµcuvao integritet programa. Potreba za timskim razvojem
velikih programa dovela je do razvoja potpuno nove metodologije za razvoj programa,
koja je nazvana objektno orijentisano programiranje (OOP - object oriented programming).
U toj metodologiji mnogo veći znaµcaj se daje samim podacima i tipovima podataka nego
što je to sluµcaj u klasiµcnoj metodologiji programiranja, koja je poznata i pod 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.

Algoritmi i programiranje, V.2 131 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

Klasa se dobija tako što se unutar strukture dodaju prototipovi funkcija koje se mogu
primjenjivati nad tim podacima. Na primjer, deklaracija na sljedećem algoritmu de…niše
klasu Datum koja pored podataka dan, mjesec i godina sadrµzi i prototip funkcije Postavi,
koja će se primjenjivati nad promjenljivima tipa Datum:

Algoritam 10.16 De…nisanje datuma


class 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 prosto
objekti. U tom smislu, klasa je apstrakcija koja de…niše zajedniµcka svojstva i zajedniµcke
postupke koji su svojstveni svim objektima nekog tipa.

Funkcije µciji su prototipovi navedeni unutar same klase nazivaju se funkcije µclanice klase
ili metode. Njihova namjena je da se primjenjuju nad konkretnim objektima te klase a ne
da im se kao parametri šalju objekti te klase. Ovome je prilago†ena i sintaksa pozivanja
funkcija µclanica. One se uvijek primjenjuju nad nekim konkretnim objektom korištenjem
operatora “.”(taµcka), istog operatora koji se koristi i za pristup atributima unutar klase.
Primjer pozivanja funkcije Postavi na dva konkretna objekta tipa Datum je sljedeći :
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 upućuje i na promjenu naµcina razmišljanja. Funkciji PostaviDatum
se kao argument šalju objekti d1 i d2, dok se funkcija Postavi primjenjuje nad objektima
d1 i d2.

Jedna od mogućih implementacija funkcije Postavi je na sljedećem algoritmu.

Algoritam 10.17 Kontrole u postavljanju datuma


void 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 treba
ukazivati na to da se radi o funkciji µclanici klase Datum. Na taj naµcin je moguće da
postoje i obiµcna funkcija i funkcija µclanica istog imena, uz dodatnu mogućnost da više
razliµcitih klasa imaju funkcije µclanice istih imena. Znak “::” (dupla dvotaµcka) spada u
operatore, 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 bez
navo†enja na koji se konkretni objekt ovi atributi odnose. Ovakvu privilegiju, direktnog

Algoritmi i programiranje, V.2 132 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

pristupa atributima klase, imaju iskljuµcivo funkcije µclanice te klase. Funkcije µclanice
klase nikad se ne pozivaju samostalno nego se uvijek primjenjuju nad nekim konkretnim
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 na
atribute 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 Postavi
odnose na odgovarajuće atribute objekta d1 tj. interpretiraju se kao d1.dan, d1.mjesec
i d1.godina.

Pristup atributu dan je moguć na dva naµcina. Jedan je eksplicitno korištenje pokazivaµca
(pointera) this. Funkcija Postavi mogla je biti napisana kao na sljedećem algoritmu.

Algoritam 10.18 Kontrola datuma


void 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šći, naµcin je upotreba operatora razluµcivosti “::”. Notacija Datum::dan
eksplicitno naglašava da se misli na atribut dan koji pripada klasi Datum. Stoga se metoda
Postavi moµze napisati i na naµcin dat na sljedećem algoritmu.

Algoritam 10.19 Postavljanje i kontrola datuma


void 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 istaći razliku izme†u operatora “.”(taµcka) i “::”(scope). Operator “.”se uvijek
primjenjuje na neki konkretan objekt. Tako, d1.dan oznaµcava atribut dan konkretnog
objekta d1. Sa druge strane, operator “::” se primjenjuje nad samom klasom, kao
apstraktnim tipom podataka. Tako, Datum::dan oznaµcava atribut dan koji pripada klasi
Datum, bez speci…kacije na koji se konkretan objekt klase Datum taj atribut odnosi. Iz
tog razloga, ovakva upotreba atributa dan moµze imati smisla jedino unutar de…nicije neke
metode.

Kako bi se sprijeµcila situacija da se metoda Postavi zaobi†e i direktnom postavkom


atributa dan, mjesec i godina upiše besmislen datum uvodi se mehanizam kljuµcnih rijeµci

Algoritmi i programiranje, V.2 133 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

private i public. One se koriste iskljuµcivo unutar deklaracija klase a iza njih uvijek
slijedi znak “:” (dvotaµcka). Njima se speci…cira privatni i javni dio klase. Neka je
deklaracija klase Datum izmijenjena kao na sljedećem algoritmu.

Algoritam 10.20 Postavljanje datuma


struct Datum
{
private:
int dan, mjesec, godina;
public:
void Postavi(int d, int m, int g);
};

Na ovaj naµcin nisu moguće deklaracije kao što su


d1.dan=20;
cout<<d1.dan;
Privatni atributi su jednostavno nedostupni za ostatak programa osim za funkcije µclanice
klase i prijateljske funkcije klase ! Da bi klasa Datum imala smisla, osim postavljanja
datuma se dodaju i druge funkcije odnosno metode. Primjer je metoda Ispisi() koja
ispisuje datum na ekran. Primjer izmjene je na sljedećem algoritmu.

Algoritam 10.21 Postavljanje datuma


struct 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 10.22 Ispis datuma


void Datum::Ispisi()
{
cout << dan << "." << mjesec << "." << godina << ".";
}

Sada je moguće napisati sljedeći niz naredbi:


Datum d;
d.Postavi(14, 5, 2004);
cout << "Upisan je datum ";
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())

Algoritmi i programiranje, V.2 134 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

Prikaµzi godinu (u nekim paketima poznato kao funkcija Year())

Oµcitavanje datuma

Primjer de…nicije klase Datum sa nekim dodatnim metodama je na sljedećem algoritmu.

Algoritam 10.23 Klasa Datum sa novim metodama


class 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 za Datum i neke metode, implementirane su metode u okviru deklaracije


klase što se naziva inline deklaracija. Komplikovanije metode se trebaju implementirati
van deklaracije klase, posebno u sluµcajevima kada te metode sadrµze petlje i komplikovanije
uslove. Na sljedećem algoritmu je primjer metode SljedeciDatum().

Algoritam 10.24 Sljede´ci datum


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

Algoritmi i programiranje, V.2 135 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

{
mjesec = 1; godina++;
}
}

Na narednom algoritmu je metoda kojom se ispisuje naziv mjeseca u datumu.

Algoritam 10.25 Naziv mjeseca


char *Datum::ImeMjeseca() const
{
char *nazivi_mj[] = {"Januar", "Februar", "Mart", "April", "Maj", "Juni",
"Juli", "August", "Septembar", "Oktobar", "Novembar", "Decembar"};
return nazivi_mj[mjesec - 1];
}

Na sljedećem algoritmu je metoda kojom se datum ispisuje tako da je naziv mjeseca


ispisan slovima.

Algoritam 10.26 Naziv mjeseca slovima


void Datum::IspisiMj() const
{
cout << dan << ". " << ImeMjeseca() << " " << godina << ".";
}

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µcaju
to su Ocitaj, VratiDan, VratiMjesec i sliµcno. U jeziku C++ se smatra dobrom prak-
som posebno oznaµciti funkcije inspektore kljuµcnom rijeµci const. Tako oznaµcene funkcije
nazivaju se konstantne funkcije µclanice. Na taj naµcin se omogućava kompajleru prijava
greške u sluµcaju da se unutar metode za koju je poznato da treba biti inspektor pokuša
promjena vrijednosti nekog od atributa. Pomoću kljuµcne rijeµci const moguće je de…nirati
konstantne objekte, na isti naµcin kao i npr. cjelobrojne konstante.

Metode iz druge kategorije mijenjaju atribute klase nad kojom su primijenjene. U našem
sluµcaju to je metoda Postavi.

Zadatak. U deklaraciju klase Datum dodati sljedeće metode:

Ispis datuma kao redni broj dana u godini i godina. Naprimjer, datum 24.10.2013
se 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

Algoritmi i programiranje, V.2 136 A.G. 2018/2019, Radni materijal


10.4 Klase i objektno programiranje 10 PROGRAMSKI JEZIK C++

Gregorijanski datum pretvoren u julijanski datum. Poznato je da julijanski kaledar


koristi pravoslavna crkva a Izme†u ova dva kalendara postoji razlika od 13 dana1
na naµcin da je "gregorijanski_datum" - "julijanski_datum" = 13

Zadatak. Zadat je datum dd:mm:gggg, pri µcemu je gggg > 1900. Uraditi sljedeće :

Odrediti koji dan u sedmici (Ponedjeljak, ..., Nedjelja) odgovara tom datumu.
Pritom je poznato da je 01.01.1900 bio ponedjeljak

Odrediti koliko petaka ima datum 13 u godini tog datuma. Problem generalizirati
za 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 sljedeće:

Zamjena dva datuma ako je prvi od njih veći od drugog

Broj dana izme†u dva datuma. Na osnovu toga izraµcunaj svoju starost izraµzenu
brojem dana

Broj mjeseci izme†u dva datuma

Broj cijelih godina izme†u dva datuma

1
Da li znate zašto je razlika baš 13 dana ?

Algoritmi i programiranje, V.2 137 A.G. 2018/2019, Radni materijal


µ
11 NP SLOZENOST

11 NP Sloµzenost
Tokom 60-ih godina napravljeni su veliki pomaci u nalaµzenju e…kasnih rješenja za mnoge
kombinatorne probleme ali je nastala rastuća lista problema za koje se µcinilo da ne postoji
e…kasno algoritamsko rješenje. Ljudi su poµceli traµziti neku nepoznatu paradigmu koja bi
vodila ka rješenju tih problema ili dokaz da su moµzda ti problemi sami po sebi teški za
rješavanje i da ne postoje algoritamska rješenja koja rade ispod eksponencijalnog vremena.

Krajem 60-ih napravljeno je veliko otkriće. Mnogi od ovih problema su me†usobno


povezani u smislu da ako je bilo koji od njih bilo moguće riješiti u polinomijalnom vremenu
tada bi se mogao riješiti svaki od njih. Otkriće je skrenulo paµznju na N P -kompletnost
i kreiran je moµzda najveći problem u kompjuterskoj nauci : P = N P ? Cilj više nije
dokazati da problem moµze biti e…kasno riješen prezentiranjem algoritma. Umjesto toga
pokuš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 koji
ne mogu biti e…kasno riješeni. To se moµze uµciniti analizom problema koji mogu biti
riješeni u polinomijalnom vremenu. Zadatak da se dokaµze da nešto ne moµze biti uµcinjeno
e…kasno mora se analizirati mnogo paµzljivije kako se ne ostavila mogućnost bilo kome
da pravila krši na neprihvatljiv naµcin i istovremeno tvrdi da postoji e…kasno rješenje ako
takvo rješenje stvarno ne postoji.

Jedan od pristupa je mjerenje vremena izvršenja algoritama korištenjem scenarija sloµzenosti


najgoreg sluµcaja kao funkcije od n, veliµcine ulaza. Postoji više naµcina ali im je zajedniµcki
imenitelj broj bitova (ili bajtova) za prezentaciju ulaza korišenjem razumno e…kasnog
kodiranja. Naprimjer, brojevi se mogu pisati unarnom notacijom umjesto binarnom;
grafovi se mogu opisivati na neki nee…kasan naµcin kao što je lista svih njegovih ciklusa
ali je to neprihvatljivo. Pretpostavka je da se brojevi prikazuju u bazi većeg reda, da su
grafovi opisani matricama ili listom itd.

Uobiµcajeno je da se brojevi ograniµce na cijele (kao suprotnost "realnim" brojevima) pa


je jasno da se aritmetiµcke operacije mogu provoditi e…kasno. Pretpostavka je da se op-
eracije sa cijelim brojevima provode u konstantnom vremenu. Radi većeg opreza, moµze
se pretpostaviti da aritmetiµcke operacije zahtijevaju barem onoliko vremena kolika je
preciznost brojeva koji su predmet pohrane.

De…nicija 11.1 Za algoritam sa ulaznim parametrom n kaµzemo da je polinomijalne sloµzenosti


ako je njegovo vrijeme izvršavanja O(P (n)) gdje je P (n) polinom po n.

Klasu polinomijalnih algoritama oznaµcavamo sa P .

De…nicija 11.2 Za algoritam koji zavisi od prirodnih brojeva n1 ; n2 ; :::; nr od k1 ; k2 ; :::; kr


bita respektivno kaµze se da radi u polinomijalnom vremenu ako postoje prirodni brojevi
d1 ; d2 ; :::; dr takvi da je broj potrebnih bit operacija za njegovo izvršenje O k1d1 ; :::; krdr .
Za problem se kaµze da je rješiv u polinomijalnom vremenu ako postoji algoritam koji ga
rješava u polinomijalnom vremenu.

De…nicija 11.3 (Pojednostavljena de…nicija klase NP) Ako se neki problem predstaviti u
vidu najviše eksponencijalno mnogo instanci i ako za bilo koju instancu moµze biti riješen
u polinomijalnom vremenu, tada kaµzemo da problem pripada klasi N P .

Algoritmi i programiranje, V.2 138 A.G. 2018/2019, Radni materijal


11.1 Problemi odluµcivanja µ
11 NP SLOZENOST

Neke funkcije koje ne izgledaju kao polinomijalne (kao što je O (n log n)) su ograniµcne
odozgo polinomima (kao što je O (n2 )). Neke funkcije koje izgledaju kao polinomijalne
ustvari to nisu. Naprimjer, neka je predmet analize algoritam koji ima ulaz graf veliµcine
n i cijeli broj k koji radi u vremenu O nk . On nije polinomijalni jer je k ulazna veliµcina
takva da je korisniku omogućeno da odabere k = n što povlaµci da je vrijeme izvršenja
O (nn ) a to nije polinom po n. Vaµzno je napomenuti da eksponent mora biti konstanta
nezavisna od n.

Naravno, reći 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, ako
algoritam radi lošije nego u polinomijalnom vremenu (npr. 2n ) tada je sigurno da nije
e…kasan osim za male vrijednosti n.

De…nicija 11.4 Algoritam je subeksponencijalni ako je njegova sloµzenost funkcija oblika


O eo(n) gdje je n duµzina ulaznog podatka.

11.1 Problemi odluµcivanja


Mnogi od problema ukljuµcuju optimalizaciju u nekoj formi : naći najkraći put, naći
najmanje razapinjuće stablo, naći triangulaciju najmanje teµzine itd. Iz prevashodno
tehniµckih razloga najveći dio N P -problema će 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 razapinjućeg stabla se moµze formulisati na sljedeći naµcin : Za dati teµzinski graf
G i cijeli broj k da li G ima razapinjuće stablo koje je najviše k ?

Ovo se moµze µciniti kao mnogo zanimljivija formulacija problema. Ovdje se ne postavlja
pitanje teµzine minimalnog razapinjućeg stabla niti za ivice stabla za koje se dostiµze ova
teµ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 je
sigurno da ni mnogo generalniji problem sigurno ne moµze biti riješen e…kasno.

U nastavku je nekoliko de…nicija koje su od pomoći u razumijevanju terminologije koja


se javlja kad su u pitanju algoritmi odluµcivanja.

De…nicija 11.5 Za algoritam se kaµze da je decidan ako na postavljeno pitanje uvijek


daje odgovor Da ili Ne. Za algoritam se kaµze da je vjerovatnosni (engl. probabilistic)
ako koristi sluµcajne brojeve.

De…nicija 11.6 Da-bazirani Monte Carlo algoritam je vjerovatnosni algoritam za de-


cidne probleme gdje je odgovor Da uvijek taµcan ali odgovor Ne moµze biti netaµcan. Obratno
se de…niše Ne-bazirani algoritam Monte Carlo. Kaµze se da Da-bazirani algoritam Monte
Carlo ima grešku vjerovatno´ce " ako je mogu´cnost da rezultat algoritma bude odgovor Ne
kada bi taj odgovor trebao biti Da najviše ".

De…nicija 11.7 Las Vegas algoritam je vjerovatnosni algoritam koji za odre†enu vrstu
problema moµze ne dati odgovor sa vjerovatno´com 0 " < 1. Ako algoritam daje odgovor
onda je taj odgovor uvijek korektan.

Algoritmi i programiranje, V.2 139 A.G. 2018/2019, Radni materijal


11.2 Problemi prepoznavanja jezika µ
11 NP SLOZENOST

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 on
jednostavno iznova pokreće ponovo dok se ne dobije odgovor. Vjerovatnoća da algoritam
ne pruµzi odgovor za m pokušaja puta je "m . Da bi algoritam bio u stanju dati odgovor
broj pokretanja je prosjeµcno 1= (1 ").

11.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 G (odnosno matrica kodirana
kao 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 u
obliku niza (string) bitova. Ako mu se prezentira string (G; k) algoritam bi trebao dati
odgovor "Da" ako (G; k) 2 L što povlaµci da G posjeduje razapinjuće stablo teµzine najviše
k i "Ne" u suprotnom sluµcaju. U prvom sluµcaju se kaµze da algoritam "prihvata" a u
suprotnom "odbacuje" ulaz.

Za bilo koji dati jezik se moµze postaviti pitanje koliko teško je utvrditi da li je dati
string u jeziku ili ne. Naprimjer, u sluµcaju MST jezika L µclanstvo se moµze lako utvrditi
u polinomijalnom vremenu. Dovoljno je graf pohraniti interno, pokrenuti Kruskalov
algoritam i vidjeti da li je dobijena optimalna teµzina najviše k ili ne.

De…nicija 11.8 (Formalna de…nicija klase NP). Ako je U skup svih mogu´cih ulaznih
vrijednosti za neki problem odluµcivanja (za koji je potrebno dati odgovor da ili ne) i
L P skup svih ulaznih vrijednosti za koje je odgovor na problem potvrdan, onda L
zovemo jezik koji odgovara problemu.

De…nicija 11.9 Neka je sa P oznaµcen skup svih jezika za koje µclanstvo moµze biti testi-
rano u polinomijalnom vremenu.

Potrebno je primijetiti da su jezici skupovi stringova a P je skup jezika. P je de…nisan


u 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 klasa
sloµzenosti. S obzirom da se minimalno razapinjuće stablo moµze pronaći u polinomijalnom
vremenu vrijedi da je L 2 P .

Postoji i teµzi jezik:

M = f(G; k) : G ima jednostavnu putanju teµzine barem kg

Kako se za dati graf G i cijeli broj k moµze prepoznati da li je on u jeziku M ? Moµze se


pokuš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†e
moµze se potrošiti puno vremena u pretraµzivanju pa se ne moµze dati pravi odgovor.

Algoritmi i programiranje, V.2 140 A.G. 2018/2019, Radni materijal


11.2 Problemi prepoznavanja jezika µ
11 NP SLOZENOST

Prvi korak je da se de…nišu razne klase sloµzenosti odluµcivanja. Klasa sloµzenosti P je


skup problema odluµcivanja za koje postoji polinomijalni algoritam. U suštini, to je skup
svih problema odluµcivanja koji mogu biti riješeni u polinomijalnom vremenu. Obiµcno se
nazivaju "jednostavni" ili "e…kasno rješivi".
De…nicija 11.10 Klasa sloµzenosti N P se sastoji od svih problema odluµcivanja za koje
se odgovor DA moµze provjeriti u polinomijalnom vremenu korištenjem neke dodatne in-
formacija zv. certi…kata. Klasa sloµzenost co N P se de…niše analogno za odgovor NE.
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 jednostavnih
problema ali sadrµzi i veliki broj problema za koje se vjeruje da ih je teško riješiti. Oznaka
ne znaµci "NePolinomijalni". Izvorno je ovo oznaka za "Nedeterministiµcko Polinomijalno
vrijeme". Ovaj koncept je mnogo lakše objasniti i shvatiti iz perspektive veri…kacije.
De…nicija 11.11 Klasa sloµzenosti N P tezak (NP-hard) se sastoji od problema za koje
vrijedi da ako se jedan od njih moµze riješiti u polinomijalnom vremenu tada bi svi NP
problemi bili 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µzak
to ne mora znaµciti da je u NP klasi. S obzirom da se vjeruje da nisu svi NP problemi
rješivi u polinomijalnom vremenu vjeruje se da nijedan NP-teµzak problem nije rješiv u
polinomijalnom vremenu.
De…nicija 11.12 Problem je N P kompletan ako je (1) NP, (2) NP-teµzak.
To znaµci da je N P C = N P \ N P tezak.
De…nicija 11.13 Strogo NP-kompletan problem je NP-kompletan problem koji ostaje
takav kada 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 je uobiµcajeni
dio instalacije Windows operativnog sistema, sa brojnim varijacijama. Igraµc ove igre ne
treba poga†ati da li je kvadrat sigurno slobodan. Sliµcno, igraµc markira svaku minu koja
µ
sigurno moµze biti identi…cirana. Cinjenica da je Minesweeper NP-kompletan problem
znaµci da je veoma teško pogoditi kada je moguće sigurno oµcistiti neki kvadrat uz potpuno
znanje o tome. Drugim rijeµcima, potreban je odre†eni stepen poga†anja. U suštini, ako
je i unaprijed reµceno da poga†anje nije potrebno jošuvijek moµze biti teško odluµciti kada
je kvadrat prazan ili zauzet.

Algoritmi i programiranje, V.2 141 A.G. 2018/2019, Radni materijal


11.3 Veri…kacija polinomijalnog vremena i certi…kati µ
11 NP SLOZENOST

Slika ilustruje jedan od mogućih naµcina interpretacije kako bi mogao izgledati odnos
skupova P, NP, NP-teµzak, NP-kompletan. Naglašeno je "mogući odnos" jer jošnije poz-
nato da li su ove klase sloµzenosti disjunktne ili su sve rješive u polinomijalnom vremenu.
Neki od problema na slici iziskuju dublju diskusiju. Jedna od njih se odnosi na Izomor-
…zam grafova u kojem se postavlja pitanje da li su dva grafa identiµcna do nivoa imena
njihovih ivica. Poznato je da je problem NP ali nije poznato da li je u P. Drugi je QBF što
je skraćenica za Quanti…ed Boolean Formulas. U tom problemu su date bulovske formule
sa kvanti…katorima 8 i 9 i potrebno je dati odgovor na pitanje da li je formula taµcna ili
ne.

11.3 Veri…kacija polinomijalnog vremena i certi…kati


Vaµzno je dati napomene o algoritmima veri…kacije. Mnogi problemi prepoznavanja jezika
su teški za rješavanje ali imaju svojstvo da je lako veri…kovati da li je string jezik.

Kao primjer će biti uzet problem Hamiltonovog ciklusa. Za dati neusmjereni graf G se
postavlja pitanje da li postoji ciklus koji obilazi sve µcvorove taµcno jednom. Ovaj problem
se moµze opisati kao problem prepoznavanja jezika

HC = f(G) : G ima Hamiltonov ciklusg

µ
gdje je sa (G) oznaµcava graf kao string. Cini se da je problem Hamiltonovog ciklusa
mnogo teµ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 od
pretpostavke da je graf imao Hamiltonov ciklus tada bi trebao biti jednostavan zadatak
da se to potvrdi. Ako se uzme ciklus npr. hv3 ; v7 ; :::; v13 i tada bi se graf mogao ispitati
i 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 postoji
veoma e…kasan naµcin veri…kacije (provjere) da li je dati graf u HC. Dati ciklus je certi…kat.
To je dio informacije koji omogućava 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 i


dato y, koje se naziva certi…kat, moµze veri…cirati da je x u jeziku L koristeći taj certi…kat
kao pomoć. 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 su
dati sljedeći jezici :

Algoritmi i programiranje, V.2 142 A.G. 2018/2019, Radni materijal


11.3 Veri…kacija polinomijalnog vremena i certi…kati µ
11 NP SLOZENOST

U HC = f(G) : G ima jedinstveni Hamiltonov ciklusg


HC = f(G) : G nema Hamiltonov ciklusg

Neka je graf G u jeziku U HC. Koja bi informacija trebala biti data koja bi omogućila
da se veri…kuje da je G stvarno jezik ? Moµze se dati primjer jedinstvenog Hamiltonovog
ciklusa i to bi se moglo veri…cirati ali koja vrsta certi…kata je potrebna kako bi se utvrdilo
da je to jedini graf ? Moµze se uzeti drugi ciklus koji nije Hamiltonov ali to ne znaµci da
nema drugog ciklusa koji jeste Hamiltonov. Moµze se pokušati sa svim ciklusima teµzine n
ali bi to uopšte ne bi bilo e…kasno jer postoji ukupno n! ciklusa. Stoga je teško zamisliti
da se moµze dati informacija koja bi omogućila da se e…kasno uvjerimo da je dati graf u
jeziku.

11.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 naziv
je skraćenica od "Nedeterministiµcko Polinomijalno vrijeme". Ovo se odnosi na program
koji se izvršava na nedeterministiµckom raµcunaru koji se moµze zamisliti. U osnovi, takav
kompjuter bi mogao nedeterministiµcki pogoditi vrijednost certi…kata i zatim veri…cirati
u 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 sloµzenosti (sloµzenost veri-
…kacije). Potrebno je uoµciti da je P N P . Drugim rijeµcima, ako se problem moµze riješiti
u polinomijalnom vremenu tada se µclanstvo sigurno moµze veri…cirati u polinomijalnom
vremenu.

Nije poznato da li je P = N P . Ne µcini se razumnim da ovo vrijedi. Drugim rijeµcima, biti


u mogućnosti da se veri…kuje da se ima ispravno rješenje ne pomaµze mnogo u nalaµzenju
stvarnog rješenja. Mnogi eksperti vjeruju da je P 6= N P ali to niko nije dokazao.

Na tabeli je lista NP i odgovarajućih P problema. Na desnoj strani su problemi koji


mogu biti e…kasno riješeni. Na lijevoj strani je skup "tvrdih oraha" koji već decenijama
odolijevaju naporima za njihovo e…kasno rješenje.

Algoritmi i programiranje, V.2 143 A.G. 2018/2019, Radni materijal


11.3 Veri…kacija polinomijalnog vremena i certi…kati µ
11 NP SLOZENOST

Klasa NP kompletnih problema se sastoji od skupa problema odluµcivanja (jezika) za koje


niko ne zna. Ako bi bilo poznato rješenje u polinomijalnom vremenu makar ijednog NP
kompletnog problema tada bi svaki NP problem bio rješiv u polinomijalnom vremenu.
Za ovo je potrebno uvesti koncept redukcije.

Prije toga je potrebno razmotriti sljedeće pitanje. Pretpostavimo da postoje dva problema
H i U . Za H se zna (ili µcvrsto vjeruje) da je teµzak odnosno da ne moµze biti riješen u
polinomijalnom vremenu. Sa druge strane, sloµzenost za U je nede…nisana ali se sumnja
µ se dokazati da U ne moµze biti riješen u polinomijalnom vremenu.
da je jako teµzak. Zeli
µ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 da U nije rješiv u polinomijalnom vremenu pret-


postavlja se da postoji algoritam kojim se U rješava u polinomijalnom vremenu pa se
izvodi kontradikcija kojom se pokazuje da H moµze biti riješen u polinomijalnom vre-
menu.

Neka je data podrutina koja moµze riješiti bilo koju instancu problema U u polinomijalnom
vremenu. Sve što je nuµzno u tom sluµcaju je pokazati da se ta rutina moµze koristiti da
se problem H moµze riješti u polinomijalnom vremenu. Time je problem H reduciran na
problem 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 se
dokaz svodi na to da takva rutina ne moµze postojati što povlaµci da U ne moµze biti riješen
u polinomijalnom vremenu. Ovo je veoma vaµzno sa stanovišta razumijevanja pojma i
koncepta redukcije.

11.3.2 Problem tri boje


Naredni problem je dobro poznat kao NP kompletan pa se µcvrsto vjeruje da ne moµze biti
riješen u polinomijalnom vremenu.

Problem tri boje : Da li svaki µcvor datog grafa G moµze biti oznaµcen jednom od tri
razliµ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 particioniranja
pri µ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 koje
imaju zajedniµcku granicu bi trebale na mapi biti obojene sa dvije razliµcite boje. Dobro je
poznato da grafovi u ravni mogu biti obojene sa µcetiri boje i za ovakav problem postoji
algoritam polinomijalnog vremena. Cini µ se da je utvr†ivanje da li je to moguće za tri
boje, µcak i za grafove u ravni, teµzak problem za koji nije poznat algoritam polinomijalnog
vremena.

Algoritmi i programiranje, V.2 144 A.G. 2018/2019, Radni materijal


11.3 Veri…kacija polinomijalnog vremena i certi…kati µ
11 NP SLOZENOST

Na slici su dva grafa od kojih je jedan moguće obojiti na traµzeni naµcin a drugi ne.
Problem bojenja sa tri boje ima ulogu H problema za koji se sumnja da je moguće
riješiti u polinomijalnom vremenu.

Neka je U sljedeći problem. Za dati graf G = (V ; E) se kaµze da podskup µcvorova V 0 V


formira clique ako za svaki par µcvorova u; v 2 V 0 (u; v) vrijedi da je u; v 2 E. To znaµci
da je podgraf induciran sa V 0 kompletan graf.

11.3.3 Clique pokrivaµc (cover) (CCov)


Za dati graf G = (V ; E)[i cijeli broj k skup µcvorova se moµze podijeliti u podskupove
V1 ; V2 ; :::; Vk takve da je Vi = V i da je svaki Vi clique od G.
i

Problem Clique pokrivaµca se javlja u aplikacijama klasteringa2 . Ivica izme†u dva µcvora
µ se znati da li
se stavlja ako su oni dovoljno sliµcni da budu klasterisani u istu grupu. Zeli
je moguće klasterisati sve µcvorove u k grupa.

Pretpostavimo da se µzeli riješiti CCov problem ali nakon uzaludnih i besplodnih napora ne
moµze se naći algoritam polinomijalnog vremena. Kako se moµze dokazati da nije izvjesno
da CCov nema rješenje u polinomijalnom vremenu ? Poznato je da je 3Col NP kompletan
problem pa struµcnjaci vjeruju da 3Col 2 = P . Osjeća se da postoji neka veza izme†u ova
µ se dati odgovor na pitanje da li vrijedi:
dva problema. Zeli

(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 vraća odgovor "istina" ako G ima clique veliµcine
k 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 zvati
rutinu CCov (G; k) za bilo koji graf i bilo koji cijeli k.
2
Klastering je grupisanje po nekoj osobini sliµcnosti. Pritom se "sliµcnost" de…niše u kontekstu problema
(Euklidska duµzina, prosjek, ...)

Algoritmi i programiranje, V.2 145 A.G. 2018/2019, Radni materijal


11.3 Veri…kacija polinomijalnog vremena i certi…kati µ
11 NP SLOZENOST

Oba problema ukljuµcuju particioniranje µcvorova u grupe. Jedina razlika je što je u jednom
problemu 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 gotovo
jednaki ali zahtjev da budu susjedni je obratan.

Tvrdimo da se problem tri boje moµze reducirati na problem klika na sljedeći naµcin. Za
dati graf G za koji se µzeli utvrditi mogućnost 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 11.1 Graf G je mogu´ce obojiti sa tri boje ako i samo ako komplement G ima
pokrivanje klikom veliµcine 3. Drugim rijeµcima
G 2 3Col , G; 3 2 CCov

Dokaz: ()) Ako je G moguće obojiti sa 3 boje neka su V1 ; V2 ; V3 tri klase za svaku od
boja. 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 . Za
i 2 f1; 2; 3g se daje µcvorovima u Vi boja i. Smatra se da je to legalno bojenje za G s
obzirom da ako su razliµciti µcvorovi u i v u Vi tada slijedi da je fu; vg 2 E (G) s obzirom
da su zajedniµckom kliku. Ovo povlaµci da fu; vg 2 = E G . Stoga dva µcvora iste boje nisu
susjedna.

11.3.4 Redukcija na polinomijalno vrijeme


Sada se ova intuicija prenosi na redukciju jednog problema na drugi putem korištenja
poziva rutine kroz veći stepen formalizacije. U navedenom primjeru je izvršena konverzija
instance problema tri boje na ekvivalentnu instancu problema pokrivaµca (G; 3).

De…nicija 11.14 Kaµze se da je jezik (odnosno problem odluµcivanja) L1 reducibilan na


jezik L2 sa polinomijalnim vremenom, u oznaci L1 P L2 , ako postoji raµcunarska funkcija
f koja radi u polinomijalnom vremenu takva da vrijedi:
(8x) (x 2 L1 , f (x) 2 L2 )

Algoritmi i programiranje, V.2 146 A.G. 2018/2019, Radni materijal


11.4 NP kompletnost µ
11 NP SLOZENOST

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 odgovarajućoj matrici). Stoga je f izraµcunljiva u polinomijalnom
vremenu.

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 polinomijalnom
vremenu 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 nije
teµzi od L2 .

Naµcin na koji se ovo koristi NP kompletnost je taµcno obrnut. Obiµcno postoji jak dokaz
da L1 nije rješiv u polinomijalnom vremenu pa je redukcija efektivno ekvivalentna kao
da se kaµze "S obzirom da za L1 nije izvjesno da je rješiv u polinomijalnom vremenu tada
ni za L2 nije izvjesno da je rješiv u polinomijalnom vremenu". Stoga je ovo naµcin kako
redukcije polinomijalnog vremena mogu biti korištene da se pokaµze da su problemi teški
onoliko koliko su teški poznati problemi.

Lema 11.1 Ako L1 P L2 i L2 2 P tada L1 2 P .

Lema 11.2 Ako L1 P L2 i L 2 2


= P tada L1 2
= P.

Vaµzna µcinjenica po osnovu reducibilnosti je tranzitivnost. Drugim rijeµcima:

Lema 11.3 Ako L1 P L2 i L 2 P L3 tada L1 P L3 .

Razlog je u tome što ako su dvije funkcije f (x) i g (x) izraµcunljive u polinomijalnom
vremenu 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 voditi
raµcuna o tome.

11.4 NP kompletnost
Skup NP kompletnih problema su svi problemi u klasi sloµzenosti NP za koje je poznato
da ako je jedan rješiv u polinomijalnom vremenu tada to vrijedi za sve njih i obratno, ako
jedan od njih nije rješiv u polinomijalnom vremenu tada nijedan od njih nije rješiv na
taj naµcin. Ovo se matematiµcki formalizuje korištenjem oznaka redukcija polinomijalnog
vremena.

De…nicija 11.15 Jezik L je NP-teµzak ako:

L0 P L; 8L0 2 N P

Ovdje L ne mora biti u NP.

De…nicija 11.16 Jezik L je NP-kompletan ako:

L 2 NP

L je NP-teµzak

Algoritmi i programiranje, V.2 147 A.G. 2018/2019, Radni materijal


11.4 NP kompletnost µ
11 NP SLOZENOST

Da bi se pokazalo da je problem NP kompletan alternativa je, kao obiµcno lakši put,


korištenje tranzitivnosti.

Lema 11.4 L je NP kompletan ako:

L 2 NP

L0 2 pL za neki poznati NP kompletan jezik L0

µ
Cinjenica da su svi L00 2 N P reducibilni na L0 (s obzirom da je L0 NP kompletan pa time
i 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 je


jedan problem NP kompletan. Naµzalost, µcini se da je gotovo nemoguće dokazati da je
jedan problem NP kompletan s obzirom da de…nicija kaµze da moramo biti u mogućnosti
svaki problem u NP reducirati na taj problem. Postoji beskonaµcno takvih problema pa
je teško vjerovati u tako nešto. Cook je pokazao da postoji problem pod nazivom SAT
(skraćenica za Satis…ability) da je NP kompletan. Da bi pokazali da je drugi problem NP
kompletan sve što trebamo je pokazati da je našproblem NP (a samim tim i reducibilan
na SAT) a zatim pokazati da SAT (ili generalno neki poznat NPC problem) moµzemo
reducirati na naš problem. Slijedi da je naš problem ekvivalentan sa SAT pod uslovom
da se poštuje rješivost u polinomijalnom vremenu.

Ovo je ilustrovano na priloµzenoj slici. Oµcito je da vrijedi P N P i P co N P . Pitanje


je da li je P = N P . Ovo se smatra jednim od najvaµznijih matematiµckih problema i spada
u sedam tzv. Millenium Prize Problems. Većina eksperata smatra da je odgovor NE ali
to nije i dokazano.

De…nicija 11.17 Neka su L1 i L2 dva problema odluke. Kaµzemo da se L1 moµze reducirati


u polinomijalnom vremenu na L2 , u oznaci L1 pL2 ako postoji polinomijalni algoritam
za rješavanje L1 koji kao potrpogram koristi algoritam za rješavanje problema L2 pri µcemu
je broj poziva tog programa tako†er polinomijalan.

Drugim rijeµcima, ako je L1 pL2 tada L1 nije bitno teµzi od L2 .

Algoritmi i programiranje, V.2 148 A.G. 2018/2019, Radni materijal


11.4 NP kompletnost µ
11 NP SLOZENOST

De…nicija 11.18 Problem odluke L je NP-potpun ako je L 2 N P i L1 pL za svaki


L1 2 N P . Klasa svih N P potpunih problema se oznaµcava sa N P C.

N P potpuni problemi su najteµzi problemi u klasi N P . Postojanje polinomijalnog algo-


ritma za bilo koji od N P potpunih problema bi povlaµcilo da vrijedi P = N P . Kako
se vjeruje da ova jednakost ne vrijedi to je i postojanje ovakvog algoritma je jako malo
vjerovatno.

Algoritmi i programiranje, V.2 149 A.G. 2018/2019, Radni materijal


12 ZADACI MJEŠOVITOG TIPA

12 Zadaci mješovitog tipa


12.1 Uvod
U nastavku je jedan broj zadataka mješovitog tipa, u cilju vjeµzbi i samostalnog rada.
Ako se formulacijom traµzi da se na†e zbir ili izraµcuna neka vrijednost podrazumijeva se
potreba da se saµcini algoritam za rješavanje tog problema. Zadaci nisu sistematizirani po
temama ili po drugom kriteriju niti su vezani za programiranje u bilo kojem programskom
jeziku.

Rješenje svakog zadatka treba imati sljedeće elemente : Matematiµcka ili logiµcka analiza
problema, Dijagram toka, Pseudokod, Procjenu sloµzenosti algoritma, Program u odabra-
nom programskom jeziku ili programskom paketu.

12.2 Zadaci
Zad. 12.1 Na šahovsku tablu n n postaviti n 15 dama na naµcin da nikoje dvije nisu
u istom redu ili dijagonali. Napraviti algoritam koji generiše sve kombinacije poloµzaja n
dama.

Zad. 12.2 Dato je 50 brojeva koji odre†uju 25 intervala na brojnoj osi. Dati odgovore
na sljede´ca pitanja:

Da li postoje taµcke koje su zajedniµcke za sve intervale


Da li je unija datih intervala opet interval

Primarno praviti algoritam pod taµckom 1. Pokušati napraviti verziju jedinstvenog algo-
ritma kojim se rješavaju obje taµcke.

Zad. 12.3 Dato je 10 tegova teµzina a1 ; a2 ; :::; a10 . Neka je ck broj naµcina na koji se moµze
sastaviti teµzina k tj. sva rješenja jednadµzbe:
a1 x1 + a2 x2 + ::: + a10 x10 = k
gdje je xi 2 f0; 1g, i = 1; :::; 10. Generisati sve ck za dato k.

Zad. 12.4 Date su novµcanice nominalne vrijednosti 10, 20, 50 i 100 NJ. Kako isplatiti
iznos od n NJ ako se svaki apoen moµze javiti najviše k puta i ako je m najve´ci ukupan broj
svih apoena. Problem je nastao iz potrebe da se na novµcanim automatima odredi koncept
izdavanja novµcanica kojim se osigurava ravnomjerno trošenje apoena svih, pri µcemu je
mogu´ce isplatiti bilo koji cjelobrojni iznos. U cilju lakšeg rješavanja, najprije postaviti
neku …ksnu granicu, npr. 500 i na tom sluµcaju dedukcijom odrediti generalni koncept.
Poµcetna varijanta problema je da se odabere jedan broj apoena (npr. 1; 2; 5) i na manjem
broju sluµcajeva razradi koncept rješenja. Zadatak se moµze proširiti tako da se u obzir
uzimaju apoeni od 1, 2 i 5 NJ.

Zad. 12.5 Dati su prirodan broj n i realan broj x. Me†u brojevima:


exp cos x2k sin x3k ; k = 1; :::; n
na´ci broj najbliµzi nekom cijelom broju. Pritom treba koristiti standardni set matematiµckih
funkcija za koje se oµcekuje da podrµzava bilo koji programski jezik.

Algoritmi i programiranje, V.2 150 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.6 Metodom polovljenja intervala riješti jednadµzbe :

x + ln (x + 0:5) 0:5 = 0; x 2 [0; 2]

x4 + 0:8 x3 0:4 x2 1:4 x 1:2 = 0; x 2 [ 1:2; 0:5]

x3 0:2 x2 0:2 x 1:2 = 0; x 2 [1; 1:5]

Taµcnost " se zadaje unaprijed. Metoda polovljenja intervala se sastoji u tome da se ispita
vrijednost funkcije u krajnjim taµckama intervala; ako su znaci funkcije u tim taµckama
razliµciti uzima se sredina intervala; rad se nastavlja na onoj polovini intervala za koju
vrijedi da su znaci funkcije u krajevima razliµciti.

Zad. 12.7 Dat je polinom Pn (x) stepena n. Generisati P 0 (x) i izraµcunati vrijednosti
P 0 (1), P 0 (2), P 0 (3).

Zad. 12.8 Dat je polinom Pn (x) stepena n. Generisati polinom P (x + 1) P (x). Koji
je stepen te razlike ?

Zad. 12.9 Dat je polinom P (x) stepena n. Na´ci izvod reda k ovog polinoma. Nuµzno je
teorijski razraditi izgled k-tog izvoda polinoma stepena n.

Zad. 12.10 Napraviti algoritam za generisanje niza fri g, i = 1; :::; n, sluµcajnih brojeva
na sljede´ci naµcin : zadaju se brojevi a, c, s0 i m od kojih je m najve´ci; generišu se nizovi
brojeva fsi g i fri g na sljede´ci naµcin :

sk je ostatak dijeljenja a sk 1 + c sa m:a sk 1 +c sk (mod m)


sk + 1
rk =
m+1
Brojevi generisani na ovaj ili drugi sliµcan naµcin zovu se pseudosluµcajni brojevi.

Zad. 12.11 Dati su prirodni broj n, realni brojevi a, h, b, fdk g, k = 1; ; n. Napraviti


algoritam za raµcunanje sume:
!
X n Y1
k
S= dk (b a ih)
k=0 i=1

Zad. 12.12 Dati su prirodan broj n i realni brojevi a, b, c, d i q (c < d). Neka je:

x0 = a; x k = q xk 1 + b; k = 1; 2; :::

Dati odgovor na pitanje da li je xn 2 [c; d].

Zad. 12.13 Dati su realni brojevi a, b i c.

Da li postoji trougao sa stranama a, b i c ?

Ako postoji da li je oštrougli ili tupougli ?

Zad. 12.14 Dati su realni pozitivni brojevi a; b; c; d. Utvrditi da li je mogu´ce napraviti


µcetvorougao sa stranama µcije su duµzine izraµzene ovim brojevima.

Algoritmi i programiranje, V.2 151 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.15 Data su dva niza fai g, i = 0; ; m 1 i fbj g, j = 0; ; n 1. Clanovi µ ovih


nizova su jednocifreni brojevi 0; 1; :::; 9. Na taj naµcin niz fai g predstavlja m-tocifreni broj
a = am 1 am 2 :::a1 a0 a fbj g predstavlja n-tocifreni broj b = bn 1 bn 2 :::b1 b0 . Indeks µclana
odgovara ’"teµzini" pozicije cifre. Napraviti algoritam koji generiše novi niz fck g µciji su
µclanovi cifre a) sume; b) razlike; c) proizvoda ’brojeva’a i b.
Zad. 12.16 Dati su realni brojevi a, b, c, d. Napraviti algoritam koji daje odgovor na
pitanje : da li se pravougaonik sa stranama a i b moµze smjestiti unutar pravougaonika sa
stranama c i d ako strane pravougaonika: a) jesu paralelne; b) nisu paralelne ?
Zad. 12.17 Napraviti algoritam kojim se za dati prirodni broj n raµcuna suma:
X
n
k!
S=
1 1 1
k=1 + + ::: +
2 3 k+1
Zad. 12.18 Za date realne brojeve a; b (b > a) i prirodni broj n izraµcunati:
S = (f1 + f2 + ::: + fn ) h
1
a+ i h
b a 2
h = ; fi = 2; i = 1; 2; :::; n
n 1
1+ a+ i h
2
Zad. 12.19 Za date realne brojeve x; a i " (jxj < 1) sa taµcnoš́cu " izraµcunati sumu:
X
1
a (a 1) ::: (a k + 1)
S =1+ xk
k=1
k!

Napraviti matematiµcku analizu problema.


Zad. 12.20 Dato je 6 parova brojeva koji odre†uju koordinate dva trougla u ravni. Odred-
iti da li je jedan trougao sadrµzan u drugom. Ako jeste odrediti površinu unutar ve´ceg a
van manjeg trougla. Prvo treba napraviti funkciju koja daje odgovor na pitanje : da li je
taµcka unutar trougla koji odre†uju tri zadatke taµcke. Za ovo se moµze iskoristiti formula za
površinu trougla koji je zadat koordinatama svojih vrhova. Algoritam treba voditi raµcuna
o tome da li su date taµcke kolinearne.
Zad. 12.21 Sumu:
1 1 1 1
1 + ::: +
2 3 9999 10000
izraµcunati na sljede´ca µcetiri naµcina:
slijeva udesno µclan po µclan
slijeva udesno tako da se najprije izraµcuna suma neparnih µclanova:
1 1 1
1+ + + ::: +
3 5 9999
zatim suma parnih µclanova:
1 1 1 1 1
+ + + ::: + +
2 4 6 9998 10000
a zatim napravi razlika te dvije sume.

Algoritmi i programiranje, V.2 152 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

zdesna na lijevo µclan po µclan


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

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

Zad. 12.22 Data su 4 para brojeva (x1 ; y1 ), (x2 ; y2 ), (x3 ; y3 ), (x4 ; y4 ). Prva dva para
odre†uju gornje lijevo i donje desno tjeme prvog pravougaonika a druga dva para iste
elemente drugog pravougaonika. Dati odgovor na pitanje : Da li je jedan od pravougaonika
sadrµzan u drugome ? Ako jeste odrediti površinu izme†u dva pravougaonika. Ako se sijeku
odrediti površinu presjeka. Smatra se da su strane pravougaonika paralelne koordinatnim
osama.

Zad. 12.23 Dato je n parova taµcaka (xi ; yi ), i = 1; ; n. Dati odgovor na pitanje : Da


li me†u tih n taµcaka postoje 4 koje su tjemena kvadrata. Ako postoji koje su to taµcke
? Potrebno je ustanoviti kriterij kada µcetiri taµcke zadate koordinatama µcine tjemena
kvadrata. Nakon toga se razra†uje koncept pretraµzivanja.

Zad. 12.24 Izraµcunati, sa datim nivoom taµcnosti " > 0, beskonaµcnu sumu:
X
1
( 1)i+1
i=1
i (i + 1) (i + 2)

Zad. 12.25 Element matrice je ’sjedlasta taµcka’ ako je najve´ci u vrsti i najmanji u
koloni. Za datu matricu m n odrediti sve sjedlaste taµcke. Rezultat trebaju biti indeksi i
vrijednosti sjedlastih taµcaka. Ovaj postupak je vaµzan dio nekih metoda teorije igara.

Zad. 12.26 Napraviti algoritam koji ´ce tabelirati vrijednost polinoma:

Pn (x) = a0 + a1 x + ::: + an 1 xn 1
+ an x n

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

Zad. 12.27 Dati su brojevi fxk g, k = 1; 2; :::; 3n, n 2 N. Niz fxk g odre†uje n kvadrata
u ravni za koje su (x3k 2 ; x3k 1 ) koordinate središta a x3k duµzina stranice. Dati odgovor
na pitanje: da li postoje taµcke koje pripadaju svim kvadratima ?

Zad. 12.28 Dat je realan broj a. Na´ci:

Prvi od brojeva:
1 1 1
1; 1 + ; 1 + + ; :::
2 2 3
koji je ve´ci od a.
Najmanje n za koje vrijedi da je:
1 1 1
1+ + + ::: + > a
2 3 n
Zad. 12.29 Dat je prirodan broj n. Napraviti algoritam koji raµcuna sumu:
Xn
( 1)k(k 1)=2
S=
k=1
k!

Algoritmi i programiranje, V.2 153 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.30 Dati su prirodan broj n i realni broj x. Izraµcunati sumu :

S = sin x + sin (x2 ) + sin (x3 ) + ::: + sin (xn )

S = sin x + sin2 x + sin3 x + ::: + sinn x

S = sin x + sin (sin x) + ::: + sin (sin (::: sin x))

(u posljednjem µclanu funkcija sin se primjenjuje n puta).

Zad. 12.31 Dat je prirodan broj n. Ako je paran podijelimo ga sa 2; ako je neparan
pomnoµzimo ga sa 3 i dodamo 1. Postupak se zaustavlja ako se dobije 1. Provjeriti da
li se opisani postupak završava za m koraka, gdje je m unaprijed zadati prirodan broj.
Problem je poznat kao Collatz-ova konjuktura. Nije poznato da li se postupak završava za
proizvoljno n 2 N. U zadatku se traµzi odgovor na pitanje : da li je broj 1 dostignut nakon
m koraka ?

Zad. 12.32 Dati su realni brojevi a; b; " (a > b > 0, " > 0). Nizovi x1 ; x2 ; ::: i y1 ; y2 ; :::
su formirani po pravilu:

x1 = a; y1 = b
1 p
xk = (xk 1 + yk 1 ) ; yk = xk 1 yk 1
2
Na´ci prvo xn takvo da je jxn yn j < ".

Zad. 12.33 Dat je prirodni broj n i parovi realnih brojeva ( i ; li ), i = 1; :::; n, koji pred-
stavljaju ugao i duµzinu linija, pri µcemu je kraj linije lk ujedno poµcetak linije lk+1 . Na´ci
koordinate kraja izlomljene linije l1 ; :::; ln . Poµcetak linije moµze biti u: a) koordinatnom
poµcetku; b) odabanoj taµcki (x0 ; y0 )

Zad. 12.34 Za zadati prirodan broj n dati odgovor na pitanje : Da li se n! moµze napisati
kao proizvod 3 uzastopna broja ? Primjer takvog broja je 5! = 4 5 6. U ovom zadatku
je veoma vaµzno odrediti granice za pretraµzivanje u cilju smanjenja vremena rada. Osim
toga, potrebno je koristiti svojstva koja ima proizvod tri uzastopna broja. Algoritam bi
trebao dati kao izlaz brojeve koji zadovoljavaju ovaj uslov. S obzirom na brz rast funkcije
n! mogu´ce je postaviti najve´ci broj za koji se µzeli rezultat.

Zad. 12.35 U ravni je zadato n taµcaka pomo´cu matrice [xij ]n 2 tako da su xi1 i xi2
koordinate taµcke Ti . Taµcke su sastavljene duµzima. Napraviti algoritam koji nalazi duµzinu
najduµze duµzi. Potrebno je, primarno, saµciniti koncept pretraµzivanja kojim se osigurava
da su ispitane sve mogu´ce duµzi. Na svakom koraku na kojem se na†e duµz koja je duµza od
prethodno najduµze pamte se koordinate i dobijena duµzina.

Zad. 12.36 Data je cjelobrojna matrica A = [aij ] formata m n. Generisati matricu


B = [bij ] od nula i jedinica gdje je bij = 1 u sljede´cim sluµcajevima:

svi susjedi elemenata aij su manji od aij

me†u susjedima elemenata aij su bar dva jednaka sa aij

Zadatak se posebno rješava za oba sluµcaja. Obratiti paµznju na "rubne" elemente matrice.

Algoritmi i programiranje, V.2 154 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.37 Data je realna matrica reda 9. Izraµcunati sumu elemenata glavne dijagonale
i elemenata iznad nje koji su ve´ci od svih elemenata ispod dijagonale. Zadatak se moµze
generalizirati za matricu proizvoljnog reda n, a rješava se u dvije etape.
Zad. 12.38 Dati su prirodni brojevi m i n. Izraµcunati:
m! + n!
K=
(m + n)!
Algoritam treba biti primjenljiv za svaku od pretpostavki m < n, m = n ili m > n.
Zad. 12.39 Na´ci sumu kvadrata elemenata matrice A = [aij ]10 10 za koje vaµzi:
ai + ai;j
+ ai+1;j + ai;j+1
1;j 1
aij
4
Zadatak je mogu´ce generalizirati za matricu proizvoljnih dimenzija m n. Obratiti paµznju
na "rubove" matrice.
Zad. 12.40 Na´ci prirodni broj n (1 n 1000) sa najve´cim zbirom svojih djelilaca.
Primarni zadatak je napraviti postupak odre†ivanja svih djelilaca broja n. Potrebno je
odgovoriti na dodatno pitanje : da li i na koji naµcin izmjena gornje granice (1000) ima
ili moµze imati uticaj na duµzinu odnosno sloµzenost algoritma.
Zad. 12.41 Dat je prirodan broj n. Izraµcunati:
1 1 1
S= 1+ 1+ ::: 1 +
12 22 n2
r q
p
S = 2 + 2 + ::: + 2
| {z }
n korijena

cos 1 cos 1 + cos 2 cos 1 + cos 2 + cos 3 cos 1 + cos 2 + ::: + cos n
S= + + + ::: +
sin 1 sin 1 + sin 2 sin 1 + sin 2 + sin 3 sin 1 + sin 2 + ::: + sin n
v s
u r
u q p
t
S = 3 + 6 + 9 + ::: + 3 (n 1) + 3n

Zad. 12.42 Dat je realni broj x. Izraµcunati:


(x 2) (x 4) ::: (x 64)
R=
(x 1) (x 3) ::: (x 63)
Zad. 12.43 Dat je realan broj a i prirodni broj n. Izraµcunati:
E = an
P = a (a + 1) (a + 2) ::: (a + n 1)
1 1 1
S= + + ::: +
a a (a + 1) a (a + 1) ::: (a + n)
1 1 1 1
S= + 2 + 4 + ::: + 2n
a a a a
P = a (a n) (a 2n) ::: (a n2 )
Zad. 12.44 Za dati prirodni broj n izraµcunati:

Algoritmi i programiranje, V.2 155 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

X
n
1 X
n
1 Xn
( 1)k+1
S= S= S=
k=1
k k=1
(1 + 2k)2 k=1
(k + 1) k

Xn
1 X
n
( 1)k Xn
( 1)k (k + 1)
S= S= S=
k=1
k5 k=1
(2k + 1) k k=1
k!

Zad. 12.45 Dati su pozitivni realni brojevi x; a; ". Na´ci prvi n za koji vrijedi nejednakost
yi2 yi2 1 < " u nizu y1 ; y2 ; ::: koji je formiran po pravilu:

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

Zad. 12.46 Za dati realni broj a na´ci prvi µclan xn za koji vrijedi (5a=4) jxn+1 xn j <
10 6 . Za dobijenu vrijednost xn na´ci razliku a x5n ako je niz formiran na sljede´ci naµcin:
8
>
> min f2a; 0:95g a 1
< a 4 a
x0 = 1 < a < 25 ; x n = xn 1 + 4 ; n = 1; 2; :::
> 5
a 5 5xn 1
>
: inaµce
25
Zad. 12.47 Dati su prirodan broj n i realan broj a > 0. Na´ci prvu vrijednost xn za koju
je xkn a < 10 4 za niz x0 ; x1 ; x2 ; ::: koji je formiran po pravilu:

k 1 a
x0 = a; xk = xi 1 +
k xki 11
p
Niz fxi g, i 2 N, konvergira ka k
a.
5
Zad. 12.48 Na´ci prvi µclan xn za koji vrijedi jxn xn 1 j < 10 ako je:

2 x3k 1
x0 = 1; xk =
5
Zad. 12.49 Za dati realni broj " > 0 na´ci prvi µclan yn za kojeg vrijedi yn yn 1 < " ako
je:
yk 1 + 1
y0 = 0; yk =
yk 1 + 2
2 3
Zad. 12.50 Za dati realni broj x i prirodni broj n izraµcunati : a) xn =2n ; b) xn =3n .

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

X
1
1 X1
( 2)i
i=1
i (i + 1) i=1
i!

Algoritmi i programiranje, V.2 156 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.52 Izraµcunati sljede´ce proizvode.


Y
n
sin (kx) Yn
(1 x)k+1 + 1
P = 1+ P =
k=1
k! k=1
((k 1)! + 1)2

Zad. 12.53 Napraviti algoritam koji za zadate brojeve n i k raµcuna veliµcinu:

n n! n n 1 n k+1
= = :::
k k! (n k)! 1 2 k

Zad. 12.54 Napraviti algoritam i ispitati sloµzenost u sljede´cim sluµcajevima:

X
100 X
50
1 X
100 X
100
j i+1 X
n
kk
i=1 j=1
i + j2 i=1 j=1
i+j k=1

X
100 X
i
1 X
n
1
2j + i k=1
(k 2 )!
i=1 j=1

X
100 X
60
X
n X
n
sin (i3 + j 4 ) k (k + 1) :: k 2
( 1)k (2k 2 + 1)!
i=1 j=1 k=1 k=1

Zad. 12.55 Data je cjelobrojna matrica [aij ];j=1;;n . Izraµcunati b1 ; b2 ; :::; bn gdje je:
X
n X
n
bi = a2ij bi = jaji j
j=1 j=1

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

Zad. 12.56 Za dati prirodni broj n na´ci an ako je:

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

Zad. 12.57 Za dati prirodni broj n na´ci vn ako je:

v1 = v2 = 0; v3 = 1:5
i+1
vi = 2 vi 1 vi 2 vi 3
i +1
Zad. 12.58 Za date realne brojeve q; r; c; d; b i prirodni broj n izraµcunati xn ako je:

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

Algoritmi i programiranje, V.2 157 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.59 Za dati prirodni broj n na´ci vn ako je:

u1 = u2 = 0; v 1 = v2 = 1
ui 1 ui 2 vi 1 vi 2
ui =
1 + u2i 1 + vi2 1
ui 1 v i1
vi = ; i = 3; 4; :::
jui 2 + vi 1 j + 2
Zad. 12.60 Na´ci proizvod a0 a1 ::: a14 ako je:

a0 = a1 = 1
ai 1
ai = ai 2 + ; i = 2; 3; :::
2i 1

X
n
Zad. 12.61 Za dati prirodni broj n na´ci sumu ak bk ako je:
k=1

a1 = b 1 = 1
1 p 1p
ak = bk 1 + ak 1
2 2
bk = 2a2k 1 + bk 1 ; k = 2; 3; :::

X
n
xi
Zad. 12.62 Za dati prirodni broj n na´ci sumu ako je:
i=1
1 + jyi j

x1 = y1 = 1; xi = 0:3 xi 1
yi = xi 1 + yi 1 ; i = 2; 3; :::
X
n
2k
Zad. 12.63 Za dati prirodan broj n na´ci sumu ako je:
k=1
(1 + a2k + b2k ) k!

a1 = b1 = 1; ak = 3bk 1 + 2ak 1
bk = 2ak 1 + bk 1 ; k = 2; 3; :::
X
n
ak b k
Zad. 12.64 Za date realne brojeve u; v i prirodni broj n na´ci sumu ako je:
k=1
(k + 1)!

a1 = u; b1 = v; ak = 2bk 1 + ak 1
bk = 2a2k 1 + bk 1 ; k = 2; 3; :::

X
100
xi
Zad. 12.65 Na´ci sumu ako je:
i=1
2j

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

Zad. 12.66 Dat je cijeli broj m > 1. Na´ci najve´ci cijeli broj k za koji je 4k < m.

Zad. 12.67 Dat je prirodni broj n. Na´ci najmanji broj oblika 2r koji prelazi n.

Algoritmi i programiranje, V.2 158 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.68 Dat je prirodan broj n. Izraµcunati:

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

Zad. 12.69 Izraµcunati:


1
V =
1
1+
1
3+
1
5+
:::
:::
1
101 +
103
Zad. 12.70 Za dati realni broj x 6= 0 izraµcunati:
x
V =
2
x2 +
4
x2 +
8
x2 +
:::
256
::: x2 + 2
x

(2t)n [n=2]
Zad. 12.71 Za dati prirodni broj n i realni broj t izraµcunati .
n!! 2
Zad. 12.72 Niz Fibonaµcijevih brojeva u0 ; u1 ; u2 ; ::: se formira po pravilu:

u0 = 0; u1 = 1; Fn = Fn 1 + Fn 2

Za dati prirodan broj n izraµcunati prvih n Fibonaµcijevih brojeva koriste´ci se neposredno


formulom

Koriste´ci se formulama za n-ti µclan:


p !n p !n
1 1+ 5 1 1 5
uk = p p
5 2 5 2

Zad. 12.73 Dati su pozitivni cijeli brojevi m; n. Izraµcunati A (n; m) gdje je:
82 3
< m+1 n=0
A (n; m) = 4 A (n 1; 1) n 6= 0; m = 05
:
A (n 1; A (n; m 1)) n > 0:m > 0

Zad. 12.74 Niz polinoma je zadat na sljede´ci naµcin:

T0 (x) = 1; T1 (x) = x; Tk (x) = 2xTk 1 (x) Tk 2 (x)

Formirati niz T2 ; T3 ; :::; T8 .

Algoritmi i programiranje, V.2 159 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.75 Niz polinoma je zadat na sljede´ci naµcin:

H0 (x) = 1; H1 (x) = x
Hk (x) = xHk 1 (x) (k 2) Hk 2 (x)

Na´ci polinome H2 ; :::; H6

Za date realne brojeve a1 ; :::; a6 formirati polinom a0 H0 (x) + ::: + a6 H6 (x)

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

Zad. 12.76 Dati su prirodni brojevi m i n. Korištenjem Euklidovog algoritma na´ci:

Najve´ci zajedniµcki djelitelj (NZD) brojeva m i n

Najmanji zajedniµcki sadrµzalac brojeva m i n

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

Zad. 12.77 Dati su prirodni brojevi m; n1 ; n2 ; :::; nm (m 2). Izraµcunati:

N ZD (n1 ; n2 ; :::; nm )

korištenjem relacije:

N ZD (n1 ; n2 ; :::; nk ) = N ZD (N ZD (n1 ; n2 ; :::; nk 1 ) ; nk )

i algoritma Euklida.

Zad. 12.78 Za dati prirodni broj n 99 provjeriti da li je n2 jednak kubu sume svojih
cifara.

Zad. 12.79 Za dati prirodni broj n 1000 provjeriti koliko ima cifara u dekadnom
zapisu, kolika je suma cifara, koja je cifra posljednja.

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

Zad. 12.81 Dati su prirodni brojevi m i n. Na´ci sve prirodne brojeve manje od n za koje
je kvadrat sume njegovih cifara jednak m.

Zad. 12.82 Prona´ci sve sretne šestocifrene brojeve. Za broj se kaµze da je sretan ako je
suma njegove prve tri cifre jednaka sumi druge dvije cifre.

Zad. 12.83 Formirati kvadratnu matricu reda n µciji su elementi brojevi 1; 2; :::; n2 ras-
pore†eni spiralno, poµcev od elementa a11 : a) u smjeru kazaljke na satu; b) u smjeru
obratno kazaljci na satu.

Zad. 12.84 U datoj kvadratnoj matrici reda n na´ci sumu elemenata reda u kojoj je naj-
manji element (po apsolutnoj vrijednosti). Pretpostavka je da je takav element jedinstven.

Algoritmi i programiranje, V.2 160 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.85 Data je matrica n m u kojoj postoje taµcno dva jednaka elementa. Na´ci
indekse tih elemenata.

Zad. 12.86 Dato je 15 trojki brojeva (xi ; yi ; ri ) u kojima je (xi ; yi ) centar a ri radijus
kruga. Dati odgovor na pitanje : da li postoje taµcke koje pripadaju svim krugovima ?

Zad. 12.87 Dat je prirodan broj n. Na´ci sve prirodne brojeve od 1 do n za koje zapis
odgovara posljednjim ciframa njihovih kvadrata.

Zad. 12.88 Data je realna kvadratna matrica reda n. Putem dopustivih transformacija
napraviti da element najve´ci po apsolutnoj vrijednosti bude u gornjem lijevom uglu (pozi-
cija a11 ). Dopustiva transformacija matrice je zamjena dvije kolone ili dva reda.

Zad. 12.89 Data je realna kvadratna matrica reda n. Formirati niz fak g, k = 1; ; n, po
sljede´cem pravilu:

ako je dijagonalni element i-tog reda negativan tada je ai jednak sumi elemenata
i-tog reda

ako je dijagonalni element i-tog reda nenegativan (pozitivan ili nula) ai je suma
posljednjih elemenata i-tog reda koji poµcinju nenegativnim elementom

Zad. 12.90 Neka je:

i 1 (i 1)3
ai = + sin ; i = 1; 2; 3; :::
i+1 i+1
Za dati prirodni broj n na´ci sve pozitivne brojeve ai , i = 1; 2; :::, i najmanji od svih
pozitivnih.

Zad. 12.91 Na´ci sve prirodne brojeve manje od 150 koji:

kvadriranjem daju palindrom

jesu palindromi i kvadriranjem daju palindrom

Zad. 12.92 Prona´ci sve µcetvorocifrene brojeve u µcijem zapisu nema jednakih cifara.

Zad. 12.93 Generisati sve dvocifrene, trocifrene i µcetvorocifrene brojeve Armstronga.


Broj sa n cifara je Armstrongov ako je zbir njegovih cifara koje su pojedinaµcno stepeno-
vane sa n jednak tom broju. Primjer je broj 153 = 13 + 53 + 33 .

Zad. 12.94 Na šahovskoj tabli su bijeli kralj, crni kralj, crni skakaµc i crni top. Odrediti
da li je pozicija mat, pat ili regularna pozicija.

Zad. 12.95 Dat je broj g koji oznaµcava godinu (µcetvorocifreni broj). Prona´ci koliko puta
u toku godine je petak 13.

Zad. 12.96 Pokazati da se svaki prirodni broj n moµze predstaviti u obliku:

n = ds (s + 1)! + ds 1 s! + ::: + d1 2! + d0

gdje je 0 di i + 1, i = 0; ; s, ds 6= 0. Za dati broj n na´ci niz fdi g, i = 1; ; s.

Algoritmi i programiranje, V.2 161 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.97 Data je tablica 9 9 popunjena brojevima od 1 do 9. Utvrditi da li raspored


brojeva odgovara pravilima igre Sudoku.
Napomena. Sudoku 9 9 je jedan od oblika tzv. latinskih kvadrata, koji imaju veliku
ulogu u statistiµckom testiranju.

Zad. 12.98 Napraviti algoritam i program kojim se raµcunaju vrijednosti funkcija:


( 2 8
x + 4x + 5 x 2 [ 2; 2] < 0 x 0
f1 (x) = 1 ; f2 (x) = x2 + x 0<x 1
x 6
= [ 2; 2] :
x2 + 4x + 5 x2 sin ( x2 ) x>1

Zad. 12.99 Napraviti algoritam koji rijeµcima ispisuje zadati broj x 1:000:000.

Zad. 12.100 Dat je prirodan broj n kojim se iskazuje starost µcovjeka. Zavisno od vri-
jednosti, broju n dodati odgovaraju´ci tekst iz skupa f"godina"; "godine"g.

Zad. 12.101 Svako polje šahovske table odre†eno je parom prirodnih brojeva od kojih ni
jedan ne prelazi 8. Prvi od njih oznaµcava kolonu a drugi red. Dati su prirodni brojevi
k; l; m; n. Uraditi sljede´ce:

Utvrditi da li su polja (k; l) i (m; n) polja iste boje

Na polju (k; l) je dama. Da li ona ugroµzava polje (m; n)

Na polju (k; l) stoji skakaµc (konj). Da li on ugroµzava polje (m; n)

Utvrditi da li je jednim potezom topa mogu´ce sa polja (k; l) do´ci na polje (m; n)

Utvrditi da li je jednim potezom dame mogu´ce sa polja (k; l) do´ci na polje (m; n)

Utvrditi da li je jednim potezom lovca mogu´ce sa polja (k; l) do´ci na polje (m; n)

Ako nije mogu direktan prelazak na drugo polje pokazati kako se to moµze uµciniti u dva
koraka odnosno polja na koja se moµze napraviti prvi korak.

Zad. 12.102 Dati je niz pozitivnih realnih brojeva fak g, k = 1; ; n. Izraµcunati:

S = a1 + a2 + ::: + an niz proizvoda:

P = a1 a2 ::: an Y
k
Pk = am
aritmetiµcku sredinu brojeva fak g m=1

geometrijsku sredinu brojeva fak g a1 + 2a2 + 2a3 + ::: + 2an 1 + an

harmonijsku sredinu brojeva fak g a1 a2 + a2 a3 + ::: + an 1 an + an a1

Zad. 12.103 Dat je prirodni broj n i realni brojevi x1 ; :::; xn . Odrediti sve brojeve xk za
koje vrijedi da je:
xk > x1 ; xk > x2 ; :::; xk > xk 1

Zad. 12.104 Grupe znakova koje ne sadrµze razmak i odvojene su razmacima zovemo
rijec.

Algoritmi i programiranje, V.2 162 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Prebrojati rijeµci u datom nizu znakova

Prebrojati slova a u posljednjoj rijeµci

Na´ci broj rijeµci koje poµcinju slovom b

Na´ci broj rijeµci koje imaju jednako prvo i posljednje slovo

Na´ci bilo koju rijeµc koja poµcinje slovom a

Svaku rijeµc evo zamijeniti sa ovo

Na´ci duµzinu najkra´ce i najduµze rijeµci u nizu

Zad. 12.105 Za dati prirodan broj n:

Ispisati njegov naziv u obliku teksta. Naprimjer, broju 25 se dodjeljuje tekst "dvade-
setpet"

Prebrojati slova u tekstualnom prikazu broja a zatim generisati tekstualni prikaz tog
broja. Naprimjer, broju 30 se dodjeljuje tekst "trideset"; u tom tekstu ima osam
slova, što znaµci da se generiše broj 8; ovom broju se dodjeljuje tekst "osam" koji
ima µcetiri slova; broju 4 se dodjeljuje tekst "µcetiri",... Da li se ovaj postupak uvijek
završava ?

Zad. 12.106 Dati su realni brojevi a; b; c. Odrediti koji dan u sedmici odgovara datumu
koji je odre†en tom trojkom brojeva. Za rješenje se moµze koristiti sljede´ci koncept. Pret-
postavka je da je godina u intervalu 1582 do 4902; nedjelji se dodjeljuje broj 0, ponedjeljku
broj 1 itd. i to kao ostatak dijeljenja izraza:

[2:6m 0:2] + d + y + [y=4] + [c=4] 2c

gdje je d broj dana u mjesecu, m broj mjeseca u godini; numeracija poµcinje od marta
(Mart=1, April=2, ...,Decembar=10 a Januar i Februar dobijaju brojeve 11 i 12 jer se
smatraju mjesecima prethodne godine); y su dvije posljednje cifre koja oznaµcava godinu
(00; 01; :::; 99); c su dvije vode´ce cifre koja oznaµcava godinu (15; :::; 49); [x] oznaµcava cjelo-
brojni dio broja x. Za univerzalni kalendar je mogu´ce koristiti µcinjenicu da je 01:01:1900
godine bio ponedjeljak. Uvaµzavati razliku izme†u Gregorijanskog i Julijanskog kalendara.

Zad. 12.107 Dat je parni prirodni broj n > 2. Provjeriti hipotezu Goldbaha prema kojoj
se svaki parni prirodni broj moµze prikazati kao suma dva prosta broja.

Zad. 12.108 Uµcitava se niz realnih brojeva. Kraj uµcitavanja je oznaµcen simbolom #.
Izraµcunati prosjek (aritmetiµcku sredinu) uµcitanih brojeva ve´cih od datog broja a.

Zad. 12.109 Za dati broj n na´ci sve petorke brojeva x1 ; x2 ; x3 ; x4 ; x5 takve da je:

x1 x2 x3 x4 x5 ^ x1 + x2 + x3 + x4 + x5 = n

Zad. 12.110 Prirodni broj n predstaviti na naµcin da se svaka cifra predstavlja u bina-
rnom brojnom sistemu. Primjer: ako je n = 93 tada je zapis 10010011. Ovo se naziva
binarno kodirani zapis broja n, koji se široko koristio u programskim jezicima za obradu
poslovnih podataka.

Algoritmi i programiranje, V.2 163 A.G. 2018/2019, Radni materijal


12.2 Zadaci 12 ZADACI MJEŠOVITOG TIPA

Zad. 12.111 Iz dva izvora se uµcitavaju dva niza sortirana u rastu´cem redoslijedu. Naprav-
iti algoritam koji µcita oba izvora i formira novi niz, sastavljen od elemenata oba niza i
sortiran u rastu´cem redoslijedu. Taj novi niz se usmjerava u zasebnu datoteku. Broj
µclanova polaznih nizova nije unaprijed odre†en.

Zad. 12.112 Dat je prost broj p. Napraviti algoritam koji generiše niz cifara koji odgo-
varaju decimalnom dijelu inverzne vrijednosti tog broja.

Zad. 12.113 Neka je sa C (k) oznaµcen broj cifara broja k. Za odabrano n izraµcunati
sumu:
C (1) C (2) C (n)
S1 = 2
+ 2 + ::: +
1 2 n2
Zad. 12.114 Za dati prirodan broj n i realan broj x izraµcunati vrijednost izraza:

10C(1) 10C(2) 2 10C(n)


S2 (n; x) = (1 x) + (1 x) + ::: + (1 x)n
1 2 n
Zad. 12.115 Na´ci sve djelitelje prirodnog broja n.

Zad. 12.116 Dat je niz fak g, k = 1; :::; 10, realnih brojeva i prirodni broj n. Niz fbm g
je formiran po pravilu:

b1 = a1 ; :::; b10 = a10


bk = bk 1 + bk 2 + ::: + bk 10

Izraµcunati broj bm .

Zad. 12.117 Prirodni broj je palindrom ako se µcita jednako slijeva na desno kao i sdesna
ulijevo. Na´ci sve brojeve manje od 100 koji kvadriranjem postaju palindromi.

Zad. 12.118 Neka je dat prirodni broj n koji nije palindrom. Obrnemo redoslijed nje-
govih cifara i novi broj dodamo broju n. Ako je dobijen palindrom postupak završavamo.
Ako nije dobijen palindrom postupak ponavljamo za novo dobijeni broj. Pokazati da li se
postupak moµze završiti u m koraka. Napomena: do sada nije utvr†eno da li se postupak
uvijek završava palindromom.

Algoritmi i programiranje, V.2 164 A.G. 2018/2019, Radni materijal


REFERENCES

13 Literatura
References
[1] Azali Saudi, Analysis of Algorithms, Lecture Notes, July 2008

[2] Hasan Jamak, Teorija brojeva, materijali za nastavu na postdiplomskim studijama


na PMF Tuzla
µ
[3] Miodrag Zivković, 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] Alexander Shen, Algorithms and Programming, Problems and Solutions, Second
edition, Springer Undergraduate Texts in Mathematics and Technology, 2010

[12] Cody Johnson, Algorithms

Algoritmi i programiranje, V.2 165 A.G. 2018/2019, Radni materijal

You might also like