Download as pdf or txt
Download as pdf or txt
You are on page 1of 59

JU UNIVERZITET U TUZLI

PRIRODNO MATEMATIKI FAKULTET


ODSJEK MATEMATIKA
II godina studija Matematike

MATEMATIKI
ALGORITMI
Lekcije

Autori :
Dr.sc. Mevludin Glavi
Zoran Jasak, Mr.sci.math.

Juni 2011. godine

Uvod
Ovaj tekst je namijenjen studentima druge godine dodiplomskog studija Prirodno
matematikog fakulteta u Tuzli na Odsjeku za matematiku kao dio materijala za izborni
predmet Matematiki algoritmi, u kolskoj 2010/2011. godini. Namjena teksta je da prui
osnovne informacije iz ove oblasti kao podloga za dalji samostalni rad studenata.
Tekst obuhvata teorijski dio poglavlja koja su predviena planom ovog predmeta. Tekst ne
obuhvata zadatke koji su raeni kao praktini primjeri pojedinih vrsta algoritama. Njihova
namjena je bila izgraditi analitiki pristup u rjeavanju praktinih matematikih problema.
NAPOMENA : Tekst i dijelovi teksta ne mogu biti reprodukovani ili preuzimani bez znanja i
saglasnosti autora.
Autori :
Mevludin Glavi, Dr.sci.,
Zoran Jasak, Mr.sci.math.,
jasak_z@bih.net.ba


SADRZAJ

SADRZAJ

Sadrzaj
1 Algoritmi
1.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Klasikacija algoritama . . . . . . . . . . . . . .
1.3 Predstavljanje algoritama . . . . . . . . . . . .
1.4 Analiza kompleksnosti algoritama . . . . . . . .
1.4.1
-notacija . . . . . . . . . . . . . . . . .
1.4.2 O-notacija . . . . . . . . . . . . . . . . .
1.4.3
-notacija . . . . . . . . . . . . . . . . .
1.4.4 o-notacija . . . . . . . . . . . . . . . . .
1.5 Podjela algoritama prema brzini . . . . . . . . .
1.5.1 Algoritmi konstantnog vremena . . . . .
1.5.2 Algoritmi u linearnom vremenu . . . . .
1.5.3 Algoritmi sa kvadratnim vremenom . . .
1.5.4 Algoritmi sa logaritamskim
vremenom .
p
1.5.5 Algoritmi brzine n . . . . . . . . . . .
1.5.6 Algoritmi sa eksponencijalnim vremenom
1.5.7 Kombinacije algoritama . . . . . . . . .
1.5.8 Rekurzije . . . . . . . . . . . . . . . . .
1.6 Primjeri . . . . . . . . . . . . . . . . . . . . . .
1.7 Primjeri za samostalni rad . . . . . . . . . . . .

. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
izvravanja
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .

2 Algoritmi sortiranja
2.1 Sortiranje nizova - osnovne metode . . . . . . . . . .
2.1.1 Sortiranje putem ukljucivanja (Insertion sort)
2.1.2 Sortiranje putem direktne podjele . . . . . . .
2.1.3 Sortiranje putem zamjene . . . . . . . . . . .
2.2 Sortiranje nizova - poboljane metode . . . . . . . . .
2.2.1 Shell sort . . . . . . . . . . . . . . . . . . . .
2.2.2 Quick sort . . . . . . . . . . . . . . . . . . . .
2.2.3 Merge sort . . . . . . . . . . . . . . . . . . . .
2.2.4 Heap sort . . . . . . . . . . . . . . . . . . . .
3 Pohlepni algoritmi
3.1 Rasporeivanje aktivnosti . . . . .
3.2 Knapsack problem (problem ranca)
3.2.1 Korektnost . . . . . . . . .
3.3 Pohlepni algoritmi na grafovima . .
3.3.1 Kruskalov algoritam . . . .
3.3.2 Primov algoritam . . . . . .
3.3.3 Dijkstra algoritam . . . . .
4 Slucajni brojevi
4.1 Uvod . . . . . . . . . .
4.2 Uniformna distribucija
4.3 Normalna distribucija .
4.4 Testiranje slucajnosti .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

3
3
5
6
6
7
8
9
9
10
10
10
10
11
12
12
12
13
16
17

.
.
.
.
.
.
.
.
.

18
18
19
20
23
25
25
27
28
28

.
.
.
.
.
.
.

29
29
30
31
32
34
35
36

.
.
.
.

39
39
39
41
43


SADRZAJ

SADRZAJ

5 NP
5.1
5.2
5.3

kompleksnost
Problemi odlucivanja . . . . . . . . . . . . . . .
Problemi prepoznavanja jezika . . . . . . . . . .
Verikacija polinomijalnog vremena i certikati
5.3.1 NP klasa . . . . . . . . . . . . . . . . . .
5.4 Redukcije NP kompleksnosti . . . . . . . . . . .
5.4.1 Problem tri boje . . . . . . . . . . . . .
5.4.2 Clique pokrivac (cover) (CCov) . . . . .
5.4.3 Redukcija na polinomijalno vrijeme . . .
5.5 NP kompletnost . . . . . . . . . . . . . . . . . .
5.6 Zadaci za samostalni rad . . . . . . . . . . . . .

6 Literatura

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

45
46
47
49
50
51
51
52
54
54
56
57

1 ALGORITMI

1 Algoritmi
1.1 Uvod
Termin "algoritam" je nastao po latinskom prevodu imena matematicara iz devetog vijeka, Abu Jafar Muhammad Ibn Musu Al-Khowarizmi koji se bavio trigonometrijom,
astronomijom, zemljopisom, kartograjom, a smatra se ocem algebre jer je denirao
osnovna pravila rjeavanja linearnih i kvadratnih jednadzbi. Njegovi radovi su osnova
razvoja mnogih matematickih i prirodnih disciplina, meu njima i racunarstva.
Prvi zapis algoritma prilagoen racunaru pripada Adi Byron iz 1842, pa se zbog ovoga
smatra prvom programerkom, a racunao je Bernoullijeve brojeve. Racunar za koji je
napisan je bio analiticki stroj koji je zamislio, ali nikad u potpunosti proveo u djelo, Englez
Charles Babbage. Analiticki stroj je trebao biti prvi programabilni racunar, sastavljen
u potpunosti od mehanickih dijelova. Mehanicki dijelovi i zicka glomaznost su glavni
razlozi zato nikad nije zavren1 .
Algoritam se denie na nekoliko nacina :
Algoritam je skup pravila kojima se provodi kalkulacija bilo rucno bilo putem maine
Algoritam je procedura od konacnog broja koraka kako bi se dobio trazeni rezultat
Algoritam je niz racunskih koraka kojima se ulaz transformie kako bi se dobio izlaz
Algoritam je niz operacija koje se izvode nad podacima koji trebaju biti organizovani u strukturama podataka
Algoritam je apstrakcija programa koji se treba izvesti na zickoj maini (model
izracunavanja)
U tekstu [11] algoritam se denie kao "jasno speciciran matematicki process izracunavanja; skup pravila koji ako se slijede daju zeljeni rezultat". U matematici, racunarstvu,
lingvistici i srodnim disciplinama, algoritam je konacan niz dobro denisanih naredbi
za ostvarenje zadatka, koji ce za dato pocetno stanje zavriti u denisanom konacnom
stanju.
Iz datih denicija se moze zakljuciti da je algoritam skup koraka odnosno postupak kojim
se odreeni problem rjeava u konacnom broju koraka. Istorijski gledano, svi problemi su
rjeavani nekim vidom algoritma ali je proteklo puno vremena da se napravi odgovarajuca
formalizacija.
Koncept algoritma je potekao kao sredstvo zapisivanja postupaka za rjeavanje matematickih problema, poput pronalazenja zajednickog djelitelja dva broja ili mnozenja dva
broja. Koncept je formaliziran 1936. u vidu Turingovog stroja Alana Turinga i lambda
racuna Alonza Churcha, koji su jedan za drugim postavili temelje racunarstva.
Najpoznatiji algoritam u istoriji datira mnogo prije vremena starih grka; to je Euklidov
algoritam za racunanje najveceg zajednickog djelioca dva cijela broja.
Algoritmi imaju slijedeca svojstva:
1

Prije nekoliko godina su britanski inzinjeri uspjeli sastaviti potpuno funkcionalan ureaj koji je
zamislio Charles Babbage.

1.1 Uvod

1 ALGORITMI

diskretnost : u odvojenim koracima se izvode diskretne operacije algoritma koje


vode ka konacnom cilju;
konacnost : oznacava sposobnost algoritma da nakon konacnog broja koraka daje
izlazne podatke odnosno rezultate;
determiniranost : za iste ulazne podatke algoritam uvijek daje iste rezultate
masovnost : algoritam je primjenjiv na veci broj ulaznih vrijednosti.
Osnovne komponente algoritma su :
Denicija problema
Ulazne velicine
Radne velicine
Postupak rjeavanja
Izlaz
Denicija problema treba biti jasna, sadrzajna i sa dovoljno elemenata kako bi se
problem mogao rijeiti. Problem se denie tekstualno i/ili izrazom. Denicija problema
treba biti egzaktna i nedvosmislena.
Ulazne velicine deniu skup podataka koji su predmet obrade (input). Ove velicine
mogu biti numericke velicine, fajlovi, tekstovi, graka itd.
Radne velicine su varijable koje se koriste u postupku rjeavanja problema. Mada
se koncept razlikuje po jezicima, svima im je zajednicko da zahtijevaju deklaraciju i
inicijalizaciju radnih velicina.
Deklaracija denie tip varijable a samim tim i njene moguce vrijednosti.
Incijalizacija je postupak davanja pocetnih vrijednosti varijablama. Ovo je posebno
vazno u ciklicnim algoritmima. U nekim slucajevima inicijalizacija se vri prvom dodjelom
vrijednosti.
Postupak rjeavanja denie svaki pojedini korak koji je potreban za rjeenje problema,
ukljucujuci deklaracije, inicijalizacije i svaku operaciju koja se obavlja.
Izlaz (output) denie rezultat rada koji moze biti numericka velicina, skup vrijednosti,
datoteka itd.
Svaki algoritam mora imati zavretak. Pravljenje tzv. vjecnih petlji je klasicna programerska greka. Potrebno je razlikovati procedure od funkcija. U principu, svaka
procedura ima rezultat ali on ne mora biti vidljiv u svim slucajevima. Primjer je procedura sortiranja koja se moze izvravati kao dio nekog veceg algoritma odnoso uslova za
naredne korake. Funkcija mora imati vrijednost i moze biti clan u operacijama.
Dizajn algoritma ukljucuje obaveznu kontrolu njegove ispravnosti kako bi se ustanovilo
da algoritam daje zeljeni rezultat.

1.2 Klasikacija algoritama

1 ALGORITMI

1.2 Klasikacija algoritama


Algoritme je moguce klasicirati po raznim kriterijima:
Klasikacija prema implementaciji
Rekurzivni ili iterativni: Rekurzivni algoritam je algoritam koji poziva samog
sebe sve dok se ne postigne odreen uslov. Rekurzivni algoritmi su vrlo cesto usko
vezani uz implementaciju pojedine matematicke funkcije na primjer Fibbonacijeve
funkcije. Iterativni algoritmi su algoritmi koji ne pozivaju samog sebe vec se oslanjaju na konstrukcije poput petlji i dodatne strukture podataka da bi se rijeio
problem. Vazno je napomenuti da je svaki rekurzivni algoritam moguce pretvoriti
u iterativni, i da je svaki iterativni algoritam moguce pretvoriti u rekurzivni, iako
ponekad pretvaranje moze biti vrlo kompleksno.
Serijski ili paralelni: Vecina dananjih racunara sadrzi samo jedan procesor te
stoga obavlja naredbe jednu po jednu, to jest serijski. Algoritmi koji su dizajnirani
sa namjerom da se izvravaju u takvom okruzenju shodno tome se nazivaju serijski
algoritmi. Suprotno njima su paralelni algoritmi koji sa sve vecim brojem vieprocesorskih racunara dobivaju sve vecu vaznost. Paralelni algoritmi koriste mogucnost
vieprocesorskog sistema na nacin da problem podijele na vie malih potproblema
koje svaki procesor rjeava zasebno te se zatim rezultati spajaju. Paralelni algoritmi
uz resurse potrebne za obradu podataka takoer imaju i malu potronju resursa na
komunkaciju izmeu vie procesora. Algoritmi za sortiranje su jedan od primjera
algoritama koje je moguce znatno poboljati upotrebom paralelnih procesora, dok
je neke probleme sasvim nemoguce rijeiti paralelnim algoritmom.
Deterministicki ili stohasticki: Deterministicki algoritam je algoritam koji ce
pri svakom izvravanju u bilo kojim uslovima od istog unosa doci do istog izlaza na
nacin da svaki put slijedi identican niz naredbi. Stohashicki algoritmi je algoritam
koji barem u jednom dijelu izvravanja donese neku odluku slucajnim odabirom.
Tacan ili priblizan: Iako algoritmi u principu daju tacan rezultat, ponekad algoritam trazi priblizno rjeenje koje je dovoljno blizu tocnom, ili je tacno rjeenje
nemoguce naci.
Klasikacija s obzirom na metodologiju dizajna
Brute force algoritmi - racunar "cistom silom" isprobava sve mogucnosti i trazi
odgovarajuce rjeenje. Ovo su najneekasnijji algoritmi jer ukazuju na nesistematicnost i neanalitcnost u pristupu.
Podijeli i vladaj algoritmi (Divide and conquer). Problem se dijeli na vie istih,
manjih problema. Podjela tece tako dugo dok se ne doe do malog problema kojeg
je jednostavno rijeiti (obicno rekurzijom).
Dinamicki algoritmi - Metodama dinamickog programiranja rjeavaju se viefazni
procesi, tj. procesi u kojima se donosi niz meusobno zavisnih odluka. Dinamicko
programiranje poznato je i pod nazivom metoda donoenja viefaznih odluka.

1.3 Predstavljanje algoritama

1 ALGORITMI

Pohlepni algoritmi (greedy) - Pohlepni algoritam koristi metaheuristiku za


rjeavanje problema, takvu da u svakom koraku bira lokalno najbolje rjeenje, u
nadi da ce tako iznaci globalni optimum. Ovi algoritmi cesto ne daju najbolje
rjeenje vec brzu aproksimaciju najboljeg rjeenja.
Algoritmi za sortiranje i pobrojavanje (search and enumeration) - Algoritmi
sortiranja sluze za brzo sortiranje podataka, npr. niza brojeva. Mnogi se problemi
mogu rjeavati teorijom grafova.
Klasikacija s obzirom na tok
Linijski algoritmi se izvravaju korak po korak, bez vracanja na neki od prethodnih koraka niti se neki od koraka ili grupa koraka ponavlja u bilo kom smislu. Ovi
algoritmi mogu sadrzavati i grananja, mjesta na kojima se postupak nastavlja nakon
ispitivanja odreenog uslova.
Ciklicni algoritmi se realizuju na nacin da se ponavlja odreeni korak ili grupa
koraka. Ponavljanje se moze realizovati na dva nacina :
- Putem brojaca, 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
moze mijenjati u toku samog izvrenja
- Putem uslova za koji se ne zna unaprijed koliko puta ce se izvriti. Ovo je slucaj
npr. kada se zeli postici odreena tacnost u racunanju; najcece nije poznato koliko
koraka treba napraviti da bi se tacnost postigla pa se trazi drugi nacin.
Najveca opasnost ciklicnih algoritama je formiranje tzv. vjecitih petlji jer uslov zavretka
nije dobro denisan.

1.3 Predstavljanje algoritama


Algoritmi se predstavljaju gracki i tekstualno.
Gracko predstavljanje se realizuje putem standardnih simbola koji predstavljaju pojedine 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 moze biti putem pseudokoda ili putem odabranog programskog jezika. Pseudokod nije vezan ni za jedan specican programski jezik.

1.4 Analiza kompleksnosti algoritama


Cilj analize algoritama je da se predvidi njegovo ponaanje, posebno brzina izvravanja,
bez realizacije na nekom (konkretnom) racunaru. Ideja je da se procijeni brzina rada bez
realizacije samog algoritma tako da procjena vrijedi za svaki racunar.
Tacno ponaanje algoritma je nemoguce predvidjeti osim u najjednostavnijim slucajevima. Na ponaanje utice mnogo faktora pa se u obzir uzimaju samo glavne karakteristike

1.4 Analiza kompleksnosti algoritama

1 ALGORITMI

a zanemaruju se detalji vezani za tacnu realizaciju. Iz tog razloga analiza algoritma je priblizna. Na taj nacin se, ipak, dobijaju znacajne informacije o algoritmu koje omogucavaju
uporeivanje razlicitih algoritama za rjeavanje istog problema.
Logican korak je da se zanemare konstantni faktori jer se brzine izvravanja algoritama
na raznim racunarima razlikuju priblizno za konstantan faktor. Od interesa je ocjena
algoritma kada ulazna velicina tezi beskonacnosti.
U analizi algoritama se za svaki ulaz odreuje njegova velicina (dimenzija) n. Velicina
ulaza nije striktno denisana; obicno je to mjera velicine memorijskog prostora potrebnog
za smjetanje ulaza.
Ocjena vremenske slozenosti algoritma se sastoji u brojanju racunskih koraka koje treba
izvriti. Termin "racunska operacija" moze obuhvatiti vie tipova operacija kao to je
sabiranje i mnozenje. Vrijeme izvravanja zavisi od konkretnog racunara, odabranog
programskog jezika i slicno. Stoga se u algoritmu izdvaja korak koji se ponavlja i koji na
taj nacin postaje osnova analize. Naprimjer, u sortiranju je to uporeivanje. Tako, ako je
broj uporeivanja O (f (n)) a broj ostalih operacija je proporcionalan broju uporeivanja
tada je O (f (n)) granica vremenske slozenosti algoritma.
Pod pojmom "prostorna slozenost" se podrazumijeva velicina memorije potrebne za
izvrenje algoritma pri cemu se prostor za smjetanje ulaznih podataka najcece ne
racuna. Ovo omogucava uporeivanje razlicitih algoritama za iste probleme. I ovdje se
trazi asimptotska procjena za velike velicine problema. Prostorna slozenost O (n) znaci
da je za izvrenje algoritma porebna memorija proporcionalna onoj za smjetanje podataka. Ako je prostorna slozenost O (1) tada je memorijski prostor potreban za njegovo
izvrenje ogranicen konstantom bez obzira na obim ulaza.
Kada se ispituje vrijeme potrebno racunaru da izvri predviene procedure datog algoritma mjeri se kolicina vremena u terminima bit operacija. Pod terinom bit operacija
se podrazumijeva sabiranje, oduzimanje ili mnozenje dvije binarne cifre, dijeljenje dvobitnog broja sa jednobitnim brojem ili pomjeranje cifara binarnog broja za jedno mjesto
u lijevo. Stvarna kolicina vremena potrebna za izvrenje bit operacije na racunaru varira
u zavisnosti od arhitekture i kapaciteta racunara. Kada se opisuje broj bit operacija
potrebnih da se izvri algoritam opisuje se racunska kompleknost ili red tog algoritma.

Cesto
je teko, pa i nemoguce, izvesti egzaktnu formulu za broj operacija nekog algoritma.
Zato se proucava asimptotsko ponaanje broja operacija kad velicina ulaznih podataka
neograniceno raste. Najpoznatije asimpotske notacije slozenosti algoritma su: -notacija,
O-notacija i -notacija.
1.4.1

-notacija

Denicija. Neka je g (n) funkcija denisana na nekom podskupu skupa prirodnih brojeva
i ciji je skup vrijednosti neki podskup skupa realnih brojeva. Sa (g (n)) se oznacava
skup funkcija f (n) takvih da postoje pozitivne konstante c1 , c2 i prirodan broj n0 takvi
da je
0

c1 g (n)

f (n)

c2 g (n)

za svako n

n0

1.4 Analiza kompleksnosti algoritama

1 ALGORITMI

Ovdje
oznacava klasu funkcija a f (n) =
(g (n)).

(g (n)) je oznaka za inkluziju f (n) 2

Primjer 1. Neka je f (n) = 32 n2 n, n 2 N. Tada je f (n) = (n2 ). Najprije, vrijedi


2
1
2 2
n
n
c2 n2 za svako n0
n ako i samo ako c1
c2 za svako
c1 n2
3
3
n
2
. Kako c1 mora biti pozitivan broj to mora
n0 n. Odavdje slijedi da mora biti c2
3
biti 32 n1 0. To znaci da je dovoljno uzeti n0 = 3. Iz c1 32 13 slijedi c1 13 . Dakle,
vrijedi da je 13 n2 f (n) 23 n2 za svako n 3.
Primjer 2. Neka je f (n) = an2 + bn + c gdje su a; b; c konstante i a > 0. Da li je
f (n) = (n2 ) ? Potrebno je odrediti konstante c1 i c2 i prirodan broj n0 takve da je
c1 n2 an2 + bn + c c2 n2 za svako n > n0 . Neka je c1 < a i c2 > a. Tada su nejednacine
(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. znaci,
vrijedi f (n) 2 (n2 ). Takoe, ako je f (n) polinom stepena m ciji je vodeci koecijent
pozitivan onda je f (n) = (nm ).
1.4.2 O-notacija
Denicija. Neka je g (n) realna funkcija denisana na nekom podskupu skupa prirodnih brojeva. Sa O (g (n)) se oznacava skup realnih funkcija f (n) denisanih na nekom
podskupu skupa realnih brojeva takvih da postoji pozitivna konstanta c i prirodan broj
n0 takvi da je
0

f (n)

c g (n) ;

za svako n

n0

Ovdje O oznacava 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)) povlaci f (n) = O (g (n)).
Notacija Veliko-O (O) ima dvije glavne oblasti primjene. U matematici se obicno koristi
da opie koliko blisko konacni niz aproksimira datu funkciju, posebno u slucaju skracenog
(truncated) Tejlorovog niza ili asimptotske ekspanzije. U kompjuterskoj nauci je korisna
za analizu algoritama. U obje vrste primjene funkcija koja se pojavljuje unutar O ( )
tipicno se bira da bude to je moguce jednostavnija, pri cemu se izostavljaju konstantni
faktori i clanovi manjeg reda.
Postoje dva formalno bliska ali bitno razlicita koritenja ove notacije: beskonacna (innite) i innitezimalna asimptotika. Ova razlika je jedino u primjeni ali nije i principijelna.
Formalna denicija za O ( ) je jednaka u oba slucaja sa razlicitim limitima za argumente
funkcije.
Velicina O ( ) se tumaci tako da je g (n) gornja granica za f (n). U tom smislu, oznaka
f (n) = O (g (n)) se tumaci da "f ne raste brze od g".
U nastavku ce biti navedeno nekoliko jednostavnih ali znacajnih osobina O notacije.
1.
Ako je f (n) = O (g (n)) tada je a f (n) = O (g (n)) za svaku pozitivnu konstantu
a.
2.
Ako je fi (n) = O (gi (n)), i = 1; 2; :::; k tada je
f1 (n) + f2 (n) + ::: + fk (n) = O ((g1 + g2 + ::: + gk ) (n))
8

1.4 Analiza kompleksnosti algoritama

1 ALGORITMI

3.
Ako je fi (n) = O (g (n)), i = 1; 2; :::; k tada je
f1 (n) + f2 (n) + ::: + fk (n) = O (g (n))
4.
Ako je fi (n) = O (gi (n)), i = 1; 2; :::; k tada je
f1 (n) f2 (n) ::: fk (n) = O (g1 (n) g2 (n) ::: gk (n))
Ako je f (n) monotono rastuca funkcija koja nije ogranicena, 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 znaci da proizvoljan stepen logaritamske funkcije raste spporije od linearne
funkcije.
Primjer. Kako je
ln n
lim
=0
n!1 n
za svako > 0 tada vrijedi da je ln n = O (n ) za svako

> 0.

Primjer. Neka je f (n) broj bita broja n. Tada je f (n) = [log2 n] + 1. Kako je
f (n)
=1
lim
n!1 log2 n
tada vrijedi da je f (n) = O (log2 n). S obzirom da je log2 n =
1.4.3

ln n
ln 2

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

-notacija

Denicija. Neka je g (n) realna funkcija denisana na nekom podskupu prirodnih brojeva. Sa (g (n)) se oznacava skup realnih funkcija f (n) denisanih na nekom podskupu
skupa realnih brojeva takvih da postoji konstanta c > 0 i prirodan broj n0 takvi da vrijedi
0 c g (n) f (n) za svako n n0 .
Ovdje ( ) oznacava klasu funkcija a f (n) =
(g (n)).

(g (n)) je oznaka za inkluziju f (n) 2

Velicina ( ) se tumaci tako da je g (n) donja granica za f (n). U tom smislu, oznaka
f (n) = (g (n)) se tumaci da "f raste najmanje kako raste g".
Iz denicije asimpotskih notacija direktno slijedi naredni teorem.
Teorem. Za bilo koje dvije funkcije f (n) i g (n) vrijedi f (n) =
je f (n) = O (g (n)) i f (n) = (g (n)).

(g (n)) ako i samo ako

1.4.4 o-notacija
Denicija. Neka je g (n) realna funkcija denisana na nekom podskupu skupa prirodnih
brojeva. Sa o (g (n)) se oznacava skup realnih funkcija f (n) denisanih na nekom podskupu skupa realnih brojeva takvih ako i samo ako vrijedi f (n) = O (h (n)) i f (n) 6=
(h (n)).
Ovdje o ( ) oznacava klasu funkcija a f (n) = o (g (n)) je oznaka za inkluziju f (n) 2
o (g (n)).
Oznaka f (n) = o (g (n)) se tumaci da "f raste striktno sporije od g".
9

1.5 Podjela algoritama prema brzini

1 ALGORITMI

1.5 Podjela algoritama prema brzini


1.5.1 Algoritmi konstantnog vremena
Primjer algoritma konstantnog vremena je izbor broja iz liste. Nije bitno koliko je lista
dugacka. U jednom koraku se odabire jedan broj i posao se zavrava. Ako se ulaz poveca
n puta vrijeme izvrenja se ne povecava odnosno "mijenja" se za faktor 1. U tom slucaju
se kaze da algoritam ima brzinu O (1).
Prosta naredba ima (1) vrijeme to je i razlog za naziv. Niz mnogo jednostavnih naredbi
jo uvijek se izvrava u vremenu (1) :
Primjer iz realnog zivota je izbor kandidata za posao tako to se uzima prvi dosije sa
gomile. Nije vazno koliko je kandidata u gomili. Algoritmi sa konstantnim vremenom su
najbolji moguci algoritmi ukoliko vrijeme nije predugacko. Primjeri ovih algoritama su:
- Push i Pop operacije na stack-u (koji sadrzi n elemenata);
- Operacije umeatanja i uklanjanja u redu za izvrenje
1.5.2 Algoritmi u linearnom vremenu
Primjeri ovih algoritama su:
- Prolazak kroz listu (povezane liste ili niza) sa n elemenata
- Nalazenje maksimalnog ili minimalnog elementa u listi ili sekvencijalno pretrazivanje
nesortirane liste od n elemenata
- Prolazak stabla sa n cvorova
- Iterativno racunanje faktorijela broja n;
- Iterativno nalazenje n-tog Fibonacijevog broja
- Utvrivanje da li je broj paran ili ne
Kako bi se naao najveci broj mora se vriti poreenje svakog clana liste od n elemenata.
Linearni algoritmi su veoma uobicajeni u programiranju i generalno su prihvaceni kao
ekasni ako ne postoji bolji poznati nacin za njegovo ubrzanje.
Primjer programskog koda je :
for (int i = 0; i < n; i += c) // O(n)
statement(s);
Dodavanje konstante c brojacu petlje znaci da vrijeme trajanja petlje raste linearno u
odnosu na maksimalnu vrijednost za n. U ovom slucaju se petlja izvrava tacno n=c puta.
Analogno vrijedi ako se brojac i smanjuje za konstantu c.
1.5.3 Algoritmi sa kvadratnim vremenom
Primjeri ovih algoritama su :
- Neki jednostavniji algoritmi sortiranja npr. selection sort n elemenata
- Poreenje dva dvodimenzinalna niza od po n n elemenata
- Nalazenje duplikata u nesortiranoj listi od n elemenata (implementirano sa dvije ugnjezdene petlje)
Broj operacija, u oznaci O (n2 ), je proporcionalan kvadratu dimenzije resursa sa kojim
se radi.

10

1.5 Podjela algoritama prema brzini

1 ALGORITMI

Primjer programskog koda je :


for (int i = 0; i < n * n; i += c) // O(n2 )
statement(s);
Maksimum petlje je n2 tako da je vrijeme izvrenja kvadraticno. U ovom slucaju petlja
se izvrava tacno n2 =c puta.
Primjer ugnjezdene petlje je :
for (int i = 0; i < n; i += c) { // O(n2 )
for (int j = 0; j < n; i += c)
{
statement(s);
}
}
Primjeri algoritama brzine O (nc ), c > 1 su:
- Parsiranje putem stablasto udruzenih gramatika (tree-adjoining grammar parsing),
- Maksimalno poklapanje (matching) dva bipartitna grafa
1.5.4 Algoritmi sa logaritamskim vremenom
Primjeri ovih algoritama su
- Binarno pretrazivanje sortirane liste od n elemenata
- Operacije umetanja i nalazenja 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 velicine ulaza. Ako se ulaz
udvostruci vrijeme izvoenja se samo malo produzi. Klasican primjer algoritma u logaritamskom vremenu je binarno pretrazivanje. Primjer je poznata igra "pogaanje brojeva".
U toj igri jedan igrac mora pogoditi broj koji zamisli drugi igrac. Na svakom koraku se
vri pogaanje na nacin da saigrac kaze da li je predlozeni broj veci ili manji. Ako je broj
izmeu 1 i 100 prvi prijedlog je 50. Time se prostor pogaanja smanjuje za polovinu.
Naredni korak je predlaganje broja koji je u polovini odgovarajuceg intervala cime se
(grubo) suzava krug brojeva za pogaanje. Ako se u toj igri pocetni opseg udvostruci
broj pogaanja se ne udvostrucava. Ako se ulaz poveca n puta potrebno je log2 n lg n
koraka dok se ne doe do inicijalnog opsega.
Primjer programskog koda je :
for (int i = 1; i < n; i *= c) // O(log n)
statement(s);
Mnozenje brojaca petlje konstantom c znaci da maksimalna vrijednost za n mora rasti
eksponencijalno kako bi se vrijeme izvrenja petlje povecavalo linearno pa je iz tog razloga
vrijeme izvrenja logaritamsko. U ovom slucaju se petlja izvrava tacno logc n puta. U
ovom slucaju je ck = n, gdje je k broj prolaza. Na osnovu ovoga je k = logc n. Analogno
vrijedi ako se brojac smanjuje za konstantni faktor c.
Brzinu O (n log n) = O (log n!) (linearitamsko, loglinear, quasilinear) imaju operacije
provoenja Furijeove transformacije, algoritmi sortiranja, kao to su quick sort, merge
sort heap sort.

11

1.5 Podjela algoritama prema brzini

1.5.5 Algoritmi brzine

1 ALGORITMI

Ovi algoritmi se izvravaju proporcionalno kvadratnom korijenu od n (velicina ulaza). U


ovom slucaju se izvrava petlja u kojoj i pocinje naprimjer od 1 i pravi se korak koji se
multiplikativno povecava za konstantu dok se ne postigne uslov
p i i < n. Ova petlja se
necp
e izvriti svih n puta vec ce se zaustaviti kada i dostigne n. Stoga ona ima vrijeme
( n).
Primjer ovog algoritma je trazenje odgovora na pitanje da li je broj n prost. Odgovor
se moze dobiti tako da se provjerava da li je djeljiv sa svim brojevima koji
p su manji od
njega. Ako je n = 100 tada se moze stati ako je djelilac veci od 10 koji je 100.
1.5.6 Algoritmi sa eksponencijalnim vremenom izvravanja
Primjeri ovih algoritama su:
- Problem trgovackog putnika
- Rekurzivna implementacija generisanja Fibonacijevih brojeva
- Hanojski tornjevi
- Generisanje svih permutacija od n elemenata
- Racunanje determinante putem racunanja minora
Ba kao to postoje algoritmi na koje povecanje obima ulaza nema uticaja postoje algoritmi za koje se cini da vrijeme izvrenja eksplodira. Kaze se da se eksponencijalni
algoritmi izvravaju u O (an ) ili eksponencijalnom vremenu. Klasicni primjer algoritma
sa eksponencijalnim vremenom izvrenja je Problem trgovackog putnika (Traveling Salesman Problem - TSP). Ovo je problem koji je do sada najvie izucavan u kompjuterskoj
teoriji.
Zadatak je jednostavan. Dato je n gradova; trgovacki putnik mora obici svaki grad
tacno jednom prije nego ode kuci. Cilj je to uciniti na najbolji moguci nacin bilo da je u
pitanju najjeftiniji ili najkraci put. Pod najoptijim pretpostavkama, jedini poznati nacin
pouzdanog rjeavanja problema je da se ispita svaki moguci put i da se odabere najbolja.
Ne postoji poznati nacin da se eliminie razumni dio putanja bez provjere svake od njih.
Broj putanja je n!.
Algoritme sa eskponencijalnim vremenom izvrenja je potrebno izbjegavati to je vie
moguce. Umjesto direktnog rjeavanja traze se "heuristike" koje su kraci nacini da se
dobiju dobri rezultati ali to nije garancija da su oni i najbolji moguci. Heuristika za
problem trgovackog putnika moze biti : idi na najblizi neposjeceni grad; zatim povezi par
najblizih gradova. Dobra heuristika moze biti teka ali je dobit u programskom rjeenju.
Postoje bitne razlike izmeu pojedinih eksponencijalni algoritama.
Formalno gledano, vrijedi sljedeci 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 )
1.5.7 Kombinacije algoritama
Nizovi naredbi. Za sekvence naredbi, ukljucujuci moguce cijele blokova naredbi, uzima
se najgore moguce vrijeme izvrenja od svih naredbi. Naprimjer, blok vremena log n iza
12

1.5 Podjela algoritama prema brzini

1 ALGORITMI

kojeg slijedi linearni blok ima ukupno vrijeme koje je linearno; efekat log n petlje naprosto
icezava. Ne treba previe brinuti. Stara engleska izreka kaze : brini o dolarima a centi
c
e se brinuti sami za sebe.
Konstrukcije Ako ... inace ... Za ove konstrukcije se uvijek uzima najgori moguci
slucaj ako ne postoji sigurnost ta ce se desiti. Najgori slucaj u bilo kojoj konstrukciji
ovog tipa je da se izvrava bilo if bilo inace dio, koji god da je od njih najgori. Iz prakticnih
razloga se uzima kako da se deavaju obje strane.
Najgori moguci slucaj. U izboru najgoreg moguceg slucaja mogu se slijediti dva prosta
pravila.
1. Ako vrijeme ukljucuje stepen od n kao to je n2 ili n1=2 tada je blok sa vecim stepenom
od n gori
2. Ako su stepeni od n jednaki ili ako nema stepena od n blok sa vie log n je loiji
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 loiji.
Petlje. Vrijeme izvrenja jednostavne petlje (koja sadrzi samo jednostavne naredbe)
zavisi od toga koliko puta se petlja izvrava. Vrijeme petlji u nizu se sabira to znaci da
dominira petlja sa vecim vremenom izvrenja. Primjer je :
for (int i = 0; i < n; i += c) { // O(n)
statement;
}
for (int i = 0; i < n; i += c) { // O(n log n)
for (int j = 0; j < n; i *= c) {
statement;
}
}
Ugnjezdeni blokovi. Ako je blok ugraen unutar drugog bloka efekti se multipliciraju.
Ukupno vrijeme izvrenja postaje (n2 ). Primjer je poreenje dvije nesortirane liste
kako bi se vidjelo da li je neka stavka sadrzana 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 poreenja. Dupliranje
obima ulaza ima za posljedicu cetiri puta duze vrijeme izvrenja.
1.5.8 Rekurzije
Postoje rutine (funkcije, procedure) koje pozivaju same sebe. One su tipicne za pristupe
"podijeli pa vladaj" gdje funkcija ulaz dijeli na manje dijelove i poziva se na svakom od
tih dijelova.
Ako za clanove niza Fn , n = 1; 2; ::: vazi jednakost
Fn = f (Fn 1 ; Fn 2 ; :::; F1 ; n)
kaze se da niz Fn zadovoljava diferentnu jednadzbu ili rekurentni izraz. Specijalno, ako
se za neko k 1 clan Fn izrazava preko k prethodnih clanova niza

13

1.5 Podjela algoritama prema brzini

1 ALGORITMI

Fn = f (Fn 1 ; Fn 2 ; :::; Fn k ; n)
onda je k red te diferentne jednacine. Matematickom indukcijom se pokazuje da je ovaj
niz jednoznacno odreen sa prvih k clanova niza F1 ; F2 ; :::; Fk .
Jedna od najpoznatijih diferentnih jednacina je ona koja denie Fibonacijev niz
Fn = Fn

+ Fn 2 ;

F1 = F2 = 1

Za racunanje vrijednosti Fn potrebno je izvriti n


za velike n.

2 koraka sabiranja to je neprakticno

Nacin procjene brzine algoritma ce biti procijenjen na jednom primjeru. Neka je data
rekurzivna relacija
T (n) = 2 T (n=2) + n;

T (1) = 1

Izraz kojim se izracunava svaki clan niza koji se generie zove se rjeenje. U ovom slucaju
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 nacin da se posao nastavi. Zelja


je da se na desnoj strani
pojavi T (1) to znaci da je
n=2k = 1 ) n = 2k ) k = log2 k
Na osnovu ovoga se nastavlja prethodna jednacina pa je:
T (n) = 2log2 n T (1) + n log2 n =
= n + n log2 n = O (n log n)
Ovaj problem se moze generalizirati na sljedeci nacin. Neka je cilj analiza algoritma A
pri cemu je broj operacija T (n) za ulaz velicine n (vremenska slozenost) dat rekurentnim
izrazom
T (n) = a T

n
+ c nk
b

pri cemu je a; b; c; k > 0, b 6= 0 i zadata je vrijednost T (1). Ovakva jednacina se dobija


za algoritam kod kojeg se obrada ulaza velicine n svodi na obradu a ulaza velicine n=b
poslije cega je potrebno izvriti joc nk koraka da bi se od parcijalnih rjeenja konstruisalo rjeenje kompletnog ulaza velicine n. Za ove algoritme se kaze da su tipa "podijeli
pa vladaj" (divide-and-conquer) to je drugi naziv za algoritme koji su zasnovani na
dekompoziciji. Uobicajeno je da bude b 2 N.
Teorema. Asimptotsko ponaanje niza T (n) rjeenja rekurentnog izraza
14

1.5 Podjela algoritama prema brzini

1 ALGORITMI

T (n) = a T

n
+ c nk
b

(1)

dato je jednakocu
8
< O nlogb a
O nk log n
T (n) =
:
O nk

a > bk
a = bk
a < bk

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

1
t0 = T (1)
c

+ qm;

T (bm ) i q = bk =a. Rjeenje je

tm = t0 +

m
X

qi

i=1

Za q 6= 1 je
m
X
i=1

qi =

q m+1
1 q

pa se asimptotsko ponaanje niza tm opisuje sljedecim jednakostima


8
q=1
< O (m)
O (1) 0 < q < 1
tm =
:
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
a > bk
< O (am ) = O bm logb a = O nlogb a
O (mam ) = O logb n nlogb a = O nk log n a = bk
T (n) =
:
O ((aq)m ) = O bmk = O nk
a < bk
Pogodno je upamtiti neke od narednih relacija.
Rekurzija
T (n) = T
T (n) = T
T (n) = 2
T (n) = T
T (n) = 2

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

Algoritam
Binarno pretrazivanje
Sekvencijalno pretrazivanje
Put po stablu
Selection sort
Merge sort

Table 1: Uporedni pregled brzina algoritama

15

O( )
O (log n)
O (n)
O (n)
O (n2 )
O (n log n)

1.6 Primjeri

1 ALGORITMI

1.6 Primjeri
Primjer 1. Sabiranje ili oduzimanje dva n-bitna cijela broja ima kompleksnost O (n).
Za analizu kompleksnosti mnozenja dva broja potreban je kratki prikaz postupka. Jedan
od mogucih nacina mnozenja 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
Moze 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
n
Tada se moze staviti a = 2 A1 + A0 i b = 2n B1 + B0 . Odavdje je
a b = (22n + 2n ) A1 B1 + 2n (A1 A0 ) (B0 B1 ) + (2n + 1) A0 B0
Ovo znaci da se za proizvod dva 2n-bitna broja moraju izracunati dvije razlike A1 A0
i B0 B1 dva n-bitna broja, tri proizvoda A1 B1 , (A1 A0 ) (B0 B1 ), A0 B0 a zatim
izvriti pomjeranje ulijevo i sabiranje.
Ako se sa M (n) oznaci broj bit operacija potrebnih za mnozenje dva n-bitna cijela broja
onda vrijedi
M (2n) 3 M (n) + C n
gdje je C konstanta. Naime, svako mnozenje dva n-bitna cijela broja zahtijeva M (n)
bitnih operacija a sabiranje, oduzimanje i pomjeranje ulijevo su operacije reda O (n).
Odavdje se dobija relacija
M 2k
D 3k 2k
gdje je D = max fM (2) ; Cg.
Teorem. Mnozenje dva n-bitna cijela broja moze biti izvedeno koritenjem O nlog2 3
bit operacija.
Dokaz. Za mnozenje 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 2. Naci O (n!).
Rjeenje. Kako je n! = 1 2 ::: n = (::: ((2 3) 4) 5:::) n, za racunanje broja n! je
potrebno n 2 mnozenja. Najprije se mnozi 2 3 pa se dobijeni proizvod pomnozi sa 4,
novi rezultat sa 5 itd dok se ne doe do mnozenja sa n. U koraku (i 1) se i! mnozi sa
i + 1 pa je stoga broj mnozenja jednak n 2. Za odreivanje 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
najvie k bita. Stoga je n!, kao proizvod n brojeva sa najvie k bita, najvie 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! najvie n k-bitni. Za mnozenje i!
sa i potrebno je najvie (nk)k = nk 2 bit operacija. Kako ovakvih mnozenja ima (n 2)
to je za izracunavanje n! potrebno najvie
(n 2) (nk 2 ) = n (n 2) (1 + blog2 nc)2 = n (n 2) (lg n)2 = O (n lg n)2
bit operacija.
16

1.7 Primjeri za samostalni rad

1 ALGORITMI

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


Dokaz. Prema deniciji O notacije, T (n) = O (n3 ) ako je T (n) c n3 za neko n n0 .
1
20
c. Ovo vrijedi za svako n n0 = 1 i
Ako je n3 + 20n + 1 c n3 tada 1 + 2 + 3
n
n
c 22. Za vece vrijednosti n0 potreban je manji broj c (npr. za n0 = 10 je c 1:201)
ali u svakom slucaju vrijedi trazena nejednakost.
Primjer 4. Pokazati da vrijeme T (n) = n3 + 20n + 1 nije O (n2 ).
Dokaz. Prema deniciji O notacije, T (n) = O (n3 ) ako je T (n) c n3 za neko n n0 .
1
20
Ako je n3 + 20n + 1 c n3 tada 1 + 2 + 3 c. Lijeva strana posljednje nejednakosti
n
n
raste neograniceno tako da ne postoji konstanta c. Stoga, O uslov ne moze vrijediti u
ovom slucaju.
Primjer 5. Pokazati da je vrijeme T (n) = n3 + 20n + 1 jednako O (n4 ).
Dokaz. Prema deniciji O notacije, T (n) = O (n4 ) ako je T (n) c n4 za neko n n0 .
1
1 20
c. Ovo vrijedi za svako n n0 = 1 i
Ako je n3 + 20n + 1 c n3 tada + 3 + 4
n n
n
c 22. Za vece vrijednosti n0 potreban je manji broj c (npr. za n0 = 10 je c 1:201)
ali u svakom slucaju vrijedi trazena nejednakost.
Primjer 6. Pokazati da je vrijeme T (n) = n3 + 20n jednako (n2 ).
Dokaz. Prema deniciji notacije, T (n) = (n2 ) ako je T (n) c n2 za neko n n0 .
20
c. Lijeva strana nejednakosti ima minimalnu
Ako je n3 + 20n + 1 c n2 tada n +
n
p
vrijednost 8:94 za n = 20. Stoga uslov za vrijedi za svako n n0 = 5 i c 9. Za
vece vrijednosti n0 potreban je veci broj c (npr. za n0 = 10 je c 12:01) ali u svakom
slucaju vrijedi trazena nejednakost.

1.7 Primjeri za samostalni rad


1.
Neka je n prirodan broj i f (n) funkcija koja predstavlja broj bit operacija za
izracunavanje broja 3n . Odrediti O (f ).
2.
Neka je n prirodan broj i f (n) funkcija koja predstavlja broj bit operacija za
izracunavanje broja nn . Odrediti O (f ).
3.
Neka su m i n prirodni brojevi i f (m; n) funkcija koja predstavlja broj bit operacija
n
za izracunavanje binomnog koecijenta
. Odrediti O (f ).
m
4.
Ispitati vrijeme konvertovanja k-bitnog broja u njegovu prezentaciju po bazi B
gdje je B veliki cijeli broj.
n
m
X
X
5.
Neka su f (x) =
ai xi i g (x) =
bi xi polinom i sa cjelobrojnim koecijentima
i=1

i=1

koji su manji od broja t. Uz pretpostavku da je m < n odrediti vrijeme mnozenja ovih


polinoma tj. O (f g).

17

2 ALGORITMI SORTIRANJA

2 Algoritmi sortiranja
Algoritmi sortiranja su primjer matematickih algoritama koji se rjeavaju putem mnogih
drugih razlicitih metoda.
U optem slucaju, sortiranje se shvata kao proces pregrupisavanja datog skupa objekata u
nekom odreenom redoslijedu. Cilj sortiranja je olakati pretrazivanje elemenata u tako
sortiranom skupu. To je skoro univerzalni, fundamentalni zadatak. U svakodnevnom
zivotu se srecemo sa puno primjera kao to su telefonski imenici, rijecnici i slicno.
Izbor algoritama za rjeavanje bilo kog problema zavisi od strukture podataka, to je
skoro zakon, a u slucaju sortiranja takva zakonitost je toliko duboka da se odgovarajuce
metode dijele na dvije klase, sortiranje nizova i sortiranje fajlova. Nekada se nazivaju
unutranje i vanjsko sortiranje, s obzirom da se nizovi pohranjuju u brzo internoj memoriji
dok su fajlovi pohranjeni na spoljnim, sporijim ureajima (diskovi,...). Ovo je moguce
ilustrovati na primjeru sortiranja igracih karata. Ako se karte posmatraju u obliku niza
onda su poslozene na stolu i onaj ko ih sortira vidi ih sve pojedinacno i ima neposredan
pristup svakoj od njih. Ako karte obrazuju fajl to podrazumijeva da je vidljiva samo ona
na vrhu svake gomile. Ovakvo ogranicenje 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 obicno ne racuna po nekom pravilu vec se cuva
kao sastavni dio (polje) svakog elementa. Znacenje te funkcije se naziva kljuc (key).
Metod sortiranja je lokalan (in-place) ako ne koristi dodatne memorijske resurse za sortiranje i stoga je moguce sortirati veoma velike liste bez potrebe alokacije (dodjeljivanja)
dodatnog memorijskog prostora.
Metod sortiranja je stabilan ako se u procesu sortiranja odgovarajuci odnos elemenata sa
jednakim kljucevima ne mijenja. Ovo je cesto pozeljna osobina ako se radi o elementima
koji su vec sortirani nekim metodom koji nema uticaja na kljuc.

2.1 Sortiranje nizova - osnovne metode


Osnovni uslov je da odabrani metod sortiranja nizova ekonomicno koristi dostupnu memoriju. To podrazumijeva da se permutacije kojima se elementi stavljaju u odgovarajuci
poredak obavljaju na tom istom mjestu. Drugim rijecima, metode koje podrazumijevaju
da se elementi niza a premjetaju u niz b predstavljaju bitno manji interes. Zbog ovakvih
ogranicenja algoritmi se klasiciraju po osnovu ekonomicnosti odnosno vremenu rada.
Dobra mjera ekasnosti moze biti C, broj neophodnih uporeivanja kljuceva i M , broj
premjetanja (permutacija) elemenata. Ovi brojevi su funkcija od n, dimenzije niza koji
se sortira.
Mada dobri algoritmi sortiranja trebaju n log n uporeivanja, analiza pocinje od prostijih
i ociglednih algoritama koji se nekada nazivaju direktni. Motiv za ovakav izbor moze biti:
Direktne metode su posebne pogodne za objanjenje karakteristika osnovnih principa obima sortiranja

18

2.1 Sortiranje nizova - osnovne metode

2 ALGORITMI SORTIRANJA

Postupci tih metoda se lako pamte i kratki su. Ne treba zaboraviti da i programi
zauzimaju memoriju
Usloznjavanje metoda trebaju manji broj operacija koje su same po sebi dosta
slozene pa su za male n direktne metode brze mada ih ne treba koristiti za velike n
Metode sortiranja na tekucoj poziciji se dijele na :
Sortiranja putem ukljucivanja (insertion)
Sortiranja putem podjele (selection)
Sortiranja putem zamjene (exchange)
2.1.1 Sortiranje putem ukljucivanja (Insertion sort)
U ovom algoritmu se elementi dijele na vec gotov, sortirani, niz a1 ; :::; ai 1 i niz preostalih
polaznih, nesortiranih, elemenata. Na svakom koraku, pocev od i = 2 koje se uvecava za
1, iz niza preostalih nesortiranih elemenata se uzima jedan element i smjeta (insertuje)
u vec sortirani dio niza na nacin da se stavlja na mjesto koje mu pripada.

i=2
i=3
i=4
i=5
i=6
i=7
i=8

44
44
12
12
12
12
06
06

55
55
44
42
42
18
12
12

12
12
55
44
44
42
18
18

42
42
42
55
55
44
42
42

94
94
94
94
94
55
44
44

18
18
18
18
18
94
55
55

06
06
06
06
06
06
94
67

67
67
67
67
67
67
67
94

Table 2: Tabela 2.1. Ilustracija Insertion sorta

U tabeli 2.1. je ilustrovan primjer procesa sortiranja osam slucajno odabranih brojeva.
Proces trazenja se moze zavriti u jednom od dva slucaja :
Naen je element aj sa kljucem koji je manji od kljuca za x
Dostignut je lijevi kraj sortiranog dijela niza
Ovakav tipican slucaj ponavljajuceg procesa sa dva uslova zavretka dozvoljava koritenje
granicnika (sentinel). U ovom slucaju to moze biti element a0 (to znaci da je dovoljno
dijapazon indeksa proiriti indeksom 0).
Analiza algoritma se pravi prema idealiziranom racunaru, koji ima set instrukcija koje
se nalaze u svakom racunaru kao to je prenos bajta iz memorije u registar, aritmeticke
operacije na registrima, transfer iz registra u memoriju, preenje registara, uslovni skok
i slicno [7]. Takve instrukcije cemo zvati primitivne operacije. Nabrajanje skupa ovih
instrukcija nema smisla u kontekstu analize algoritama pa se prihvata intuitivno shvatanje
ovih operacija. Skup ovih instrukcija ne sadrzi "slozene" operacije kao to je sortiranje.
Broj ovih instrukcija u svakom redu pseudokoda je oznacen sa ci u dijagramu.

19

2.1 Sortiranje nizova - osnovne metode

2 ALGORITMI SORTIRANJA

Procedura InsertionSortDirektni
Ulaz : n; fan g
Izlaz : Sortirani niz fan g
Inicirati i; j; x
2
j
DokVrijedi j < Duzina [a] raditi
{
x
a [j]
IUmetnuti a [j] u sortirani niz a [1; ::; j
i
j 1
DokVrijedi i > 0 & a [i] > x raditi
{
a [i + 1]
a [i]
i
i 1
}
a [i + 1]
x
j
j+1
}

1]

Analiza ove metode se moze objasniti putem naredne tabele.


Neka je sa T (A) oznaceno vrijeme izvrenja ovog algoritma za niz A duzine n. Neka je
sa tj oznaceno koliko puta se izvri petlja u liniji 5. Na taj nacin je t2 vrijeme izveenja
te petlje u prvom koraku petlje iz koraka 2. Na osnovu toga se moze iskalkulisati koliko
puta se izvri svaka linija pseudokoda.
T (a) = 1 + c1 n + (c2 + c4 + c8 + c9 ) (n

1) + c5

n
X
j=2

tj + (c6 + c7 )

n
X

(tj

1)

j=2

Prema ovoj metodi analize, gornja granica se dobija ako se ima u vidu da i pocinje sa
j 1 i opada sa svakom iteracijom sve dok je i > 0. Na taj nacin je tj
j, to se
moze postici ako je niz ureen opadajucim redoslijedom. Na taj nacin se dobija da ovaj
algoritam ima kvadratnu zavisnost od velicine niza odnosno njegova brzina se izrazava sa
O (n2 ).
Analiza ove metode putem broja poreenja i premjetanja [6] pokazuje da je broj poreenja
kljuceva (Ci ) u i-tom koraku moze biti najvie i 1, najmanje 1 a u prosjeku i=2, pod
pretpostavkom da su sve permutacije od n elemenata jednako vjerovatne. Broj premjetanja Mi je jednak Ci + 2 (ukljucujuci barijeru, sentinel). Na tabeli 2.2. su procjene
brzine ovog algoritma.
Minimalne ocjene se mogu desiti kod vec sortiranih nizova a najgore kada je niz sortiran
opadajucim redoslijedom.

2.1.2 Sortiranje putem direktne podjele


Ovaj algoritam se lako poboljava ako se obrati paznja na to da postoji vec sortirani
dio niza. Prirodno je koristiti binarno pretrazivanje u kojem se poreenje obavlja sa
sredinom vec sortiranog niza a zatim se nastavlja prinicip dijeljenja na pola diijela koji se
20

2.1 Sortiranje nizova - osnovne metode

0
1
2
3
4
5

2 ALGORITMI SORTIRANJA

Korak
2
j
DokVrijedi j < Duzina [a] raditi
x
a [j]
IUmetnuti a [j] u sortirani niz a [1; ::; j
i
j 1

Troak
c0
c1
c2
1] 0
c4

DokVrijedi i > 0 & a [i] > x raditi

c5

Dinamika
1
n
n 1
n 1
n 1
n
X
tj
j=2

a [i + 1]

a [i]

c6

n
X

(tj

1)

(tj

1)

j=2

c7

a [i + 1]
x
j
j+1

c8
c9

n
X
j=2

8
9

n
n

1
1

Table 3: U ovoj tabeli kolona Trosak oznaava konstantan broj primitivnih operacija

min
prosjek
max

C
n 1
n2 + n 2
4
n2 + n 4
4

M
3 (n 1)
n2 + 9n 10
4
n2 + 3n 4
4

Table 4: Tabela 2.2. Procjena brzine Insertion sort

treba pretrazivati dok se ne nae tacka ukljucenja. Tako modicirani algoritam se zove
umetanje sa binarnim ukljucivanjem (binary insertion). Pristup je zasnovan na sljedecim
principima:
Bira se element sa najmanjim kljucem
On mijenja mjesto sa elementom a1
Proces se ponavlja sa preostalih n

1 elemenata, zatim n

2 elemenata, itd

Postupak za osam elemenata iz tabele 2.1. je dat na tabeli 2.3.


44
06
06
06
06
06
06
06

55
55
12
12
12
12
12
12

12
12
55
18
18
18
18
18

42
42
42
42
42
42
42
42

94
94
94
94
94
44
44
44

18
18
18
55
55
55
55
55

06
44
44
44
44
94
94
67

67
67
67
67
67
67
37
94

Table 5: Tabela 2.3. Ilustracija sortiranja putem direktne podjele

21

2.1 Sortiranje nizova - osnovne metode

2 ALGORITMI SORTIRANJA

Procedura BinaryInsertion
Ulaz : n; fan g
Izlaz : Sortirani niz fan g
Inicirati i; j; m; L; R; x
Za svaki i = 2; n; 1
{
//Uzeti element niza
x
a [i]
L
1; R
1
// Odrediti lijeve i desne granice
DokVrijedi L < R raditi
{
m = (L + R) =2
Ako je a [m] < x
{
L
m+1
}
Inace
{
R
m
}
}
//Pretraziti sortirani niz
Za svaki j = i; R + 1; 1
{
a [j]
a [j 1]
}
a [R]
x
}
Pseudo kod je dat na prilozenom algoritmu.
Broj zamjena je minimalno Mmin = 3 (n 1) u slucaju da su kljucevi odmah sortirani
a maksimalno Mmax = (n2 =4) + 3 (n 1) ako su pocetni kljucevi poredani opadajucim
redom. Za proracun prosjecnog vremena trajanja uzima se da je ocekivani broj premjetanja jednak sumi Hn = 1 + 1=n + 1=2 + ::: + 1=n. Pri tome su 1=i vjerovatnoce da je i-ti
element manji od prethodnih i 1 elemenata. Ova vrijednost se moze 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 prosjecan broj premjetanja na i-tom koraku jednak Fi =
ln i + g + 1. Prosjecan broj premjetanja, u oznaci Mavg , je suma svih Fi odnosno
Mavg = n (g + 1) +

n
X
i=1

Ova se suma aproksimira integralom


22

ln i

2.1 Sortiranje nizova - osnovne metode

2 ALGORITMI SORTIRANJA

Procedura StraightSelection
Ulaz : niz fan g
Izlaz : Sortirani niz fan g
Inicirati : i; j; k; x
Za svaki i = 1; n; 1
{
k
i
x
a [i]
Za svaki j = i + 1; n; 1
{
Ako je a [j] < x tada
{
k
j
x
a [k]
}
}
a [k]
a [i]
a [i]
x
}
Zn

ln xdx = x (ln x

1)jn1 = n (ln n

1)

n+1

to na kraju daje Mavg = n (n ln +g). Odavdje se izvodi zakljucak da je ovaj algoritam


preporucljiviji u odnosu na sortiranje umetanjem. Ako su kljucevi sortirani ili skoro
sortirani insertovanje je neto bolji algoritam.
Analiza sortiranja putem selekcije pokazuje da ovaj algoritam ne zavisi od pocetnog
rasporeda elemenata. Moze se reci da je realizacija ovog algoritma manje prirodna od
insertovanja. Vrijedi da je
C=

n2

n
2

2.1.3 Sortiranje putem zamjene


Ovaj algoritam se zasniva na poreenju i zamjeni mjesta parova susjednih elemenata
i obavljanja ovog postupka dok se ne sortiraju svi elementi. Kao i u metodi selekcije
prolazi po nizu se ponavljaju pri cemu se svaki put najmanji element preostalog dijela niza
premjeta na lijevi kraj niza. Ako se nizovi posmatraju kao vertikalno a ne horizontalno
elemente je moguce interpretirati kao mjehure u posudi sa vodom, pri cemu tezina svakog
elementa odgovara njegovom kljucu. Na taj nacin se svaki element poput mjehura podize
do pozicije koja mu pripada. Ovaj metod je stoga poznat pod nazivom BubbleSort.
Primjer ovog algoritma je ilustrovan na tabeli 2.3.
Poboljanja ovog algoritma se namecu sama po sebi. Na tabeli 2.4. je vidljivo da posljednja tri prolaza ne uticu na poredak elemenata jer su oni vec sortirani. Ocigledni nacin je
da se postupak obustavi ako nema zamjene mjesta. I ovo se moze poboljati tako da se
pamti i indeks posljednje zamjene.
23

2.1 Sortiranje nizova - osnovne metode


0
44
55
12
42
94
18
06
67

1
06
44
55
12
42
94
18
67

2
06
12
44
55
18
42
94
67

2 ALGORITMI SORTIRANJA
3
06
12
18
44
55
42
67
94

4
06
12
18
42
44
55
67
94

5
06
12
18
42
44
55
67
94

6
06
12
18
42
44
55
67
94

7
06
12
18
42
44
55
67
94

Table 6: Ilustracija BubleSort algoritma

Procedura BubbleSort
Ulaz : niz fan g
Izlaz : Sortirani niz fan g
Inicirati : i; j; x
Za svaki i = 2; n; 1
{
Za svaki j = n; i; 1
{
Ako je a [j 1] > a [j]
{
x
a [j 1]
a [j 1]
a [j]
a [j]
x
}
}
}
Treca mogucnost poboljanja je da se premjetanje vri naizmjenicno u oba pravca tako
da se u jednom smjeru premjetaju elementi na "lake" pozicije a u obratnom na "teze"
pozicije. Ilustracija ovog algoritma, pod nazivom ShakerSort je na tabeli 2.5.
Pseudokod za ShakerSort algoritam je dat na narednom algoritmu.
Analiza BubbleSort algoritma pokazuje da je u osnovnoj verziji broj poreenja jednak
C = (n2

n) =2

dok je minimalni, prosjecni i maksimalni broj zamjena (premjetanja) jednak


Mmin = 0;

Mavg = 3 (n2

n) =2;

Mmax = 3 (n2

n) =4

Analiza poboljanih verzija, posebno ShakerSort-a, je dosta slozena. Minimalni broj


poreenja je Cm = n 1. Knut smatra da p
je prosjecan broj prolaza u poboljanom BubbleSort algoritmu proporcionalan sa n k1 n a prosjecan broj poreenja proporcionalan
sa (1=2) (n2 n (k2 + ln n)). Predlozena poboljanja ne uticu na broj premjetanja, oni
jedino skracuju nepotrebna binarna poreenja. Nazalost, zamjena dva elementa je mnogo
ceca operacija tako da se ne dobiju poboljanja koja bi se ocekivala. Pokazuje se da je
24

2.2 Sortiranje nizova - poboljane metode


L
R
Smjer

2
8
"
44
55
12
42
94
18
06
67

3
8
#
06
44
55
12
42
94
18
67

2 ALGORITMI SORTIRANJA
3
7
"
06
44
12
42
55
18
67
94

4
7
#
06
12
44
18
42
55
67
94

4
4
"
06
12
18
42
44
55
67
94

Table 7: Tabela 2.5. Ilustracija ShakerSort

BubbleSort po karakteristikama negdje izmeu sortiranja umetanjem i sortiranja zamjenom. Fakticki, BubbleSort ne donosi nita novo osim privlacnog naziva. ShakerSort
se uspjeno koristi u slucajevima kada je niz dosta sortiran, to se u praksi dosta rijetko
deava.
Moguce je pokazati da je prosjecno rastojanje za koje se pojedini element pomjera jednako n=3 "mjesta". Svi strogi nacini sortiranja fakticki element na pojedinom koraku
pomjeraju za jednu poziciju to je razlog da trebaju O (n2 ) takvih prolaza. U skladu sa
tim, poboljanja se mogu uvesti ako se usvoji princip da se vri razmjena elemenata na
vecem rastojanju.
U nastavku je pregled poboljanja svake od navedene stroge metode sortiranja.

2.2 Sortiranje nizova - poboljane metode


2.2.1 Shell sort
Shell je 1959. godine predlozio poboljanje metode sortiranja umetanjem (Insertion sort).
Naprije se grupiu i sortiraju elementi koji su jedan od drugog na rastojanju 4 mjesta to
se naziva 4-mjesno sortiranje. Nakon toga se vri grupisanje i sortiranje elemenata koji
su na rastojanju 2 mjesta to se naziva 2-mjesno sortiranje. Na kraju se provodi klasicno
sortiranje po jednoj poziciji.
Na prvi pogled se moze postaviti pitanje : ako je neophodno nekoliko ciklusa sortiranja
da li je takav postupak ekasniji od osnovnog ? Na ovaj nacin je potreban manji broj
premjetanja. Vidljivo je da svaki i prolaz objedinjava dvije grupe vec obavljenih 2i
sortiranja. Ocito je da se razlike (rastojanja) meu grupama mogu umanjivati na razne
nacine mada se moze desiti, u najgorem slucaju, da se sav posao obavi u posljednjem
koraku. Nije uvijek ocigledno da princip umanjivanja razlika moze dati bolje rezultate
ako razlike nisu stepeni od 2. Svih t eventualnih rastojanja se iz tog razloga obiljezava
sa h1 ; h2 ; :::; ht pri cemu je bitan uslov ht = 1; hi+1 < hi .
Svako h-sortiranje se provodi kao sortiranje umetanjem (Insertion Sort). Pritom se jednostavnost uslova zavretka osigurava sistemom barijera. Stoga se niz proiruje ne jednom
barijerom a0 vec sa h1 komponenti. Za t = 4 algoritam se naziva ShellSort.
25

2.2 Sortiranje nizova - poboljane metode

2 ALGORITMI SORTIRANJA

Procedura ShakerSort
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
{
Ako je a [j 1] > a [j] tada
{
x
a [j 1] ; in
a [j 1]
a [j]
a [j]
x
k
1
}
}
L
k+1
Za j = L; R; 1
{
Ako je a [j 1] > a [j] tada
{
x
a [j 1] ;
a [j 1]
a [j]
a [j]
x
k
1
}
}
R
k 1
}
SveDok vrijedi L > R
U nastavku je primjer ShellSort algoritma.
Polazni niz : 44
55
12
42
94
18
06
67
Sortiranje sa 4 mjesta : 44
18
06
42
94
55
12
Sortiranje sa 2 mjesta : 06
18
12
42
44
55
94
Sortiranje sa 1 mjestom : 05
12
18
42
44
55
67

67
67
94

Analiza ShellSort algoritma je postavila nekoliko veoma tekih matematickih problema


od kojih neki jonisu rijeeni. Kao najbitnije, nije pokazano koja rastojanja daju najbolji
rezultat. Postoji zacuujuca cinjenica : rastojanja ne smiju biti meusobni mnozitelji.
Ovo dozvoljava da se izbjegne pojava iz primjera kada se formiraju podnizovi koji se ne
presijecaju. Stoga je interakcija dva niza pozeljna to je vie moguce. Knut je predlozio
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 slucaju rezultati proporcionalni sa n1:2 . Mada je ova vrijednost bitno bolja
od n2 to ne znaci da se ne mogu praviti nova poboljanja.

26

2.2 Sortiranje nizova - poboljane metode

2 ALGORITMI SORTIRANJA

Procedura ShellSort
Ulaz : Niz fan g
Izlaz : Sortiran niz fan g
Konstanta t = 4
Inicirati i; j; k; s; fht g
h [1] = 9; h [2] = 5; h [3] = 3; h [4] = 1
Za svako m = 1; t; 1
{
k
h [m]
s
k
//barijera
Za svako i = k + 1; n; 1
{
x
a [i]
j
i k
Ako je s = 0
{
s
k
}
s
s+1
a [s]
x
DokVrijedi x < a [j] raditi
{
a [j + k]
a [j]
j
j k
}
a [j + k]
x
}
}
2.2.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 veci od pivota. Zatim se rekurzivno sortira
svaki od dijelova. Za QuickSort se, generalno, smatra da je najbrzi od algoritama sortiranja (na modernim mainama). Jedno od objanjenja je da unutranja 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
koristi drugi niz za pohranu. Nije stabilan. Postoji stabilna verzija QuickSort algoritma
ali ona nije lokalna. Ovaj algoritam je (n log n) u ocekivanom slucaju i (n2 ) u najgorem slucaju. Ako je implementiran prikladno, vjerovatnoca da ce algoritam trajati
asimptotski duze (pod pretpostavkom da je pivot odabran slucajno) je ekstremno mala
za veliko n.

Ilustracija QuickSort algoritma

27

2.2 Sortiranje nizova - poboljane metode

2 ALGORITMI SORTIRANJA

2.2.3 Merge sort


MergeSort takoe radi rekurzivno. Ovo je klasicni algoritam tipa "podijeli pa vladaj".
Niz se dijeli u dva podniza priblizno iste velicine i oni se sortiraju rekurzivno. Zatim se
sortirani podnizovi objedinjuju (merge) u (n) vremenu.

Ovo je jedini stabilni algoritam sortiranja. Loa strana ovog tipa sorta je to je jedini
algoritam koji zahtijeva dodatni niz za pohranu (ako se ignorie stek za rekurziju) i stoga
nije lokalni jer objedinjava dva niza u treci. Iako je moguce da se nizovi objedine u
vremenu (n).
2.2.4 Heap sort
Heap sort se zasniva na lijepoj strukturi podataka koja se naziva heap (gomila, skup,
plast,...) koji je ekasna implementacija strukture podataka koja se zove red prioriteta
(priority queue). Ova struktura podrzava operacije umetanja kljuca i brisanja elementa
koji ima najmanju vrijednost kljuca.

Heap moze biti formiran za n kljuceva u (n) vremenu a najmanji element moze biti
izvucen u (log n) vremenu. Heap sort je algoritam u mjestu (lokalno) ali nije stabilan.
Heap sort radi na nacin da formira heap, u obratnom redoslijedu tako da maksimum
moze biti dobijen ekasno i zatim se ponavlja postupak uzimanja najveceg elementa.

Cinjenica
da se preuzima maksimalni a ne minimalni element je detalj implementacije ali
je to kljucni element rada algoritma u mjestu (lokalno).
Ako se zeli uzeti k najmanjih vrijednosti heap to moze omoguciti u (n + k log n) vremenu. Heap ima dodatnu prednost u koritenju u kontekstima gdje se mijenja kontekst
elemenata. Svaka izmjena prioriteta (vrijednosti kljuca) moze biti uraena u (log n)
vremenu.

28

3 POHLEPNI ALGORITMI

3 Pohlepni algoritmi
U mnogim algoritmima optimalizacije potrebno je praviti veliki broj selekcija. U dinamickom programiranju optimalno rjeenje se opisuje ne rekurzivan nacin a zatim se
kalkulacije obavljaju "odozdo na gore". Dinamicko programiranje je mocna tehnika ali
cesto vodi ka algoritmima koji se izvravaju duze nego to se zeli. Danas se koriste alternativne tehnike koje se zovu pohlepni (greedy) algoritmi. Ovaj metod tipicno vodi ka
jednostavnijim i brzima algoritmima ali jo uvijek nije dovoljno snazan i iroko koriten
kao to je to slucaj sa dinamickim programiranje. Kada pohlepni algoritam ne daje optimalno rjeenje cesto daju brze heuristike (neoptimalne strategije rjeavanja), to se dobro
koristi u nalazenju dobrih aproksimacija.

3.1 Rasporeivanje aktivnosti


Ovo je veoma jednostavan problem rasporeda. Dat je skup S = f1; 2; :::; ng od n aktivnosti koje se rasporeuju za koritenje nekog resursa pri cemu svaka aktivnost pocinje
u momentu si i zavrava u datom momentu fi . S obzirom da se koristi samo jedan resurs
i da se neka vremena starta i zavretka mogu preklapati ne moze se udovoljiti svim zahtjevima. Kaze se da aktivnosti i i j nisu povezani ako se vremena njihovog starta zavretka ne preklapaju, formalno [si ; fi ) \ [sj ; fj ) = . Problem rasporeda aktivnosti
je izbor najveceg moguceg broja aktivnosti a ne najvece iskoritenje. Naravno, mogu se
postaviti razliciti kriteriji ali pohlepni pristup ne mora, generalno, biti optimalan.
Prilikom rjeavanja, intuitivno se daje prednost kratkim aktivnostima. Ovo sugerie
narednu pohlepnu stragegiju : ponavljati izbor aktivnosti sa najmanjim trajanje (fi si )
i rasporeivati ih tako da nemaju uticaj ni na jednu prethodnu aktivnost. Mada ovo
zvuci kao razumna strategija pokazuje kao neoptimalna. U nekim slucajevima dizajn
korektnog pohlepnog algoritma trazi nekoliko razlicitih strategija dok se ne dobije ona
koja je najbolja.
U ovom slucaju postoji strategija koja radi. Intuicija je ista. S obzirom da se izbjegavaju
aktivnosti koje dugo traju izabire se aktivnost koja zavrava prva i stavlja se na raspored.
Zatim se preskacu sve aktivnosti koje se sa njom preklapaju i stavlja se na red aktivnost
koja ima najranije vrijeme zavretka itd. Kako bi se ubrzao proces selekcije pretpostavlja
se da su aktivnosti sortirane prema njihovim vremenima zavretka odnosno
f1

f2

:::

fn

U nastavku je algoritam pod pretpostavkom da je napravljeno ovo sortiranje. Izlaz je


lista rasporeda aktivnosti.

29

3.2 Knapsack problem (problem ranca)

3 POHLEPNI ALGORITMI

Varijabla prev drzi indeks posljednje aktivnosti u rasporedu u bilo koje vrijeme kako bi
se utvrdila preklapanja.
Jasno je da je algoritam prilicno jednostavan i ekasan. U smislu trajanja i/ili resursa
naglaena je aktivnost sortiranja po osnovu vremena zavretka tako da je ukupno vrijeme
trajanja (n log n).

Na slici je primjer. Svaka aktivnost je prezentirana intervalom pocetka i zavretka. Sortiranje je izvreno prema vremenu zavretka. Vidi se da je i raspored f2 ; f4 ; f7 optimalan
jednako kao f1 ; f4 ; f7 .

3.2 Knapsack problem (problem ranca)


Klasicni (0 1) knapsack problem je poznat problem optimalizacije. Lopov obija radnju
i nalazi n predmeta koje moze uzeti. Predmet i vrijedi vi i tezak je wi , gdje su vi i wi
30

3.2 Knapsack problem (problem ranca)

3 POHLEPNI ALGORITMI

cijeli brojevi. On zeli uzeti to je moguce vecu vrijednost ali ima ranac u koji staje roba
u vrijednosti najvie W . ta ce uzeti ? Razlog za naziv (0 1) je to lopov uzima (1)
ili ostavlja (0) predmet. Ovo je klasicni problem industrijskog pakovanja. Drugi primjer
ovog problema je problem u kojem se trazi odgovor da li je moguce na datih n nosilaca
medija, npr. disketa, jednakog kapaciteta x smjestiti m fajlova velicina y1 ; y2 ; :::; ym .
Problem ranca (knapsack problem) (0 1) je tezak za rjeavanje i to je, u sutini, NPproblem (to znaci da vjerovatno ne postoji ekasno rjeenje).
Sa druge strane, u frakcionom problemu ranca postavka je identicna ali lopov moze uzeti
dio tezine i dio vrijednosti. Postoji veoma jednostavan i ekasan pohlepni algoritam za
frakcioni problem ranca.
Kao i u slucaju drugih pohlepnih algoritama, ideja je da se nae pravi redoslijed u kojem se
stavke obrauju. Intuitivno, dobro je imati visoku vrijednost i loe je imati veliku tezinu.
Postoji nekoliko izbora koji se mogu probati ali radi samo jedan. Neka je i = vi =wi to
oznacava odnos vrijednosti i tezine. Stavke se sortiraju opadajucim redom velicine i i u
tom redoslijedu se dodaju. Ako stavka odgovara uzima se cijela. U nekom momentu ce
se pojaviti stavka koja ne popunjava preostali prostor. Uzimamo koliko je moguce od te
stavke kako bi se ranac popunio u cjelosti.

3.2.1 Korektnost
Intuitivno je jasno vidjeti da je pohlepni algoritam optimalan za frakcionalni problem.
Ako je dat ranac zlata, srebra i bronze ocigledno je da ce se najprije uzeti zlata to je
moguce vie, zatim srebra i na kraju bronze. Rezultat ne bi bio dobar ako bi se uzelo
manje zlata koje bi se zamijenilo sa jednakom kolicinom bronze.
Formalno, pretpostavimo da pohlepni algoritam nije optimalan. To bi znacilo da postoji
alternativni izbor koji je optimalan. U tom slucaju se stavke sortiraju opadajucim redom
u odnosu na vrijednost. Uzmimo prvu stavku i za koju se dva izbora razlikuju. Prema
31

3.3 Pohlepni algoritmi na grafovima

3 POHLEPNI ALGORITMI

deniciji, pohlepni izbor daje veci obim stavke i nego alternativni (jer pohlepni izbor
uvijek uzima to vie moze). Recimo da pohlepni uzima x vie jedinica nego alternativni. Svi naredni elementi alternativne selekcije su manje vrijednosti od vi . Zamjenom
x jedinica bilo koje od tih stavki sa x jedinica stavke i povecala bi se ukupna vrijednost
alternativnog izbora. Meutim, ovo implicira da alternativna selekcija nije optimalna to
je kontradikcija.
Moguce je pokazati neoptimalnost 0 1 problema ranca. Za to moze posluziti navedeni
primjer. Ako se stavke sortiraju po i tada se najprije uzima stavka tezine 5 zatim 20
a zatim bi se uzela stavka tezine 30, jer se stavka tezine 40 ne moze prihvatiti, tako da
se dobije vrijednost 220$. Sa druge strane, da je postupak bio manje pohlepan i da je
ignorisana stavka tezine 5 tada bi se mogle uzeti stavke tezine 20 i 40 za ukupnu vrijednosti
260$. Ovo svojstvo "odlaganja boljeg rezultata" kako bi se dobilo bolje ukupno rjeenje
je indikacija da pohlepno rjeenje nije optimalno.

3.3 Pohlepni algoritmi na grafovima


Uobicajeni problem u komunikacionim mrezama i dizajnu elektricnih kola je povezivanje
skupa cvorova (komunikacionih cvorova ili elemenata elektricnog kola) pomocu najkrace
moguce mreze, lija je duzina suma duzina pojedinih veza. Pretpostavlja se da je mreza
neusmjerena. Kako bi se minimizirala duzina mreze ne smije se dopustiti postojanje petlji.
Rezultat je graf koji je povezan, neusmjeern i aciklican i kao takav se zove slobodno stablo.
Racunski problem se zove problem minimalno razapinjuceg stabla (Minimum Spanning
Tree, krace MST). Formalnije, za dati povezani neusmjereni graf G = (V ; E) razapinjuce
stablo je aciklicni skup ivica T R koje povezuju sve cvorove. Pretpostavlja se da svaka
ivica w (u; v) grafa G ima numericku tezinu ili cijenu (koja moze biti negativna ili nula)
cijena stabla T se denie kao suma ivica razapinjuceg stabla
X
w (T ) =
w (u; v)
(u;v)2T

Minimalno razapinjuce stablo je ono koje ima minimalnu tezinu. Ovo stablo ne mora biti
jedinstveno. Ako sve ivice imaju razlicitu tezinu tada su minimalna razapinjuca stabla
razlicita (ovo jo nije dokazano vec cinjenica koja se koristi.

Slika prikazuje tri razapinjuca stabla za isti graf. U sredini i desno su su dva minimalna
razapinjuca stabla.

32

3.3 Pohlepni algoritmi na grafovima

3 POHLEPNI ALGORITMI

Postoje dva pohlepna algoritma, Kruskalov i Primov, za nalazenje minimalnog razapinjuceg stabla. Podsjetimo se da je pohlepni algoritam onaj koji rjeenje nalazi ponavljanjem selekcije najjetinije (ili generalno lokalno optimalnog izbora) od raspolozivih opcija
na svakoj etapi. Vazna karakteristika pohlepnih algoritama je da prave izbor koji ne
opozivaju. Prije prezentacije potrebne su neke bitne cinjenice o slobodnim stablima.
Lema.
Slobodno stablo sa n cvorova ima tacno n

1 ivica

Postoji jedinstveni put izmeu 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 numericke vrijednosti tezine
(pozitivne, negativne ili nula). Intuicija u pozadini pohlepnih MST algoritama je jednostavna : odrzava se podskup ivica A koji je inicijalno prazan i dodaje se jedna po jedna
ivica sve dok A ne postane MST. Kaze se da je S E most (prelaz) ako je podskup ivica
nekog MST (ne moze se reci MST jer nije neophodno i jedinstven). Kaze se da je ivica
(u; v) 2 EnA sigurna ako je A [ (fu; vg) prelaz. Drugim rijecima, izbor (u; v) je siguran
izbor tako da A jo uvijek moze formirati MST. Ako je A prelaz ne moze sadrzavati
ciklus. Izvorni (genericki pohlepni algoritam radi tako da dodaje sigurne ivice na tekuce
razapinjuce stablo. Potrebno je voditi racuna 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 tacka u S a
druga u V nS. Za dati podskup ivica A se kaze da podjela potuje A ako ne postoje ivice
u A koje prelaze podjelu. Nije teko vidjeti zato je potovanje podjele vazno za ovaj
problem. Ako je formiran djelimicni MST i ako se zeli znati koje ivice koje mogu biti
dodate i koje ne formiraju ciklus u tekucem MST, bilo koja ivica koja prelazi potujucu
podjelu je moguci kandidat.
Ivica u E je lagana ivica koja prelazi podjelu ako ima minimalnu duzinu od svih ivica
koje prelaze podjelu. Lagana ivica moze ne biti jedinstvena. Prema intuiciji, s obzirom
da sve ivice koje prelaze potujucu podjelu ne formiraju ciklus tada je lagana ivica koja
prelazi podjelu prirodan izbor.
MST Lema. Neka je G = (V; E) povezan neusmjereni graf sa ivicama realnih vrijednosti.
Neka je A prelazni podskup od E (odnosno podskup nekog MST) i neka je (S; V nS) bilo
koja podjela koja potuje A i neka je (u; v) lagana ivica koja prelazi podjelu. Tada je
(u; v) sigurna za A.

33

3.3 Pohlepni algoritmi na grafovima

3 POHLEPNI ALGORITMI

3.3.1 Kruskalov algoritam


Kruskalov algoritam radi tako da se ivice dodaju na A u rastucem redoslijedu tezina
(najprije lake ivice). Ako naredna ivica ne formira ciklus unutar tekuceg skupa ivica
tada se dodaje u A. Ako formira ciklus tada se ivica proputa i razmatra se sljedeca
ivica u poretku. Kako algoritam odmice formira se uma (stablo) u cvorovima. Tokom
algoritma ova stabla se udruzuju sve dok se ne dobije stablo koje sadrzi sve cvorove.
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 sadrzi cvor u. Posmatra se Podjela (A0 ; V nA0 ). Svaka ivica koja prelazi podjelu nije
u A tako da ta podjela potuje A i (u; v) je lagana ivica preko podjele (jer su sve laganije
ivice iskoritene ranije u algoritmu). Stoga je (u; v) sigurna ivica.
Teki dio algoritma je kako ekasno detektovati da li dodavanje ivice kreira ciklus u A.
Moze se provesti pretrazivanje 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 moze uraditi putem strukture podataka koja
se zove Unija-Trazenje (Union-Find) dva disjunktna skupa. Ova struktura podrzava tri
operacije:
KreiratiSet(u) : Kreiranje skupa koji sadrzi stavku u.
NaciSet(u) : Nalazenje skupa koji sadrzi datu stavku u.
Union(u;v) : Spojiti skup koji sadrzi u i skup koji sadrzi v u zajednicki skup.
Svaka od ovih operacija se izvrava u O (log n) vremenu na skupu velicine n. Ova struktura je zanimljiva jer se niz od n operacija izvrava mnogo brze 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 moze biti pohranjen kao jednostavna lista ivica. Primjer je
pokazan na narednoj slici.

Kruskalov algoritam. Svaki cvor je oznacen u skladu sa skupom u kojem je sadrzan

34

3.3 Pohlepni algoritmi na grafovima

3 POHLEPNI ALGORITMI

Analiza. Koliko dugo traje Kruskalov algoritam ? Kao i obicno, neka je V broj cvorova
i E broj ivica. S obzirom da je graf povezan moze se uzeti da je E V 1. Za sortiranje
ivica potrebno je (E log E). Petlja se ponavlja E puta a svaka iteracija ukljucuje
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 izvrenja
jednako njihovoj sumu koja je ((V + E) log V ). S obzirom da V u asimptotskom smislu
nije vece od E slijedi da je vrijeme izvrenja (E log V ).
3.3.2 Primov algoritam
Primov algoritam je drugi pohlepni algoritam za minimalno razapinjuce stablo. Od
Kruskalovog algoritma se razlikuje samo u nacinu odabira naredne sigurne ivice koja
se dodaje na svakom koraku. Vrijeme izvrenja je potpuno jednako kao za Kruskalov
algoritam. Ovaj algoritam pokazuje da postoji vie od jednog nacina da se rijei ovaj
problem. Osim toga, veoma je slican drugom pohlepnom algoritmu, Dijkstra algoritmu,
kojim se rjeava potpuno druga vrsta problema : najkraci put u mrezi.
Kruskalov algoritam radi tako da sortira ivice i umece ih jednu po jednu u razapinjuce
stablo vodeci racuna da se nikada ne formira ciklus. Intuitivno gledano, Kruskalov algoritam radi tako da spaja dva stabla ili ih razdvaja sve dok se sve ivice ne nau u istom
stablu.
Za razliku od njega, Prim-ova algoritam gradi stablo dodavanjem po jednog lista na tekuce
stablo. Startuje se sa korijenskim cvorom r koji moze biti bilo koji. U bilo koje vrijeme
podskup ivica A formira jedno stablo (u Kruskalovom algoritmu se formira uma). Trazi
se dodavanje cvora kao lista na stablo. Proces je ilustrovan na narednoj slici.

Prim-ov algoritam

Ako se posmatra skup cvorova S koji je dio stabla i njegov komplement tada postoji
podjela grafa i tekuci skup ivica A potuje tu podjelu. MST lema kaze da je sigurno
dodavanje lagane ivice. Na slici to je ivica tezine 4 koja ide u cvor u. Stoga se u dodaje
u cvorove skupa S i dijeli izmjene. Treba primijetiti da neke ivice koje vie ne sijedu
podjelu koju su presijecale podjelu prije ovog koraka nestaju a javljaju se nove koje nisu
presijecale tu podjelu.

35

3.3 Pohlepni algoritmi na grafovima

3 POHLEPNI ALGORITMI

Lako je vidjeti da je za ekasnu implementaciju Prim-ovog algoritma kljucno ekasno


azuriranje podjele i brzo odreivanje lagane ivice. Da bi se to ucinilo 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 kljuc.
Naredna slika ilustruje Prim-ov algoritam. Strelice indiciraju pointere (pokazivace) sljednika a numericka vrijednost u svakom cvoru je vrijednost kljuca.

Ilustracija Prim-ovog algoritma

Za analizu Prim-ovog algoritma racuna se vrijeme potroeno na svakom cvoru nakon to se


preuzme iz reda prioriteta (priority queue). Ova aktivnost uzima O (log V ) vremena. Za
svaku ivicu se potroi oko O (log V ) vremena kako bi se smanjio kljuc susjednih cvorova pa
je vrijeme O (log V + deg (u) log V ). Ostali koraci azuriranja 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
X u2V
= log V
(1 + deg (u)) = (log V ) (V + 2E) = ((V + E) log V )
u2V

S obzirom da je G povezan V asimptotski nije veci od E tako da je rezultat


To je tacno jednako sa procjenom za Kruskalov algoritam.

(E log V ).

3.3.3 Dijkstra algoritam


Ovaj algoritam je namijenjen trazenju najkraceg puta u usmjerenim grafovima. Pretpostavlja se da ivice grafa imaju svoje vrijednosti i cilj je naci najkrace putanje iz jednog
cvora u sve cvorove grafa.
Distanca izmeu dva cvora u i v, u oznaci (u; v), je minimalna duzina putanje od u do
v.

36

3.3 Pohlepni algoritmi na grafovima

3 POHLEPNI ALGORITMI

Problem najkraceg puta iz jednog cvora (single source shortest path) se denie na sljedeci
nacin. Dat je usmjeren graf sa nenegativnim tezinama ivica G = (V ; E) i izdvojenim
pocetnim cvorom s 2 V . Problem je odrediti distancu pocetnog cvora do svakog cvora u
grafu.
Moguce je imati grafove sa negativnim tezinama ivica ali kako bi najkraci putevi bili
dobro denisani potrebno je dodati zahtjev da uopte nema ciklusa cija je ukupna tezina
negativna (inace bi se mogao napraviti beskonacno kratak put kretanjem zauvijek u tom
ciklusu). Ovdje se naglaava posao racunanja minimalne distance od pocetnog cvora do
svakog cvora. Racunanje stvarne duzine je dosta lagano proirenje problema. Za svaki
cvor se formira pointer pred (v) koji ukazuje na pocetak. Slijedeci pointere prethodnika
unazad od bilo kojeg cvora konstruie se reverzna slika najkraceg puta do v.
Osnovna struktura Dijkstra algoritma je odrzavanje procjena najkraceg puta za svaki
cvor, u oznaci d [v]. Intuitivno gledano, d [v] ce biti duzina najkraceg puta od s do v koji
je poznat algoritmu. Ova vrijednosti je uvijek veca ili jednaka sa stvarno najkracim 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 ukljucuje vie
cvorova azurira se d [v] za svaki cvor u grafu sve ove vrijednosti ne konvergiraju ka stvarno
najkracoj distanci.
Proces kojim se vri azuriranje procjene se zove relaksacija. Intuitivno gledano, ako nije
postignuta optimalna vrijednost ona je bliza ka optimumu. Posebno, ako se otkrije put
od s do v koji je kraci od d [v] tada se vri azuriranje te vrijednosti. Ovaj metod je
zajednicki za veliki broj algoritama optimalizacije.
Posmatra se ivica od cvora u do cvora v cija je tezina w (u; v). Pretpostavka je da postoje
procjene za d [u] i d [v]. Poznato je da postoji put od s do u sa tezinom d [u]. Ako se uzme
ta putanja i ako se slijedi ivica (u; v) dobija se putanja do v duzine d [u] + w (u; v). Ako
je ta putanja bolja od postojeceg puta do v duzine d [v] tada se d [v] azurira na vrijednost
d [u] + w (u; v). Potrebno je zapamtiti da najkraci put do v prolazi kroz u to se cini tako
da se azurira pointer prethodnika za v.

Primjer relaksacije

Treba primijetiti da kad god se d [v] postavi na konacnu vrijednost uvijek postoji trag
o putanji te duzine. Stoga je d [v]
(s; v). Ako je d [v] = (s; v) tada naknadne
relaksacije ne mogu promijeniti tu vrijednost.
Nije teko vidjeti da ako se relaksacija provede nad svim ivicama grafa vrijednosti d [v]
obavezno konvergiraju konacnoj stvarnoj vrijednosti iz s. Cilj svakog dobrog algoritma
nalazenja najkraceg puta je da se azuriranja obavljaju na pametan nacin kako bi konvergencija bila to je moguce brza. Posebno, najbolji nacin bi bio da se operacije relaksacije
37

3.3 Pohlepni algoritmi na grafovima

3 POHLEPNI ALGORITMI

poredaju na nacin da se relaksacija za svaku ivicu provede tacno jednom. Tacno ovo radi
Dijkstra algoritam.
Dijkstra algoritam je zasnovan na izvravanju ponovljenih relaksacija. On radi tako da
odrzava podskup cvorova, S
V , za koji se proglaava 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 moze biti implementiran koritenjem niza boja koje su dodijeljene cvorovima.
Inicijalno su svi cvorovi bijeli a boja [s] = crna kako bi se naznacilo da v 2 S.
Dijkstra je prepoznao da je najbolji nacin relaksacije povecanje poretka distance od izvora.
Na taj nacin, kad god se provodi relaksacija moguce je zakljuciti da rezultat relaksacije
daje konacnu vrijednost distance. Za implementaciju ovog koncepta za svaki cvor u 2
V nS se odrzava 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 neobraeni cvor koji je (prema
procjeni) najblizi ka s.
Kako bi se ova selekcija izvrila ekasno, cvorovi iz V nS se stavlja u red prioriteta (tj.
heap - gomila) gdje je kljucna vrijednost svakog cvora u jednaka d [u]. Primjetna je
slicnost sa Primovim algoritmom iako se koriste razlicite vrijednosti. Za svaki cvor je
poznata lokacija u redu prioriteta i svaka stavka u redu prioriteta "poznaje" koji cvor
prezentira.

Prikaz Dijkstra algoritma

Zbog slicnosti sa Primovim algoritmom vrijeme izvrenja je jednako,


Drugi algoritmi kojima se rjeava problem najkraceg puta su :
- Floyd Warshall-ov algoritam
- Algoritam mravlje kolonije

38

(E log V ).


4 SLUCAJNI
BROJEVI

4 Slucajni brojevi
4.1 Uvod
Generator slucajnih brojeva je racunarski program ili zicki ureaj dizajniran da generie
sekvence brojeva ili simbola koji ne prate nikakav obrazac ponaanja odnosno prikazuju
se kao slucajno odabrani. Za generisanje stvarno slucajnih brojeva koriste se hardverski
ureaji, u dananje vrijeme razni dodaci na personalni racunar. Slucajni brojevi su
rezultat zickih procesa unutar ureaja. Racunarski algoritmi, ma koliko dobri, ne mogu
generisati potpuno slucajne brojeve vec brojeve koji u vecoj ili manjoj mjeri simuliraju
slucajnost izbora pa se zovu pseudoslucajni brojevi.
Mnoge primjene slucajnosti su dovele do razvoja nekoliko razlicitih metoda generisanja
slucajnih podataka. Mnoge od njih postoje od antickih vremena ukljucujuci kockicu,
bacanje novcica, mijeanje karata i mnoge druge tehnike. Zbog mehanicke prirode ovih
tehnika generisanje velikog broja dovoljno slucajnih brojeva, to je vazno za statistiku,
iziskuje puno napora i/ili vremena. Stoga se rezultati nekada prikupljaju i distribuiraju
u obliku tablica slucajnih brojeva. Nakon renesanse kompjuterski podrzanih generatora
slucajnih brojeva sve je veci broj zvanicnih lutrija i igara na srecu koje koriste generatore
umjesto tradicionalnih metoda izvlacenja. Ovi generatori se danas koriste kako bi se
ustanovili eventualni nedostaci modernih slot maina.
Jednu od poznatijih denicija slucajnih brojeva dao je prof. D. H. Lehmer (1951), pionir
racunarske tehnologije i racunarske teorije brojeva :
Slucajni brojevi su nejasna notacija u kojoj je svaki clan nepredvidiv u odnosu na
inicijalne velicine i cije cifre prolaze odreen broj testova koji se tradicionalno koriste od
strane statisticara.
Jedan od interesantnijih brojeva je 0.95012928514718. Ovo je prvi broj koji se producira
od strane generatora slucajnih brojeva koji je ugraen u Matlab. Svi korisnici Matlaba
na bilo kom racunaru dobijaju ovaj broj kao slucajni. Ocigledno je da ovo nije slucajni
broj u smislu u kojem se to moze ocekivati prema intuitivnom shvatanju ovog pojma.
Ako racunar nema pristupa nekom eksternom ureaju kao to je brojac gama zraka ili
sat onda brojevi koje producira ne mogu biti stvarni slucajni brojevi.

4.2 Uniformna distribucija


Lehmer je izmislio multiplikativni kongruentni algoritam koji je osnova mnogih dananjih
generatora slucajnih brojeva. Lehmerovi generatori ukljucuju tri parametra, a; c i m i
inicijalnu vrijednost x0 koja se zove sjeme. Prema njegovoj deniciji, niz slucajnih brojeva
je denisan izrazom
xk+1 = (a xk + c) mod m
Za a = 13, c = 0, m = 31, x0 = 1 dobija se sekvenca
1; 13; 14; 27; 10; 6; 16; 22; 7; 29; 5; 3; :::
Prvih 30 clanova ovog niza je permutacija brojeva od 1 do 30 a zatim se sekvenca ponavlja.
Stoga se kaze da ovakav niz ima period m 1. Ako se niz pseudoslucajnih cijelih brojeva
podijeli sa m dobija se uniformno distribuirani brojevi u pokretnom zarezu iz intervala
[0; 1]. U prethodnom primjeru to je niz
39


4 SLUCAJNI
BROJEVI

4.2 Uniformna distribucija

0:0323; 0:4194; 0:4516; 0:8710; 0:3226; 0:1935; 0:5161; :::


U 1960-im Scientic Subroutine Package (SSP) na IBM mainframe racunarima je ukljucivao generator slucajnih brojeva koji se zvao RND ili RANDU. To je bio multiplikativno
kongruentalni algoritam sa parametrima a = 65539, c = 0 i m = 231 . Sa internim oblikom pohrane (32 bita) aritmetika mod 231 se lako izvrava. S obzirom da je a = 216 + 3
mnozenje se izvravalo pomjeranjem (shift) i dodavanjem. Ovakve pretpostavke su bile
vazne za racunare tog doba ali je dobijena sekvenca veoma nepozeljnih svojstava. Postoje
sljedece relacije:
2

xk+2 = (216 + 3) xk+1 = (216 + 3) xk


= (232 + 6 216 + 9) xk
= [6 (216 + 3) 9] xk
Stoga je
xk+2 = 6 xk+1

9 xk

Rezultat je ekstremno velika korelacija izmeu tri sukcesivna slucajna broja.


Dugo godina je funkcija uniformno distribuiranih slucajnih brojeva bio multiplikativni
kongruentalni generator sa parametrima a = 75 , c = 0, m = 231 1 = 2147483647. Ove
vrijednosti su bile preporucene od strane Park i Miller (1988). Starije verzije programa
Matlab generiu slucajne brojeve u obliku k=m za k = 1; :::; m 1. Najmanji broj je
0:00000000046566 a najveci je 0:99999999953434. Sekvenca se ponavlja nakon neto vie
od dva miliona brojeva. Do prije nekoliko godina ovo je smatrano kako sasvim dovoljno.
Meutim, dananji racunari ovo urade za manje od pola sata.
Godine 1995. Matlab je uveo potpuno novu vrstu generatora slucajnih brojeva. Algoritam je zasnovan na radu George Marsaglia, profesora na Florida State University i autora
klasicne analize generatora slucajnih brojeva pod nazivom "Random numbers fall mainly
in the planes".
Njegov generator ne koristi kongruentalni algoritam. U sutini, uopte nema mnozenja i
dijeljena. Dizajniran je na nacin da generie brojeve u pokretnom zarezu. Umjesto jednog
sjemena novi generator ima 35 rijeci interne memorije ili stanja. Trideset i dvije od tih
rijeci formiraju cache za brojeve u pokretnom zarezu, z, u intervalu [0; 1]. Preostale tri
rijeci sadrze inteks i koji se mijenja od 0 do 31, jednog cijelog broja j i aga za "pozajmljivanje" b. Cjelokupan vektor stanja se gradi po jedan bit u periodu inicijalizacije.
Razlicite vrijednosti j daju razlicita inicijalna stanja.
Generisanje i-tog broja u pokretnom zarezu ukljucuje korak "oduzimanja-sa-pozajmljivanjem"
gdje se broj u keu mijenja sa razlikom druga dva
zi = zi+20

zi+5

Tri velicine i; i + 20 i i + 5 se interpretiraju po modulu 32 (koritenjem njihovih 5 zadnjih


bitova). Velicina b se dobija iz prethodnog koraka; ona je ili nula ili mali pozitivni broj.
Ako je zi pozitivan tada je b = 0 za naredni korak; ako je zi negativan dodavanjem
velicine 1:0 se pretvara u pozitivan prije nego se sacuna i b se postavlja na vrijednost 253
za naredni korak. Velicina 2 53 , koja je polovina Matlabore velicine eps, se zove ulp jer
je unit in the last place za brojeve u pokretnom zarezu malo manja od 1.
40


4 SLUCAJNI
BROJEVI

4.3 Normalna distribucija

Marsaglia je pokazao da niz ima period skoro 21430 vrijednosti prije ponavljanja. Meutim,
algoritam ima nedostatak. Svi brojevi su rezultati sabiranja i oduzimanja brojeva u
inicijalnom keu tako da su svi oni multiplikandi od 2 53 . U skladu sa tim, mnogi brojevi
iz intervala [0; 1] se ne dobijaju kao rezultat ovog algoritma.
Brojevi u pokretnom zarezu izmeu 1=2 i 1 su jednako rasporeeni sa razlikom od jedan
ulp i generator oduzimanja-sa-pozajmljivanjem ce generisati skoro sve od njih. Brojevi
manji od 1=2 su manje blisko razdvojeni i generator ce propustiti vecinu tih brojeva. On
generie samo polovinu mogucih brojeva iz intervala [1=4; 1=2], samo cetvrtinu brojeva iz
intervala [1=8; 1=4] itd. To je mjesto na kojem se pokazuje uticaj velicine j.

4.3 Normalna distribucija


Skoro svi algoritmi koji generiu normlano distribuirane slucajne brojeve su bazirani na
transformaciji uniformne distribucije.
Starije verzije Matlab-a koriste polarni algoritam koji generie dvije vrijednosti istovremeno. Zasniva se na nalazenju slucajne tacke u jedinicnom krugu putem generisanja uniformno distribuiranih tacaka u kvadratu [ 1; 1] [ 1; 1] i odbacivanja svega van kruga.
Tacke unutar kruga su predstavljene putem vektora sa dvije komponente.
Pocev od Matlaba 5 generator slucajnih brojeva u normalnoj distribuciji koristi sosticirani algoritam trazenja u tabeli koji je razvio, takoe, George Marsaglia. Nazvan je
ziggurat algoritam.
Funkcija gustine vjerovatnoca normalne distribucije je tzv. zvonasta kriva
f (x) = c e

x2 =2

p
gdje je c = 1= 2 normalizacijska konstanta koja se u ovom slucaju moze ignorisati.
Ako se generiu slucajne tacke (x; y) uniformno distribuirane u ravni i ako se odbaci
bilo koja od njih koja nije ispod krive preostale vrijednosti x formiraju zeljenu normalnu
distribuciju. Ziggurat algoritam obuhvata prostor ispod funkcije gustine sa neto vecom
povrinom sa n sekcija.

41


4 SLUCAJNI
BROJEVI

4.3 Normalna distribucija

Ilustracija ziggurat algoritma

Slika pokazuje slucaj za n = 8; stvarni kod koristi n = 128. Gornjih n 1 sekcija su


pravougaonici. Donja sekcija je pravougaonik zajedno sa beskonacnim repom ispod grafa
f (x). Desne ivice pravougaonika su u tackama zk , k = 1; :::; n oznacene kruzicima. Sa
f (z1 ) = 1 i f (zn+1 ) = 0 visina k-te sekcije je f (zk ) f (zk+1 ). Kljucna ideja je da
se izaberu zk tako da sve sekcije, ukljucujuci neogranicenu na dnu grafa, imaju jednake
povrine. Postoje drugi algoritmi koji aproksimiraju prostor ispod funkcije gustine sa
pravougaonicima. Svojstva koja izdvajaju Marsaglia-ov algoritam su cinjenice da su
pravougaonici horizontalni i da imaju jednake povrine.
Za specicirani broj n sekcija moguce je rijeiti transcedentnu jednadzbu kako bi se nalo
zn , tacka u kojoj beskonacni rep sijece prvu pravougaonu sekciju. Na slici sa n = 8 se
dobija da je zn = 2:34. U stvarnom kodu sa n = 128 je zn = 3:4426. Jednom kad se
dobije zn lako je izracunati zajednicke povrine i druge tacke zn sa desne strane. Takoe
je moguce izracunati k = zk 1 =zk koji pokazuje koji dio svake sekcije lezi ispod naredne
sekcije koja je iznad i ovo se zove core. Na slici je oznacen crtanim linijama. Racunanje
velicina zk i k se obavlja prilikom inicijalizacije koja se obavlja samo jednom.
Nakon koraka inicijalizacije normalno distribuirani slucajni brojevi se brzo racunaju.
Kljucni dio koda racuna jedan slucajni cijeli broj j izmeu 1 i n i jedan uniformno
distribuiran slucajni broj u izmeu 1 i 1. Nakon toga se pravi provjera da li u pada
ispod funkcije gustine a njegova vrijednost se vraca kao uzorak iz normalne distribucije.
Vazno je napomenuti da mada ziggurat step funkcija samo aproksimira funkciju gustine
rezultujuca distribucija je tacno normalna. Smanjenje velicine n smanjuje potrebu za
prostorom koji je potreban za tabele i povecava vrijeme dodatnih racunanja ali nema
uticaja na tacnost. Sa ovim algoritmom Matlab na racunaru od 800 Mhz moze generisati
preko 10 miliona slucajnih brojeva u manje od jedne sekunde.
42


4 SLUCAJNI
BROJEVI

4.4 Testiranje slucajnosti

Jednostavna rucna metoda generisanja slucajnih brojeva je tzv. metoda sredine kvadrata,
koja je sugerisana od strane Von Neumana. Mada jednostavna za implementaciju rezultat
je veoma lo kvalitet.
Ilustracija metoda ce biti napravljena tako da se odabere cetvorocifren broj npr. n =
6729. Taj broj se kvadrira pa se dobije 62792 = 39425841; iz njega se izdvoje srednje
cetiri cifre n = 4258 i to je naredni clan niza itd. U matematickom smislu, generisanje se
odvija po rekurentnom izrazu [x2k =100] xk+1 (mod 10000)

4.4 Testiranje slucajnosti


Jedan od problema generisanja pseudoslucajnih brojeva je utvrivanje u kojoj mjeri su
slucajni. Za ovo se standardno koriste statisticki testovi. Meutim, za takav nacin rada
potrebno je znati ili pretpostaviti distribuciju pod kojom se brojevi generiu. U nekim
slucajevima to je veliki operativni problem jer nekada distribuciju, naprosto, nije moguce
pretpostaviti odnosno utvrditi.
Jedan od nacina da se utvrdi u kojoj mjeri su brojevi slucajni je Benfordov zakon. Ovaj
zakon izrazava distribuciju vodecih cifara. Vjerovatnoca da ce cifra d biti vodeca je
1
. Pritom se pretpostavlja da skup brojeva zadovoljava jedan broj uslova.
log 1 +
d
Ovaj zakon je prvi formulisao ali ne i dokazao Simon Newcomb (1881), americki astronom.
Primijetio je da su logaritamske tablice pohabanije na pocetku, na osnovu cega je zakljucio
da je to posljedica navike da se vie koriste brojevi koji pocinju sa 1 ili 2. Isti zakon je
ponovo otkrio Frank Albert Benford (1938), inzinjer u laboratorijama General Electrica.
On je otiako korak dalje i svoje nalaze potvrdio uzimanjem uzoraka iz najrazlicitijih
izvora (berzanski indeksi, kucne adrese, brojevi sa novinskih stranica, povrine jezera,
duzine rijeka itd).
Jedno od objanjenja ovog fenomena je u cinjenici da su mantise logaritama brojeva
uniformno distribuirane tako da su brojevi distribuirani logaritamski. Iz tog razloga se
ovaj zakon objanjava pomocu kongruencije po modulu 1.

Slide rule, ilustracija Benfordovog zakona

Na slici je tzv. slide rule (kolo srece). Unutranja skala ilustruje distribuciju mantisa dok
spoljna skala ilustruje distribuciju njima pripadajucih brojeva.
43


4 SLUCAJNI
BROJEVI

4.4 Testiranje slucajnosti

Bitno svojstvo koje se koristi za testiranje slucajnosti je tzv. mjerna invarijantnost. Ona
se ocituje u tome da se dinamika vodecih cifara zadrzava ako se svaki clan uzorka pomnozi
istim brojem.

Test slucajnosti koritenjem Benfordovog zakona

Ako se cijeli uzorak 232 puta pomnozi sa 1:01 tada to odgovara mnozenju sa 10 odnosno
pomjeranju zareza za jedno mjesto udesno (1:01232
10). Isti efekat vrijedi ako se
obavlja dijeljenje. U svakom od mnozenja se biljezi dinamika odabrane vodece cifre. Na
slici je ilustracija ovog postupka na uzorku regularnih podataka, koji su uzeti iz procesa
koji se odvija bez spoljnih uticaja (npr. nansijske transakcije, mjerenja i slicno), i
uzorku slucajnih brojeva. Ako su brojevi slucajni tada se dobija valovita kriva (desno);
za podatke iz regularnih procesa dobija se kriva bez valova (lijevo). Najvaznija osobina
ovog nacina testiranja je to za njegovo provoenje nije potrebno poznavati distribuciju
podataka.

44

5 NP KOMPLEKSNOST

5 NP kompleksnost
Tokom 60-ih godina napravljeni su veliki pomaci u nalazenju ekasnih rjeenja za mnoge
kombinatorne probleme ali je nastala rastuca lista problema za koje se cinilo da ne postoji
ekasno algoritamsko rjeenje. Ljudi su poceli traziti neku nepoznatu paradigmu koja bi
vodila ka rjeenju tih problema ili dokaz da su mozda ti problemi sami po sebi teki za
rjeavanje i da ne postoje algoritamska rjeenja koja rade ispod eksponencijalnog vremena.
Krajem 60-ih napravljeno je veliko otkrice. Mnogi od ovih problema su meusobno
povezani u smislu da ako je bilo koji od njih bilo moguce rijeiti u polinomijalnom vremenu
tada bi se mogao rijeiti svaki od njih. Otkrice je skrenulo paznju na N P -kompletnost
i kreiran je mozda najveci problem u kompjuterskoj nauci : P = N P ? Cilj vie nije
dokazati da problem moze biti ekasno rijeen prezentiranjem algoritma. Umjesto toga
pokuava se pokazati da problem ne moze biti rijeen ekasno. Kako to uciniti ?
Potreban je neki nacin da se klasa ekasno rjeivih problema odvoji od problema koji
ne mogu biti ekasno rijeeni. To se moze uciniti analizom problema koji mogu biti
rijeeni u polinomijalnom vremenu. Zadatak da se dokaze da neto ne moze biti ucinjeno
ekasno mora se analizirati mnogo pazljivije kako se ne ostavila mogucnost bilo kome
da pravila kri na neprihvatljiv nacin i istovremeno tvrdi da postoji ekasno rjeenje ako
takvo rjeenje stvarno ne postoji.
Jedan od pristupa je mjerenje vremena izvrenja algoritama koritenjem scenarija kompleksnosti najgoreg slucaja kao funkcije od n, velicine ulaza. Postoji vie nacina ali im
je zajednicki imenitelj broj bitova (ili bajtova) za prezentaciju ulaza korienjem razumno
ekasnog kodiranja. Naprimjer, brojevi se mogu pisati unarnom notacijom 111111111 =
1002 = 8 umjesto binarnom; grafovi se mogu opisivati na neki neekasan nacin kao to je
lista svih njegovih ciklusa ali je to neprihvatljivo. Pretpostavka je da se brojevi prikazuju
u bazi veceg reda, da su grafovi opisani matricama ili listom itd.
Uobicajeno je da se brojevi ogranice na cijele (kao suprotnost "realnim" brojevima) pa
je jasno da se aritmeticke operacije mogu provoditi ekasno. Pretpostavka je da se operacije sa cijelim brojevima provode u konstantnom vremenu. Radi veceg opreza, moze
se pretpostaviti da aritmeticke operacije zahtijevaju barem onoliko vremena kolika je
preciznost brojeva koji su predmet pohrane.
Denicija. Za algoritam koji zavisi od prirodnih brojeva n1 ; n2 ; :::; nr od k1 ; k2 ; :::; kr
bita respektivno kaze se da radi u polinomijalnom vremenu ako postoje prirodni brojevi
d1 ; d2 ; :::; dr takvi da je broj potrebnih bit operacija za njegovo izvrenje O k1d1 ; :::; krdr .
Za problem se kaze da je rjeiv u polinomijalnom vremenu ako postoji algoritam koji ga
rjeava u polinomijalnom vremenu.
Neke funkcije koje ne "izgledaju" kao polinomijalne (kao to je O (n log n)) su ogranicne
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 velicine
n i cijeli broj k koji radi u vremenu O nk . On nije polinomijalni jer je k ulazna velicina
takva da je korisniku omoguceno da odabere k = n to povlaci da je vrijeme izvrenja
O (nn ) a to nije polinom po n. Vazno je napomenuti da eksponent mora biti konstanta
nezavisna od n.
45

5.1 Problemi odlucivanja

5 NP KOMPLEKSNOST

Naravno, reci da su algoritmi polinomijalnog vremena "ekasni" nije tacna. Algoritam


cije je vrijeme izvrenja O (n1000 ) je sigurno veoma neekasan. Bez obzira na to, ako
algoritam radi loije nego u polinomijalnom vremenu (npr. 2n ) tada je sigurno da nije
ekasan osim za male vrijednosti n.
Denicija. Algoritam je subeksponencijalni ako je njegova slozenost funkcija oblika
O eo(n) gdje je n duzina ulaznog podatka.

5.1 Problemi odlucivanja


Mnogi od problema ukljucuju optimalizaciju u nekoj formi : naci najkraci put, naci
najmanje razapinjuce stablo, naci triangulaciju najmanje tezine itd. Iz prevashodno
tehnickih razloga najveci dio N P -problema ce biti nazvan problemom odlucivanja. Problem se naziva problemom odlucivanja ako je njegov rezultat jedan od odgovora "Da" ili
"Ne".
Mnogi problemi se mogu formulisati kao problemi odlucivanja. Naprimjer, problem najmanjeg razapinjuceg stabla se moze formulisati na sljedeci nacin : Za dati tezinski graf
G i cijeli broj k da li G ima razapinjuce stablo koje je najvie k ?
Ovo se moze ciniti kao mnogo zanimljivija formulacija problema. Ovdje se ne postavlja
pitanje tezine minimalnog razapinjuceg stabla niti za ivice stabla za koje se dostize ova
tezina. Meutim, zadatak je pokazati da odreeni problemi ne mogu biti rijeeni ekasno.
Ako se pokaze da jednostavni problem odlucivanja ne moze biti rijeen ekasno tada je
sigurno da ni mnogo generalniji problem sigurno ne moze biti rijeen ekasno.
U nastavku je nekoliko denicija koje su od pomoci u razumijevanju terminologije koja
se javlja kad su u pitanju algoritmi odlucivanja.
Denicija. Za algoritam se kaze da je decidan ako na postavljeno pitanje uvijek daje
odgovor Da ili Ne. Za algoritam se kaze da je vjerovatnosni ako koristi slucajne brojeve.
Denicija. Da-bazirani Monte Carlo algoritam je vjerovatnosni algoritam za decidne
probleme gdje je odgovor Da uvijek tacan ali odgovor Ne moze biti netacan. Obratno
se denie Ne-bazirani algoritam Monte Carlo. Kaze se da Da-bazirani algoritam Monte
Carlo ima greku vjerovatnoce " ako je mogucnost da rezultat algoritma bude odgovor
Ne kada bi taj odgovor trebao biti Da najvie ".
Denicija. Las Vegas algoritam je vjerovatnosni algoritam koji za odreenu vrstu problema moze ne dati odgovor sa vjerovatnocom 0
" < 1. Ako algoritam daje odgovor
onda je taj odgovor uvijek korektan.
Dakle, Las Vegas algoritam moze ne vratiti odgovor ali odgovor koji daje mora biti tacan,
za razliku od Monte Carlo algoritma koji uvijek daje odgovor ali on nije uvijek tacan.
Prema tome, ako se za rjeavanje nekog problema koristi Las Vegas algoritam onda se on
jednostavno iznova pokrece ponovo dok se ne dobije odgovor. Vjerovatnoca da algoritam
ne pruzi odgovor za m pokuaja puta je "m . Da bi algoritam bio u stanju dati odgovor
broj pokretanja je prosjecno 1 1 " .

46

5.2 Problemi prepoznavanja jezika

5 NP KOMPLEKSNOST

5.2 Problemi prepoznavanja jezika


Potrebno je uociti da se o problemu odlucivanja moze razmiljati kao o problemu prepoznavanja jezika. Jezik L se moze denisati kao
L = f(G; k) jG posjeduje MST tezine najvie kg
Ovaj skup se sastoji od parova u kojem je prvi element graf (odnosno matrica kodirana
kao string) a drugi cijeli broj kodiran kao binarni broj. Na prvi pogled moze izgledati
cudno da se graf denie kao string ali je ocigledno da se u racunaru 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 povlaci da G posjeduje razapinjuce stablo tezine najvie k i "Ne" u suprotnom slucaju.
U prvom slucaju se kaze da algoritam "prihvata" ulaz a u suprotnom "odbacuje" ulaz.
Za bilo koji dati jezik se moze postaviti pitanje koliko teko je utvrditi da li je dati
string u jeziku ili ne. Naprimjer, u slucaju MST jezika L clanstvo se moze lako utvrditi
u polinomijalnom vremenu. Dovoljno je graf pohraniti interno, pokrenuti Kruskalov
algoritam i vidjeti da li je dobijena optimalna tezina najvie k ili ne.
Denicija. Neka je sa P oznacen skup svih jezika za koje clanstvo moze biti testirano u
polinomijalnom vremenu.
Potrebno je primijetiti da su jezici skupovi stringova a P je skup jezika. P je denisan
u terminima kojima se iskazuje koliko je teko racunarski prepoznati clanstvo u jeziku.
Skup jezika koji je denisan u terminima koliko teko je utvrditi clanstvo se zove klasa
kompleksnosti. S obzirom da se moze pronaci minimalno razapinjuce stablo u polinomijalnom vremenu tada vrijedi da je L 2 P .
Postoji i tezi jezik
M = f(G; k) : G ima jednostavnu putanju tezine barem kg
Za dati graf G i cijeli broj k kako bi se prepoznalo da li je on u jeziku M ? Moze se
pokuati pretrazivanje grafa i traziti jednostavni putevi sve dok se ne nae neki tezine k.
Ako se takav put pronae graf se prihvata i posao se prekida. Meutim, ako se ne nae
moze se potroiti puno vremena u pretrazivanju pa se ne moze dati pravi odgovor.
Prvi korak je da se deniu razne klase slozenosti odlucivanja.
Denicija. Klasa slozenosti P je skup problema odlucivanja za koje postoji polinomijalni
algoritam.
U sutini, to je skup svih problema odlucivanja koji mogu biti rijeeni u polinomijalnom
vremenu. Obicno se nazivaju "jednostavni" ili "ekasno rjeivi".
Denicija. Klasa slozenosti N P se sastoji od svih problema odlucivanja za koje se
odgovor DA moze provjeriti u polinomijalnom vremenu koritenjem neke dodatne informacija zv. certikata. Klasa slozenost co N P se denie analogno za odgovor NE.

47

5.2 Problemi prepoznavanja jezika

5 NP KOMPLEKSNOST

To je skup svih problema odlucivanja koji mogu biti vericirani u polinomijalnom vremenu. Ova klasa sadrzi P kao podskup. Stoga, ona sadrzi veliki broj jednostavnih
problema ali sadrzi i veliki broj problema za koje se vjeruje da ih je teko rijeiti. Oznaka
ne znaci "NePolinomijalni". Izvorno je ovo oznaka za "Nedeterministicko Polinomijalno
vrijeme". Ovaj koncept je mnogo lake objasniti i shvatiti iz perspektive verikacije.
Denicija. Klasa slozenosti N P tezak (NP-hard) se sastoji od problema za koje vrijedi
da ako se jedan od njih moze rijeiti u polinomijalnom vremenu tada bi svi NP problemi
bili rjeivi u polinomijalnom vremenu.
Unatoc nazivu, NP-teko ne znaci da je problem teko rijeiti. Ako je problem NP-tezak
to ne mora znaciti da je u NP klasi. S obzirom da se vjeruje da nisu svi NP problemi
rjeivi u polinomijalnom vremenu vjeruje se da nijedan NP-tezak problem nije rjeiv u
polinomijalnom vremenu.
Denicija. Problem je N P

kompletan ako je (1) NP, (2) NP-tezak.

To znaci da je N P C = N P \ N P

tezak.

Denicija. Strogo NP-kompletan problem je NP-kompletan problem koji ostaje takav


kada su svi brojevi u ulazu ograniceni nekim polinomom u funkciji duzini ulaza.
Primjeri ovih algoritama su Satisability, Hamiltonov ciklus, Problem tri boje.
Jedan od primjera NP-kompletnog problema je popularna igra Minesweeper [11] koja je
uobicajeni dio instalacije Windows operativnog sistema, sa brojnim varijacijama. Igrac
ove igre ne treba pogaati da li je kvadrat sigurno slobodan. Slicno, igrac markira svaku

minu koja sigurno moze biti identicirana. Cinjenica


da je Minesweeper NP-kompletan
problem znaci da je veoma teko pogoditi kada je moguce sigurno ocistiti neki kvadrat
uz potpuno znanje o tome. Drugim rijecima, potreban je odreeni stepen pogaanja. U
sutini, ako je i unaprijed receno da pogaanje nije potrebno jo uvijek moze biti teko
odluciti kada je kvadrat prazan ili zauzet.

Moguci odnos problema po kompleksnosti

48

5.3 Verikacija polinomijalnog vremena i certikati

5 NP KOMPLEKSNOST

Slika ilustruje jedan od mogucih nacina interpretacije kako bi mogao izgledati odnos
skupova P, NP, NP-tezak, NP-kompletan. Naglaeno je "moguci odnos" jer jo nije
poznato da li su ove klase kompleksnosti disjunktne ili su sve rjeive u polinomijalnom
vremenu. Neki od problema na slici iziskuju dublju diskusiju. Jedna od njih se odnosi na
Izomorzam grafova u kojem se postavlja pitanje da li su dva grafa identicna do nivoa
imena njihovih ivica. Poznato je da je problem NP ali nije poznato da li je u P. Drugi je
QBF to je skracenica za Quantied Boolean Formulas. U tom problemu su date bulovske
formule sa kvantikatorima 8 i 9 i potrebno je dati odgovor na pitanje da li je formula
tacna ili ne.

5.3 Verikacija polinomijalnog vremena i certikati


Vazno je dati napomene o algoritmima verikacije. Mnogi problemi prepoznavanja jezika
su teki za rjeavanje ali imaju svojstvo da je lako verikovati da li je string jezik.
Kao primjer ce biti uzet problem Hamiltonovog ciklusa. Za dati neusmjereni graf G se
postavlja pitanje da li postoji ciklus koji obilazi sve cvorove tacno jednom. Ovaj problem
se moze opisati kao problem prepoznavanja jezika
HC = f(G) : G ima Hamiltonog ciklusg

gdje je sa (G) oznacava graf kao string. Cini


se da je problem Hamiltovnog ciklusa mnogo
tezi i nije poznat algoritam u polinomijalnom vremenu koji rjeava ovaj problem.

Na slici je primjer ciklusa koji je Hamiltonov i jednog koji to nije. Ako se poe 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 tacno jednom.
Stoga, iako nije poznat ekasan nacin da se rijei problem Hamiltonovog ciklusa postoji
veoma ekasan nacin verikacije (provjere) da li je dati graf u HC. Dati ciklus je certikat.
To je dio informacije koji omogucava da se verikuje da je dati string jezik.
Formalno, za dati jezik L i za x 2 L algoritam verikacije je algoritam koji za dato x i
dato y, koje se naziva certikat, moze vericirati da je x u jeziku L koristeci taj certikat
kao pomoc. Ako x nije u L tada nema nicega za verikaciju.
49

5.3 Verikacija polinomijalnog vremena i certikati

5 NP KOMPLEKSNOST

Treba uociti da nemaju svi jezici svojstvo da ih je lako vericirati. Naprimjer, neka su
dati sljedeci jezici :
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 omogucila
da se verikuje da je G stvarno jezik ? Moze se dati primjer jedinstvenog Hamiltonovog
ciklusa i to bi se moglo vericirati ali koja vrsta certikata je potrebna kako bi se utvrdilo
da je to jedini graf ? Moze se uzeti drugi ciklus koji nije Hamiltonov ali to ne znaci da
nema drugog ciklusa koji jeste Hamiltonov. Moze se pokuati sa svim ciklusima tezine n
ali bi to uopte ne bi bilo ekasno jer postoji ukupno n! ciklusa. Stoga je teko zamisliti
da se moze dati informacija koja bi omogucila da se ekasno uvjerimo da je dati graf u
jeziku.
5.3.1 NP klasa
Kako je receno, NP se denie kao skup svih jezika koji mogu biti vericirani algoritmom u polinomijalnom vremenu. Zato je dat naziv NP umjesto VP ? Originalan naziv
je skracenica od "Nedeterministicko Polinomijalno vrijeme". Ovo se odnosi na program
koji se izvrava na nedeterministickom racunaru koji se moze zamisliti. U osnovi, takav
kompjuter bi mogao nedeterministicki pogoditi vrijednost certikata i zatim vericirati
u polinomijalnom vremenu da je string u jeziku. Ovdje je izbjegnuta denicija nedeterminizma.
NP je, kao i u slucaju P, skup jezika zasnovan na nekoj mjeri kompleksnosti (kompleksnost verikacije). Potrebno je uociti da je P
N P . Drugim rijecima, ako se problem
moze rijeiti u polinomijalnom vremenu tada se clanstvo sigurno moze vericirati u polinomijalnom vremenu.
Nije poznato da li je P = N P . Ne cini se razumnim da ovo vrijedi. Drugim rijecima, biti
u mogucnosti da se verikuje da se ima ispravno rjeenje ne pomaze mnogo u nalazenju
stvarnog rjeenja. Mnogi eksperti vjeruju da je P 6= N P ali to niko nije dokazao.

Ilustracija odnosa P i NP problema

50

5.4 Redukcije NP kompleksnosti

5 NP KOMPLEKSNOST

Na tabeli je lista NP i odgovarajucih P problema. Na desnoj strani su problemi koji


mogu biti ekasno rijeeni. Na lijevoj strani je skup "tvrdih oraha" koji vec decenijama
odolijevaju naporima za njihovo ekasno rjeenje.

5.4 Redukcije NP kompleksnosti


Klasa NP kompletnih problema se sastoji od skupa problema odlucivanja (jezika) za koje
niko ne zna. Ako bi bilo poznato rjeenje u polinomijalnom vremenu makar ijednog NP
kompletnog problema tada bi svaki NP problem bio rjeiv u polinomijalnom vremenu.
Za ovo je potrebno uvesti koncept redukcije.
Prije toga je potrebno razmotriti sljedece pitanje. Pretpostavimo da postoje dva problema
H i U . Za H se zna (ili cvrsto vjeruje) da je tezak odnosno da ne moze biti rijeen u
polinomijalnom vremenu. Sa druge strane, kompleksnost za U je nedenisana ali se

sumnja da je jako tezak. Zeli


se dokazati da U ne moze biti rijeen u polinomijalnom

vremenu. 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 rijecima, da bi se pokazalo ad U nije rjeiv u polinomijalnom vremenu pretpostavlja se da postoji algoritam kojim se U rjeava u polinomijalnom vremenu pa se
izvodi kontradikcija kojom se pokazuje da H moze biti rijeen u polinomijalnom vremenu.
Neka je data podutina koja moze rijeiti bilo koju instancu problema U u polinomijalnom
vremenu. Sve to je nuzno u tom slucaju je pokazati da se ta rutina moze koristiti da
se problem H moze rijeti u polinomijalnom vremenu. Time je problem H reduciran na
problem U . Vazno je uociti da je ta pretpostavljena rutina u sutini imaginacija (fantasy).
Zna se (ili se cvrsto vjeruje) da H ne moze biti rijeen u polinomijalnom vremenu pa se
dokaz svodi na to da takva rutina ne moze postojati to povlaci da U ne moze biti rijeen
u polinomijalnom vremenu. Ovo je veoma vazno sa stanovita razumijevanja pojma i
koncepta redukcije.
5.4.1 Problem tri boje
Naredni problem je dobro poznat kao NP kompletan pa se cvrsto vjeruje da ne moze biti
rijeen u polinomijalnom vremenu.
Problem tri boje : Da li svaki cvor datog grafa G moze biti oznacen jednom od tri
razlicite boje tako da ne postoje dva susjedna cvora koji imaju istu boju ?
Ovaj tip problema, obicno u oznaci 3Col, se javlja u raznim problemima particioniranja
pri cemu je ogranicenje da dva objekta ne mogu biti u istom setu particije. Pojam
"bojenja" dolazi od izvorne primjene u bojenju geografskih karata. Dvije drzave koje
imaju zajednicku granicu bi trebale na mapi biti obojene sa dvije razlicite boje. Dobro je
poznato da grafovi u ravni mogu biti obojene sa cetiri boje i za ovakav problem postoji
51

5.4 Redukcije NP kompleksnosti

5 NP KOMPLEKSNOST

algoritam polinomijalnog vremena. Cini


se da je utvrivanje da li je to moguce za tri
boje, cak i za grafove u ravni, tezak problem za koji nije poznat algoritam polinomijalnog
vremena.

Na slici su dva grafa od kojih je jedan moguce obojiti na trazeni nacin a drugi ne.
Problem bojenja sa tri boje ima ulogu H problema za koji se sumnja da je moguce
rijeiti u polinomijalnom vremenu.
Neka je U sljedeci problem. Za dati graf G = (V ; E) se kaze 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 znaci
da je podgraf induciran sa V 0 kompletan graf.
5.4.2 Clique pokrivac (cover) (CCov)
Za dati graf G = (V ; E)[i cijeli broj k skup cvorova se moze podijeliti u podskupove
V1 ; V2 ; :::; Vk takve da je
Vi = V i da je svaki Vi clique od G.
i

Problem Clique pokrivaca se javlja u aplikacijama klasteringa2 . Ivica izmeu dva cvora
se znati da li
se stavlja ako su oni dovoljno slicni da budu klasterisani u istu grupu. Zeli
je moguce klasterisati sve cvorova u k grupa.
Pretpostavimo da se zeli rijeiti CCov problem ali nakon uzaludnih i besplodnih napora ne
moze se naci algoritam polinomijalnog vremena. Kako se moze dokazati da nije izvjesno
da CCov nema rjeenje u polinomijalnom vremenu ? Poznato je da je 3Col NP kompletan
problem pa strucnjaci vjeruju da 3Col 2
= P . Osjeca se da postoji neka veza izmeu ova

dva problema. Zeli se dati odgovor na pitanje da li vrijedi


(3Col 2
= P ) ) (CCov 2
= P)
to se pokazuje tako da se dokaze suprotno tvrenje
(CCov 2 P ) ) (3Col 2 P )
2

Klastering je grupisanje po nekoj osobini slicnosti. Pritom se "slicnost" denie u kontekstu problema
(Euklidska duzina, prosjek, ...)

52

5.4 Redukcije NP kompleksnosti

5 NP KOMPLEKSNOST

Da bi se ovo dokazalo potrebno je pretpostaviti da postoji pristup podrutini CCov (G; k).
Za dati graf i cijeli broj k ova podrutina vraca odgovor "istina" ako G ima clique velicine
k i "neistina" u suprotnom, uz cinjenicu da ta rutina radi u polinomijalnom vremenu.
Kako se sada ovakva rutina koristi za rjeenje dobro poznatog tekog 3Col problema ?
Treba se napisati rutina koja radi u polinomijalnom vremenu za 3Col i koja moze zvati
rutinu CCov (G; k) za bilo koji graf i bilo koji cijeli k.
Oba problema ukljucuju 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 nacin su problemi gotovo
jednaki ali zahtjev da budu susjedni je obratan.
Tvrdimo da se problem tri boje moze reducirati na problem klika na sljedeci nacin. Za
dati graf G za koji se zeli utvrditi mogucnost bojenja sa tri boje rezultat je par G; 3
gdje G oznacava komplement od G. To znaci 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 moze koristiti kao ulaz u
rutinu za klik.

Ovo je ilustrovano na slici.


Tvrdnja. Graf G je moguce obojiti sa tri boje ako i samo ako komplement G ima
pokrivanje klikom velicine 3. Drugim rijecima
G 2 3Col , G; 3 2 CCov
Dokaz: ()) Ako je G moguce obojiti sa 3 boje neka su V1 ; V2 ; V3 tri klase za svaku od
boja. Tvrdi se da je to klik pokrivac velicine 3 za G s obzirom da ako su u i v razliciti
c vorovi u Vi tada fu; vg 2
= E (G) s obzirom da susjedni cvorovi ne mogu biti iste boje.
Ovo povlaci da fu; vg 2 E G . Stoga svaki par razlicitih cvorova u Vi cini susjedne u G.
(() Neka je pretpostavka da G ima klik pokrivac velicine 3 oznacen 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 razliciti cvorovi u i v u Vi tada slijedi da je fu; vg 2 E (G) s obzirom
da su zajednickom kliku. Ovo povlaci da fu; vg 2
= E G . Stoga dva cvora iste boje nisu
susjedna.

53

5.5 NP kompletnost

5 NP KOMPLEKSNOST

5.4.3 Redukcija na polinomijalno vrijeme


Sada se ova intuicija prenosi na redukciju jednog problema na drugi putem koritenja
poziva rutine kroz veci stepen formalizacije. U navedenom primjeru je izvrena konverzija
instance problema tri boje na ekvivalentnu instancu problema pokrivaca (G; 3).
Denicija. Kaze se da je jezik (odnosno problem odlucivanja) L1 reducibilan na jezik
L2 sa polinomijalnim vremenom, u oznaci L1 P L2 , ako postoji racunarska funkcija f
koja radi u polinomijalnom vremenu takva da vrijedi
(8x) (x 2 L1 , f (x) 2 L2 )
U navedenom primjeru je pokazano da 3Col P CCov. Posebno, vrijedi da je f (G) =
G; 3 . Treba primijetiti da je lako formirati komplement grafa u O (n2 ) vremenu (tako
to se zamijene 0 i 1 u odgovarajucoj matrici). Stoga je f izracunljiva u polinomijalnom
vremenu.
Intuitivno gledano, kad se kaze L1 P L2 to znaci "Ako je problem L2 rjeiv u polinomijalnom vremenu tada to vrijedi i za L1 ". To je zbog toga to se rutina u polinomijalnom
vremenu za L2 moze primijeniti na f (x) kako bi se utvrdilo da li f (x) 2 L2 ili ekvivalentno, da li x 2 L1 . Stoga, u smislu izracunljivosti u polinomijalnom vremenu, L1 nije
tezi od L2 .
Nacin na koji se ovo koristi NP kompletnost je tacno obrnut. Obicno postoji jak dokaz
da L1 nije rjeiv u polinomijalnom vremenu pa je redukcija efektivno ekvivalentna kao
da se kaze "S obzirom da za L1 nije izvjesno da je rjeiv u polinomijalnom vremenu tada
ni za L2 nije izvjesno da je rjeiv u polinomijalnom vremenu". Stoga je ovo nacin kako
redukcije polinomijalnog vremena mogu biti koritene da se pokaze da su problemi teki
onoliko koliko su teki poznati problemi.
Lema. Ako L1

L2 i L2 2 P tada L1 2 P .

Lema. Ako L1

L2 i L2 2
= P tada L1 2
= P.

Vazna cinjenica po osnovu reducibilnosti je tranzitivnost. Drugim rijecima


Lema. Ako L1

L2 i L2

L3 tada L1

L3 .

Razlog je u tome to ako su dvije funkcije f (x) i g (x) izracunljive u polinomijalnom


vremenu tada je i njihova kompozicija f (g (x)) izracunljiva u polinomijalnom vremenu.
Treba obratiti paznju da se u nekim slucajevima termin "redukcija" mijenja terminom
"transformacija". Razlika u terminolokom smislu mozda nije velika ali treba voditi
racuna o tome.

5.5 NP kompletnost
Skup NP kompletnih problema su svi problemi u klasi kompleksnosti NP za koje je
poznato da ako je jedan rjeiv u polinomijalnom vremenu tada to vrijedi za sve njih i
obratno, ako jedan od njih nije rjeiv u polinomijalnom vremenu tada nijedan od njih
nije rjeiv na taj nacin. Ovo se matematicki formalizuje koritenjem oznaka redukcija
polinomijalnog vremena.
Denicija. Jezik L je NP-tezak ako
54

5.5 NP kompletnost

5 NP KOMPLEKSNOST
L0

L za sve L0 2 N P

Ovdje L ne mora biti u NP.


Denicija. Jezik L je NP-kompletan ako
L 2 NP
L je NP-tezak
Da bi se pokazalo da je problem NP kompletan alternativa je, kao obicno laki put,
koritenje tranzitivnosti.
Lema. L je NP kompletan ako
L 2 NP
L0 2P L za neki poznati NP kompletan jezik L0

Cinjenica
da su svi L00 2 N P reducibilni na L0 (s obzirom da je L0 NP kompletan pa time
i NP tezak) i stoga, zbog tranzitivnosti je L00 reducibilan na L povlaci da je L NP tezak.
Ovo daje nacin za dokaz da su problemi NP kompletni u slucaju da je poznato da je
jedan problem NP kompletan. Nazalost, cini se da je gotovo nemoguce dokazati da je
jedan problem NP kompletan s obzirom da denicija kaze da moramo biti u mogucnosti
svaki problem u NP reducirati na taj problem. Postoji beskonacno takvih problema pa
je teko vjerovati u tako neto. Cook je pokazao da postoji problem pod nazivom SAT
(skracenica za Satisability) da je NP kompletan. Da bi pokazali da je drugi problem NP
kompletan sve to trebamo je pokazati da je naproblem NP (a samim tim i reducibilan
na SAT) a zatim pokazati da SAT (ili generalno neki poznat NPC problem) mozemo
reducirati na na problem. Slijedi da je na problem ekvivalentan sa SAT pod uslovom
da se potuje rjeivost u polinomijalnom vremenu.

55

5.6 Zadaci za samostalni rad

5 NP KOMPLEKSNOST

Ovo je ilustrovano na prilozenoj slici.


Ocito je da vrijedi P
NP i P
co N P . Pitanje je da li je P = N P . Ovo se
smatra jednim od najvaznijih matematickih problema i spada u sedam tzv. Millenium
Prize Problems. Vecina eksperata smatra da je odgovor NE ali to nije i dokazano.
Denicija. Neka su L1 i L2 dva problema odluke. Kazemo da se L1 moze reducirati u
polinomijalnom vremenu na L2 , u oznaci L1 pL2 ako postoji polinomijalni algoritam za
rjeavanje L1 koji kao potrpogram koristi algoritam za rjeavanje problema L2 pri cemu
je broj poziva tog programa takoer polinomijalan.
Drugim rijecima, ako je L1

pL2 tada L1 nije bitno tezi od L2 .

Denicija. Problem odluke L je NP-potpun ako je L 2 N P i L1


Klasa svih N P potpunih problema se oznacava sa N P C.

pL za svaki L1 2 N P .

N P potpuni problemi su najtezi problemi u klasi N P . Postojanje polinomijalnog algoritma za bilo koji od N P potpunih problema bi povlacilo da vrijedi P = N P . Kako
se vjeruje da ova jednakost ne vrijedi to je i postojanje ovakvog algoritma je jako malo
vjerovatno.

5.6 Zadaci za samostalni rad


1. Pokazati da su svaka dva netrivijalna problema iz klase P polinomijalno ekvivalentna.
2. Dokazati NP-kompletnost sljedeceg problema. Za dati neusmjereni povezan graf G =
(V ; E) i prirodni broj k ustanoviti da li G sadrzi klik velicine k i nezavisni skup velicine
k
3. Dokazati NP-kompletnost sljedeceg problema. Dat je neusmjereni graf G = (V ; E) i
prirodni broj k. Utvrditi da li G sadrzi podskup od k cvorova ciji je inducirani podgraf
aciklicki.
4. Zadat je regularni graf G (graf ciji svi cvorovi imaju isti stepen) i prirodni broj k.
Treba utvrditi da li G sadrzi klik velicine k. Dokazati da je ovaj problem NP-kompletan.

56

REFERENCES

6 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


c, Algoritmi, Matematicki fakultet, Beograd, 2000.
[4] S. A. Abramov, G. G. Gnezdilova, E. N. Kapustina, M. I. Selyun, Zadachi po programirovaniyu, 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 (undergraduate 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 Computer Science, University of Maryland, Fall 2003
[10] www.wikipedia.com
[11] Richard Kaye, Some Mineseeper Congurtions, School of Mathematics, The University of Birmingham, Birmingham, 31.03.2007.
[12] Recommendation for Random Number Generation Using Deterministic Random Bit
Generators (Revised), NIST Special Publication 800-90, Mart 2007
[13] Richard
Kaye,
Minesweeper
and
http://web.mat.bham.ac.uk/R.W.Kaye/minesw/ordmsw.htm

57

NP-completness,

You might also like