Algoritmi Lekcije

You might also like

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












M A T E M A T I K I
A L G O R I T M I
L e k c i j e










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

SADR

ZAJ SADR

ZAJ
Sadrzaj
1 Algoritmi 3
1.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Klasikacija algoritama . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Predstavljanje algoritama . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 Analiza kompleksnosti algoritama . . . . . . . . . . . . . . . . . . . . . . 6
1.4.1 -notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.2 O-notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.3 -notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4.4 o-notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5 Podjela algoritama prema brzini . . . . . . . . . . . . . . . . . . . . . . . 10
1.5.1 Algoritmi konstantnog vremena . . . . . . . . . . . . . . . . . . . 10
1.5.2 Algoritmi u linearnom vremenu . . . . . . . . . . . . . . . . . . . 10
1.5.3 Algoritmi sa kvadratnim vremenom . . . . . . . . . . . . . . . . . 10
1.5.4 Algoritmi sa logaritamskim vremenom . . . . . . . . . . . . . . . 11
1.5.5 Algoritmi brzine
_
: . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5.6 Algoritmi sa eksponencijalnim vremenom izvravanja . . . . . . . 12
1.5.7 Kombinacije algoritama . . . . . . . . . . . . . . . . . . . . . . . 12
1.5.8 Rekurzije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.6 Primjeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.7 Primjeri za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2 Algoritmi sortiranja 18
2.1 Sortiranje nizova - osnovne metode . . . . . . . . . . . . . . . . . . . . . 18
2.1.1 Sortiranje putem ukljucivanja (Insertion sort) . . . . . . . . . . . 19
2.1.2 Sortiranje putem direktne podjele . . . . . . . . . . . . . . . . . . 20
2.1.3 Sortiranje putem zamjene . . . . . . . . . . . . . . . . . . . . . . 23
2.2 Sortiranje nizova - poboljane metode . . . . . . . . . . . . . . . . . . . . 25
2.2.1 Shell sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.2 Quick sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.3 Merge sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2.4 Heap sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3 Pohlepni algoritmi 29
3.1 Rasporeivanje aktivnosti . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Knapsack problem (problem ranca) . . . . . . . . . . . . . . . . . . . . . 30
3.2.1 Korektnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 Pohlepni algoritmi na grafovima . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.1 Kruskalov algoritam . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.2 Primov algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.3 Dijkstra algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4 Slucajni brojevi 39
4.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2 Uniformna distribucija . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.3 Normalna distribucija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.4 Testiranje slucajnosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
1
SADR

ZAJ SADR

ZAJ
5 NP kompleksnost 45
5.1 Problemi odlucivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2 Problemi prepoznavanja jezika . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3 Verikacija polinomijalnog vremena i certikati . . . . . . . . . . . . . . 49
5.3.1 NP klasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.4 Redukcije NP kompleksnosti . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.1 Problem tri boje . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.2 Clique pokrivac (cover) (CCov) . . . . . . . . . . . . . . . . . . . 52
5.4.3 Redukcija na polinomijalno vrijeme . . . . . . . . . . . . . . . . . 54
5.5 NP kompletnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.6 Zadaci za samostalni rad . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6 Literatura 57
2
1 ALGORITMI
1 Algoritmi
1.1 Uvod
Termin "algoritam" je nastao po latinskom prevodu imena matematicara iz devetog vi-
jeka, 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 zavren
1
.
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 organizo-
vani 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 izracuna-
vanja; 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 matem-
atickih 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.
3
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 pro-
gramerska greka. Potrebno je razlikovati procedure od funkcija. U principu, svaka
procedura ima rezultat ali on ne mora biti vidljiv u svim slucajevima. Primjer je proce-
dura 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.
4
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 oslan-
jaju 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 vieproce-
sorskih 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 al-
goritam 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 nesistem-
aticnost 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.
5
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 prethod-
nih 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 po-
jedine korake i koji se povezuju linijama kao prikaz toka operacija. Pritom se dijagram
pravi tako da ide odozgo prema dolje s lijeva na desno.
Tekstualno predstavljanje moze biti putem pseudokoda ili putem odabranog program-
skog 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 slucaje-
vima. Na ponaanje utice mnogo faktora pa se u obzir uzimaju samo glavne karakteristike
6
1.4 Analiza kompleksnosti algoritama 1 ALGORITMI
a zanemaruju se detalji vezani za tacnu realizaciju. Iz tog razloga analiza algoritma je pri-
blizna. 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) :. 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(, (:)) a broj ostalih operacija je proporcionalan broju uporeivanja
tada je O(, (:)) 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(:) znaci
da je za izvrenje algoritma porebna memorija proporcionalna onoj za smjetanje po-
dataka. 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 algo-
ritma mjeri se kolicina vremena u terminima bit operacija. Pod terinom bit operacija
se podrazumijeva sabiranje, oduzimanje ili mnozenje dvije binarne cifre, dijeljenje dvo-
bitnog 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 q (:) funkcija denisana na nekom podskupu skupa prirodnih brojeva
i ciji je skup vrijednosti neki podskup skupa realnih brojeva. Sa (q (:)) se oznacava
skup funkcija , (:) takvih da postoje pozitivne konstante c
1
, c
2
i prirodan broj :
0
takvi
da je
0 _ c
1
q (:) _ , (:) _ c
2
q (:) za svako : _ :
0
7
1.4 Analiza kompleksnosti algoritama 1 ALGORITMI
Ovdje oznacava klasu funkcija a , (:) = (q (:)) je oznaka za inkluziju , (:)
(q (:)).
Primjer 1. Neka je , (:) =
2
3
:
2
:, : N. Tada je , (:) = (:
2
). Najprije, vrijedi
c
1
:
2
_
2
3
:
2
: _ c
2
:
2
za svako :
0
_ : ako i samo ako c
1
_
2
3

1
n
_ c
2
za svako
:
0
_ :. Odavdje slijedi da mora biti c
2
_
2
3
. Kako c
1
mora biti pozitivan broj to mora
biti
2
3

1
n
_ 0. To znaci da je dovoljno uzeti :
0
= 3. Iz c
1
_
2
3

1
3
slijedi c
1
_
1
3
. Dakle,
vrijedi da je
1
3
:
2
_ , (:) _
2
3
:
2
za svako : _ 3.
Primjer 2. Neka je , (:) = c:
2
+ /: + c gdje su c. /. c konstante i c 0. Da li je
, (:) = (:
2
) ? Potrebno je odrediti konstante c
1
i c
2
i prirodan broj :
0
takve da je
c
1
:
2
_ c:
2
+/:+c _ c
2
:
2
za svako : :
0
. Neka je c
1
< c i c
2
c. Tada su nejednacine
(c c
1
) :
2
+/: +c _ 0 i (c
2
c) :
2
+/: +c _ 0 zadovoljene za sve prirodne brojeve :
0
takve da je :
0
max r
1
. r
2
.
1
.
2
gdje su r
1
i r
2
nule polinoma (c c
1
) :
2
+/:+c a
1
i
2
nule polinoma (c
2
c) :
2
+/: +c ako postoje; ako ne postoje onda je :
0
= 1. znaci,
vrijedi , (:) (:
2
). Takoe, ako je , (:) polinom stepena : ciji je vodeci koecijent
pozitivan onda je , (:) = (:
m
).
1.4.2 O-notacija
Denicija. Neka je q (:) realna funkcija denisana na nekom podskupu skupa prirod-
nih brojeva. Sa O(q (:)) se oznacava skup realnih funkcija , (:) denisanih na nekom
podskupu skupa realnih brojeva takvih da postoji pozitivna konstanta c i prirodan broj
:
0
takvi da je
0 _ , (:) _ c q (:) . za svako : _ :
0
Ovdje O oznacava klasu funkcija a , (:) = O(q (:)) je oznaka za inkluziju , (:)
O(q (:)). Treba primijetiti da , (:) = (q (:)) povlaci , (:) = O(q (:)).
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 C()
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 (in-
nite) 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 q (:) gornja granica za , (:). U tom smislu, oznaka
, (:) = O(q (:)) se tumaci da ", ne raste brze od q".
U nastavku ce biti navedeno nekoliko jednostavnih ali znacajnih osobina O notacije.
1. Ako je , (:) = O(q (:)) tada je c , (:) = O(q (:)) za svaku pozitivnu konstantu
c.
2. Ako je ,
i
(:) = O(q
i
(:)), i = 1. 2. .... / tada je
,
1
(:) + ,
2
(:) + ... + ,
k
(:) = O((q
1
+ q
2
+ ... + q
k
) (:))
8
1.4 Analiza kompleksnosti algoritama 1 ALGORITMI
3. Ako je ,
i
(:) = O(q (:)), i = 1. 2. .... / tada je
,
1
(:) + ,
2
(:) + ... + ,
k
(:) = O(q (:))
4. Ako je ,
i
(:) = O(q
i
(:)), i = 1. 2. .... / tada je
,
1
(:) ,
2
(:) ... ,
k
(:) = O(q
1
(:) q
2
(:) ... q
k
(:))
Ako je , (:) monotono rastuca funkcija koja nije ogranicena, c 1 i c 0, tada
, (:)
c
= O
_
c
f(n)
_
Za , (:) = : dobija se :
c
= O(c
n
) a za , (:) = log
a
: dobija se (log
a
:)
c
= O
_
c
log
a
n
_
=
O(:) to znaci da proizvoljan stepen logaritamske funkcije raste spporije od linearne
funkcije.
Primjer. Kako je
lim
n!1
ln :
:

= 0
za svako c 0 tada vrijedi da je ln : = O(:

) za svako c 0.
Primjer. Neka je , (:) broj bita broja :. Tada je , (:) = [log
2
:] + 1. Kako je
lim
n!1
, (:)
log
2
:
= 1
tada vrijedi da je , (:) = O(log
2
:). S obzirom da je log
2
: =
ln n
ln 2
to je , (:) = O(ln :).
1.4.3 -notacija
Denicija. Neka je q (:) realna funkcija denisana na nekom podskupu prirodnih bro-
jeva. Sa (q (:)) se oznacava skup realnih funkcija , (:) denisanih na nekom podskupu
skupa realnih brojeva takvih da postoji konstanta c 0 i prirodan broj :
0
takvi da vrijedi
0 _ c q (:) _ , (:) za svako : _ :
0
.
Ovdje () oznacava klasu funkcija a , (:) = (q (:)) je oznaka za inkluziju , (:)
(q (:)).
Velicina () se tumaci tako da je q (:) donja granica za , (:). U tom smislu, oznaka
, (:) = (q (:)) se tumaci da ", raste najmanje kako raste q".
Iz denicije asimpotskih notacija direktno slijedi naredni teorem.
Teorem. Za bilo koje dvije funkcije , (:) i q (:) vrijedi , (:) = (q (:)) ako i samo ako
je , (:) = O(q (:)) i , (:) = (q (:)).
1.4.4 o-notacija
Denicija. Neka je q (:) realna funkcija denisana na nekom podskupu skupa prirodnih
brojeva. Sa o (q (:)) se oznacava skup realnih funkcija , (:) denisanih na nekom pod-
skupu skupa realnih brojeva takvih ako i samo ako vrijedi , (:) = O(/(:)) i , (:) ,=
(/(:)).
Ovdje o () oznacava klasu funkcija a , (:) = o (q (:)) je oznaka za inkluziju , (:)
o (q (:)).
Oznaka , (:) = o (q (:)) se tumaci da ", raste striktno sporije od q".
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
: 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 : 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 : elemenata
- Nalazenje maksimalnog ili minimalnog elementa u listi ili sekvencijalno pretrazivanje
nesortirane liste od : elemenata
- Prolazak stabla sa : cvorova
- Iterativno racunanje faktorijela broja :;
- Iterativno nalazenje :-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 : 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 :. U ovom slucaju se petlja izvrava tacno :,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 : elemenata
- Poreenje dva dvodimenzinalna niza od po : : elemenata
- Nalazenje duplikata u nesortiranoj listi od : elemenata (implementirano sa dvije ugn-
jezdene petlje)
Broj operacija, u oznaci O(:
2
), 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(n
2
)
statement(s);
Maksimum petlje je :
2
tako da je vrijeme izvrenja kvadraticno. U ovom slucaju petlja
se izvrava tacno :
2
,c puta.
Primjer ugnjezdene petlje je :
for (int i = 0; i < n; i += c) { // O(n
2
)
for (int j = 0; j < n; i += c)
{
statement(s);
}
}
Primjeri algoritama brzine C(:
c
), 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 : elemenata
- Operacije umetanja i nalazenja binarnog stabla sa : cvorova
- Operacije umetanja i uklanjanja u skupu (heap) sa : cvorova
Brzina ovih algoritama, u oznaci O(log :), raste sporije od velicine ulaza. Ako se ulaz
udvostruci vrijeme izvoenja se samo malo produzi. Klasican primjer algoritma u logari-
tamskom 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 : puta potrebno je log
2
: = lg :
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 : 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 log
c
: puta. U
ovom slucaju je c
k
= :, gdje je / broj prolaza. Na osnovu ovoga je / = log
c
:. Analogno
vrijedi ako se brojac smanjuje za konstantni faktor c.
Brzinu O(:log :) = O(log :!) (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 ALGORITMI
1.5.5 Algoritmi brzine
_
:
Ovi algoritmi se izvravaju proporcionalno kvadratnom korijenu od : (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 i + i < :. Ova petlja se
nece izvriti svih : puta vec ce se zaustaviti kada i dostigne
_
:. Stoga ona ima vrijeme
(
_
:).
Primjer ovog algoritma je trazenje odgovora na pitanje da li je broj : prost. Odgovor
se moze dobiti tako da se provjerava da li je djeljiv sa svim brojevima koji su manji od
njega. Ako je : = 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 : elemenata
- Racunanje determinante putem racunanja minora
Ba kao to postoje algoritmi na koje povecanje obima ulaza nema uticaja postoje al-
goritmi za koje se cini da vrijeme izvrenja eksplodira. Kaze se da se eksponencijalni
algoritmi izvravaju u C(c
n
) ili eksponencijalnom vremenu. Klasicni primjer algoritma
sa eksponencijalnim vremenom izvrenja je Problem trgovackog putnika (Traveling Sales-
man Problem - TSP). Ovo je problem koji je do sada najvie izucavan u kompjuterskoj
teoriji.
Zadatak je jednostavan. Dato je : 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 :!.
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 :) < O(log :) < O(:) < O(:log :) < O(:
2
) < O(:
2
log :) <
O(:
3
) < ... < O(c
n
) < O(:!) < O(:
n
)
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 : iza
12
1.5 Podjela algoritama prema brzini 1 ALGORITMI
kojeg slijedi linearni blok ima ukupno vrijeme koje je linearno; efekat log : petlje naprosto
icezava. Ne treba previe brinuti. Stara engleska izreka kaze : brini o dolarima a centi
ce 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 : kao to je :
2
ili :
1=2
tada je blok sa vecim stepenom
od : gori
2. Ako su stepeni od : jednaki ili ako nema stepena od : blok sa vie log : je loiji
Naprimjer, ako se poredi :
_
:lg : sa lg
3
: prvi broj ima stepen :
1;5
dok drugi ima 0 kao
stepen za :. 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 (:
2
). 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 :. S obzirom da se posao
ponavlja za : elemenata druge liste obavlja se :: = :
2
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 1
n
, : = 1. 2. ... vazi jednakost
1
n
= , (1
n1
. 1
n2
. .... 1
1
. :)
kaze se da niz 1
n
zadovoljava diferentnu jednadzbu ili rekurentni izraz. Specijalno, ako
se za neko / _ 1 clan 1
n
izrazava preko / prethodnih clanova niza
13
1.5 Podjela algoritama prema brzini 1 ALGORITMI
1
n
= , (1
n1
. 1
n2
. .... 1
nk
. :)
onda je / red te diferentne jednacine. Matematickom indukcijom se pokazuje da je ovaj
niz jednoznacno odreen sa prvih / clanova niza 1
1
. 1
2
. .... 1
k
.
Jedna od najpoznatijih diferentnih jednacina je ona koja denie Fibonacijev niz
1
n
= 1
n1
+ 1
n2
. 1
1
= 1
2
= 1
Za racunanje vrijednosti 1
n
potrebno je izvriti :2 koraka sabiranja to je neprakticno
za velike :.
Nacin procjene brzine algoritma ce biti procijenjen na jednom primjeru. Neka je data
rekurzivna relacija
1 (:) = 2 1 (:,2) +:. 1 (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 1 (:) _ , (:). Vrijedi:
1 (:) = 2 1 (:,2) +: =
= 2 [2 1 (:,4) +:,2] +: =
= 4 1 (:,4) + 2: =
= 4 [2 1 (:,8) +:,4] + 2: =
= 8 1 (:,8) + 3:
= ...
= 2
k
1
_
:,2
k
_
+ / :
Zna se da je 1 (1) = 1 i to je nacin da se posao nastavi.

Zelja je da se na desnoj strani
pojavi 1 (1) to znaci da je
:,2
k
= 1 = : = 2
k
= / = log
2
/
Na osnovu ovoga se nastavlja prethodna jednacina pa je:
1 (:) = 2
log
2
n
1 (1) + : log
2
: =
= : + : log
2
: = O(:log :)
Ovaj problem se moze generalizirati na sljedeci nacin. Neka je cilj analiza algoritma /
pri cemu je broj operacija 1 (:) za ulaz velicine : (vremenska slozenost) dat rekurentnim
izrazom
1 (:) = c 1
_
:
/
_
+ c :
k
pri cemu je c. /. c. / 0, / ,= 0 i zadata je vrijednost 1 (1). Ovakva jednacina se dobija
za algoritam kod kojeg se obrada ulaza velicine : svodi na obradu c ulaza velicine :,/
poslije cega je potrebno izvriti jo c :
k
koraka da bi se od parcijalnih rjeenja konstru-
isalo rjeenje kompletnog ulaza velicine :. 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 / N.
Teorema. Asimptotsko ponaanje niza 1 (:) rjeenja rekurentnog izraza
14
1.5 Podjela algoritama prema brzini 1 ALGORITMI
1 (:) = c 1
_
:
/
_
+ c :
k
(1)
dato je jednakocu
1 (:) =
_
_
_
O
_
:
log
b
a
_
c /
k
O
_
:
k
log :
_
c = /
k
O
_
:
k
_
c < /
k
Dokaz. Dokaz ce biti proveden samo za podniz : = /
m
gdje je : cijeli nenegativni broj.
Mnozenjem izraza (1) sa c
m
,c dobija se rekurentni izraz
t
m
= t
m1
+
m
. t
0
=
1
c
1 (1)
gdje je t
m
=
1
c
c
m
1 (/
m
) i = /
k
,c. Rjeenje je
t
m
= t
0
+
m

i=1

i
Za ,= 1 je
m

i=1

i
=
1
m+1
1
1
pa se asimptotsko ponaanje niza t
m
opisuje sljedecim jednakostima
t
m
=
_
_
_
O(:) = 1
O(1) 0 < < 1
O(
m
) 1
S obzirom da je 1 (/
m
) = c c
m
t
m
, : = /
m
odnosno : = log
b
: redom se za 0 < < 1
(/
k
< c), = 1 (/
k
= c odnosno / = log
b
c) i 1 (/
k
c) dobija
1 (:) =
_
_
_
O(c
m
) = O
_
/
mlog
b
a
_
= O
_
:
log
b
a
_
c /
k
O(:c
m
) = O
_
log
b
: :
log
b
a
_
= O
_
:
k
log :
_
c = /
k
O((c)
m
) = O
_
/
mk
_
= O
_
:
k
_
c < /
k
Pogodno je upamtiti neke od narednih relacija.
Rekurzija Algoritam O()
1 (:) = 1 (:,2) +C(1) Binarno pretrazivanje O(log :)
1 (:) = 1 (: 1) +C(1) Sekvencijalno pretrazivanje O(:)
1 (:) = 2 1 (:,2) +C(1) Put po stablu O(:)
1 (:) = 1 (: 1) +C(:) Selection sort O(:
2
)
1 (:) = 2 1 (:,2) +C(:) Merge sort O(:log :)
Table 1: Uporedni pregled brzina algoritama
15
1.6 Primjeri 1 ALGORITMI
1.6 Primjeri
Primjer 1. Sabiranje ili oduzimanje dva :-bitna cijela broja ima kompleksnost O(:).
Za analizu kompleksnosti mnozenja dva broja potreban je kratki prikaz postupka. Jedan
od mogucih nacina mnozenja dva cijela :-bitna broja je tzv. digitalni metod. Neka su
c = (c
2n1
c
2n2
...c
1
c
0
)
2
/ = (/
2n1
/
2n2
.../
1
/
0
)
2
Moze se staviti

1
= (c
2n1
c
2n2
...c
n+1
c
n
)
2
.
0
= (c
n1
c
n2
...c
1
c
0
)
2
1
1
= (/
2n1
/
2n2
.../
n+1
/
n
)
2
. 1
0
= (/
n1
/
n2
.../
1
/
0
)
2
Tada se moze staviti c = 2
n

1
+
0
i / = 2
n
1
1
+ 1
0
. Odavdje je
c / = (2
2n
+ 2
n
)
1
1
1
+ 2
n
(
1

0
) (1
0
1
1
) + (2
n
+ 1)
0
1
0
Ovo znaci da se za proizvod dva 2:-bitna broja moraju izracunati dvije razlike
1

0
i 1
0
1
1
dva :-bitna broja, tri proizvoda
1
1
1
, (
1

0
) (1
0
1
1
),
0
1
0
a zatim
izvriti pomjeranje ulijevo i sabiranje.
Ako se sa ` (:) oznaci broj bit operacija potrebnih za mnozenje dva :-bitna cijela broja
onda vrijedi
` (2:) _ 3 ` (:) + C :
gdje je C konstanta. Naime, svako mnozenje dva :-bitna cijela broja zahtijeva ` (:)
bitnih operacija a sabiranje, oduzimanje i pomjeranje ulijevo su operacije reda O(:).
Odavdje se dobija relacija
`
_
2
k
_
_ 1
_
3
k
2
k
_
gdje je 1 = max ` (2) . C.
Teorem. Mnozenje dva :-bitna cijela broja moze biti izvedeno koritenjem O
_
:
log
2
3
_
bit operacija.
Dokaz. Za mnozenje dva :-bitna broja je potrebno ` (:) bit operacija. Na osnovu
prethodnih relacija vrijedi:
` (:) = `
_
2
log
2
n
_
_ `
_
2
[log
2
n]+1
_
_ 1
_
3
[log
2
n]+1
2
[log
2
n]+1
_
< 1 3
[log
2
n]+1
_ 3 1
_
3
[log
2
n]
_
_ 31 3
[log
2
n]
= (31) :
log
2
3
Odavdje imamo da je ` (:) = O
_
:
log
2
3
_
.
Primjer 2. Naci O(:!).
Rjeenje. Kako je :! = 1 2 ... : = (... ((2 3) 4) 5...) :, za racunanje broja :! je
potrebno : 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 :. U koraku (i 1) se i! mnozi sa
i + 1 pa je stoga broj mnozenja jednak : 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 : ima / bita. Svaki broj manji od : ima
najvie / bita. Stoga je :!, kao proizvod : brojeva sa najvie / bita, najvie :/ bitni broj.
Broj bita broja :! je manji ili jednak sumi bita svakog faktora to je manje ili jednako
:/. Zbog toga je, za svaki prirodan broj i _ :, broj i! najvie : /-bitni. Za mnozenje i!
sa i potrebno je najvie (:/)/ = :/
2
bit operacija. Kako ovakvih mnozenja ima (: 2)
to je za izracunavanje :! potrebno najvie
(: 2) (:/
2
) = :(: 2) (1 +log
2
:|)
2
= :(: 2) (lg :)
2
= O
_
(:lg :)
2
_
bit operacija.
16
1.7 Primjeri za samostalni rad 1 ALGORITMI
Primjer 3. Dokazati da je vrijeme 1 (:) = :
3
+ 20: + 1 jednako O(:
3
).
Dokaz. Prema deniciji O notacije, 1 (:) = O(:
3
) ako je 1 (:) _ c :
3
za neko : _ :
0
.
Ako je :
3
+ 20: + 1 _ c :
3
tada 1 +
20
:
2
+
1
:
3
_ c. Ovo vrijedi za svako : _ :
0
= 1 i
c _ 22. Za vece vrijednosti :
0
potreban je manji broj c (npr. za :
0
= 10 je c _ 1.201)
ali u svakom slucaju vrijedi trazena nejednakost.
Primjer 4. Pokazati da vrijeme 1 (:) = :
3
+ 20: + 1 nije O(:
2
).
Dokaz. Prema deniciji O notacije, 1 (:) = O(:
3
) ako je 1 (:) _ c :
3
za neko : _ :
0
.
Ako je :
3
+ 20: + 1 _ c :
3
tada 1 +
20
:
2
+
1
:
3
_ c. Lijeva strana posljednje nejednakosti
raste neograniceno tako da ne postoji konstanta c. Stoga, O uslov ne moze vrijediti u
ovom slucaju.
Primjer 5. Pokazati da je vrijeme 1 (:) = :
3
+ 20: + 1 jednako O(:
4
).
Dokaz. Prema deniciji O notacije, 1 (:) = O(:
4
) ako je 1 (:) _ c :
4
za neko : _ :
0
.
Ako je :
3
+ 20: + 1 _ c :
3
tada
1
:
+
20
:
3
+
1
:
4
_ c. Ovo vrijedi za svako : _ :
0
= 1 i
c _ 22. Za vece vrijednosti :
0
potreban je manji broj c (npr. za :
0
= 10 je c _ 1.201)
ali u svakom slucaju vrijedi trazena nejednakost.
Primjer 6. Pokazati da je vrijeme 1 (:) = :
3
+ 20: jednako (:
2
).
Dokaz. Prema deniciji notacije, 1 (:) = (:
2
) ako je 1 (:) _ c :
2
za neko : _ :
0
.
Ako je :
3
+ 20: + 1 _ c :
2
tada : +
20
:
_ c. Lijeva strana nejednakosti ima minimalnu
vrijednost 8.94 za : =
_
20. Stoga uslov za vrijedi za svako : _ :
0
= 5 i c _ 9. Za
vece vrijednosti :
0
potreban je veci broj c (npr. za :
0
= 10 je c _ 12.01) ali u svakom
slucaju vrijedi trazena nejednakost.
1.7 Primjeri za samostalni rad
1. Neka je : prirodan broj i , (:) funkcija koja predstavlja broj bit operacija za
izracunavanje broja 3
n
. Odrediti O(,).
2. Neka je : prirodan broj i , (:) funkcija koja predstavlja broj bit operacija za
izracunavanje broja :
n
. Odrediti O(,).
3. Neka su : i : prirodni brojevi i , (:. :) funkcija koja predstavlja broj bit operacija
za izracunavanje binomnog koecijenta
_
:
:
_
. Odrediti O(,).
4. Ispitati vrijeme konvertovanja /-bitnog broja u njegovu prezentaciju po bazi 1
gdje je 1 veliki cijeli broj.
5. Neka su , (r) =
n

i=1
c
i
r
i
i q (r) =
m

i=1
/
i
r
i
polinom i sa cjelobrojnim koecijentima
koji su manji od broja t. Uz pretpostavku da je : < : odrediti vrijeme mnozenja ovih
polinoma tj. O(, q).
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 c
1
. c
2
. .... c
n
. ... tada je sortiranje permutacija tih elemenata u niz
c
k
1
. c
k
2
. .... c
k
n
. ... u kojem, po osnovu neke funkcije poretka , vrijedi , (c
k
1
) _ , (c
k
2
) _
... _ , (c
k
n
) _ .... 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 sor-
tiranje i stoga je moguce sortirati veoma velike liste bez potrebe alokacije (dodjeljivanja)
dodatnog memorijskog prostora.
Metod sortiranja je stabilan ako se u procesu sortiranja odgovarajuci odnos elemenata 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 mem-
oriju. 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 c premjetaju u niz / 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 `, broj
premjetanja (permutacija) elemenata. Ovi brojevi su funkcija od :, dimenzije niza koji
se sortira.
Mada dobri algoritmi sortiranja trebaju :log : 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 prin-
cipa 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 : direktne metode brze mada ih ne treba koristiti za velike :
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 c
1
. .... c
i1
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.
44 55 12 42 94 18 06 67
i = 2 44 55 12 42 94 18 06 67
i = 3 12 44 55 42 94 18 06 67
i = 4 12 42 44 55 94 18 06 67
i = 5 12 42 44 55 94 18 06 67
i = 6 12 18 42 44 55 94 06 67
i = 7 06 12 18 42 44 55 94 67
i = 8 06 12 18 42 44 55 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 c
j
sa kljucem koji je manji od kljuca za r
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 c
0
(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 c
i
u dijagramu.
19
2.1 Sortiranje nizova - osnovne metode 2 ALGORITMI SORTIRANJA
Procedura InsertionSortDirektni
Ulaz : :. c
n

Izlaz : Sortirani niz c


n

Inicirati i. ,. r
2 ,
DokVrijedi , < 1n .i:c [c] raditi
{
r c [,]
IUmetnuti c [,] u sortirani niz c [1. ... , 1]
i , 1
DokVrijedi i 0 & c [i] r raditi
{
c [i + 1] c [i]
i i 1
}
c [i + 1] r
, , + 1
}
Analiza ove metode se moze objasniti putem naredne tabele.
Neka je sa 1 () oznaceno vrijeme izvrenja ovog algoritma za niz duzine :. Neka je
sa t
j
oznaceno koliko puta se izvri petlja u liniji 5. Na taj nacin je t
2
vrijeme izveenja
te petlje u prvom koraku petlje iz koraka 2. Na osnovu toga se moze iskalkulisati koliko
puta se izvri svaka linija pseudokoda.
1 (c) = 1 +c
1
: + (c
2
+ c
4
+ c
8
+ c
9
) (: 1) +c
5
n

j=2
t
j
+ (c
6
+ c
7
)
n

j=2
(t
j
1)
Prema ovoj metodi analize, gornja granica se dobija ako se ima u vidu da i pocinje sa
, 1 i opada sa svakom iteracijom sve dok je i 0. Na taj nacin je t
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(:
2
).
Analiza ove metode putembroja poreenja i premjetanja [6] pokazuje da je broj poreenja
kljuceva (C
i
) u i-tom koraku moze biti najvie i 1, najmanje 1 a u prosjeku i,2, pod
pretpostavkom da su sve permutacije od : elemenata jednako vjerovatne. Broj prem-
jetanja `
i
je jednak C
i
+ 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 2 ALGORITMI SORTIRANJA
Korak Troak Dinamika
0 2 , c
0
1
1 DokVrijedi , < 1n .i:c [c] raditi c
1
:
2 r c [,] c
2
: 1
3 IUmetnuti c [,] u sortirani niz c [1. ... , 1] 0 : 1
4 i , 1 c
4
: 1
5 DokVrijedi i 0 & c [i] r raditi c
5
n

j=2
t
j
6 c [i + 1] c [i] c
6
n

j=2
(t
j
1)
7 i i 1 c
7
n

j=2
(t
j
1)
8 c [i + 1] r c
8
: 1
9 , , + 1 c
9
: 1
Table 3: U ovoj tabeli kolona Trosak oznaava konstantan broj primitivnih operacija
C `
min : 1 3 (: 1)
prosjek
:
2
+ : 2
4
:
2
+ 9: 10
4
max
:
2
+ : 4
4
:
2
+ 3: 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 c
1
Proces se ponavlja sa preostalih : 1 elemenata, zatim : 2 elemenata, itd
Postupak za osam elemenata iz tabele 2.1. je dat na tabeli 2.3.
44 55 12 42 94 18 06 67
06 55 12 42 94 18 44 67
06 12 55 42 94 18 44 67
06 12 18 42 94 55 44 67
06 12 18 42 94 55 44 67
06 12 18 42 44 55 94 67
06 12 18 42 44 55 94 37
06 12 18 42 44 55 67 94
Table 5: Tabela 2.3. Ilustracija sortiranja putem direktne podjele
21
2.1 Sortiranje nizova - osnovne metode 2 ALGORITMI SORTIRANJA
Procedura BinaryInsertion
Ulaz : :. c
n

Izlaz : Sortirani niz c


n

Inicirati i. ,. :. 1. 1. r
Za svaki i = 2. :. 1
{
//Uzeti element niza
r c [i]
1 1; 1 1
// Odrediti lijeve i desne granice
DokVrijedi 1 < 1 raditi
{
: = (1 + 1) ,2
Ako je c [:] < r
{
1 : + 1
}
Inace
{
1 :
}
}
//Pretraziti sortirani niz
Za svaki , = i. 1 + 1. 1
{
c [,] c [, 1]
}
c [1] r
}
Pseudo kod je dat na prilozenom algoritmu.
Broj zamjena je minimalno `
min
= 3 (: 1) u slucaju da su kljucevi odmah sortirani
a maksimalno `
max
= (:
2
,4) + 3 (: 1) ako su pocetni kljucevi poredani opadajucim
redom. Za proracun prosjecnog vremena trajanja uzima se da je ocekivani broj premje-
tanja jednak sumi H
n
= 1 +1,:+1,2 +... +1,:. Pri tome su 1,i vjerovatnoce da je i-ti
element manji od prethodnih i 1 elemenata. Ova vrijednost se moze iskazati i sa
H
n
= ln : + q + 1,2: 1,12:
2
+ ...
gdje je q = 0. 577216... Eulerova konstanta. Za dovoljno veliko : se mogu zanemariti
razlomci u nastavku pa je prosjecan broj premjetanja na i-tom koraku jednak 1
i
=
ln i + q + 1. Prosjecan broj premjetanja, u oznaci `
avg
, je suma svih 1
i
odnosno
`
avg
= : (q + 1) +
n

i=1
ln i
Ova se suma aproksimira integralom
22
2.1 Sortiranje nizova - osnovne metode 2 ALGORITMI SORTIRANJA
Procedura StraightSelection
Ulaz : niz c
n

Izlaz : Sortirani niz c


n

Inicirati : i. ,. /. r
Za svaki i = 1. :. 1
{
/ i
r c [i]
Za svaki , = i + 1. :. 1
{
Ako je c [,] < r tada
{
/ ,
r c [/]
}
}
c [/] c [i]
c [i] r
}
n
_
1
ln rdr = r (ln r 1)[
n
1
= : (ln : 1) : + 1
to na kraju daje `
avg
= : (:ln +q). 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 =
:
2
:
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 posljed-
nja 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 2 ALGORITMI SORTIRANJA
0 1 2 3 4 5 6 7
44 06 06 06 06 06 06 06
55 44 12 12 12 12 12 12
12 55 44 18 18 18 18 18
42 12 55 44 42 42 42 42
94 42 18 55 44 44 44 44
18 94 42 42 55 55 55 55
06 18 94 67 67 67 67 67
67 67 67 94 94 94 94 94
Table 6: Ilustracija BubleSort algoritma
Procedura BubbleSort
Ulaz : niz c
n

Izlaz : Sortirani niz c


n

Inicirati : i. ,. r
Za svaki i = 2. :. 1
{
Za svaki , = :. i. 1
{
Ako je c [, 1] c [,]
{
r c [, 1]
c [, 1] c [,]
c [,] r
}
}
}
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 = (:
2
:) ,2
dok je minimalni, prosjecni i maksimalni broj zamjena (premjetanja) jednak
`
min
= 0. `
avg
= 3 (:
2
:) ,2. `
max
= 3 (:
2
:) ,4
Analiza poboljanih verzija, posebno ShakerSort-a, je dosta slozena. Minimalni broj
poreenja je C
m
= : 1. Knut smatra da je prosjecan broj prolaza u poboljanom Bub-
bleSort algoritmu proporcionalan sa :/
1
_
: a prosjecan broj poreenja proporcionalan
sa (1,2) (:
2
:(/
2
+ ln :)). 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 2 ALGORITMI SORTIRANJA
1 2 3 3 4 4
1 8 8 7 7 4
Smjer | |
44 06 06 06 06
55 44 44 12 12
12 55 12 44 18
42 12 42 18 42
94 42 55 42 44
18 94 18 55 55
06 18 67 67 67
67 67 94 94 94
Table 7: Tabela 2.5. Ilustracija ShakerSort
BubbleSort po karakteristikama negdje izmeu sortiranja umetanjem i sortiranja zam-
jenom. 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 jed-
nako :,3 "mjesta". Svi strogi nacini sortiranja fakticki element na pojedinom koraku
pomjeraju za jednu poziciju to je razlog da trebaju C(:
2
) 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 /
1
. /
2
. .... /
t
pri cemu je bitan uslov /
t
= 1; /
i+1
< /
i
.
Svako /-sortiranje se provodi kao sortiranje umetanjem (Insertion Sort). Pritom se jed-
nostavnost uslova zavretka osigurava sistemom barijera. Stoga se niz proiruje ne jednom
barijerom c
0
vec sa /
1
komponenti. Za t = 4 algoritam se naziva ShellSort.
25
2.2 Sortiranje nizova - poboljane metode 2 ALGORITMI SORTIRANJA
Procedura ShakerSort
Ulaz : Niz c
n

Izlaz : Sortiran niz c


n

Inicirati ,. /. 1. 1. r
1 2; 1 :; / :
Ponavljati
{
Za , = 1. 1. 1
{
Ako je c [, 1] c [,] tada
{
r c [, 1] ; i:
c [, 1] c [,]
c [,] r
/ 1
}
}
1 / + 1
Za , = 1. 1. 1
{
Ako je c [, 1] c [,] tada
{
r c [, 1] ;
c [, 1] c [,]
c [,] r
/ 1
}
}
1 / 1
}
SveDok vrijedi 1 1
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 67
Sortiranje sa 2 mjesta : 06 18 12 42 44 55 94 67
Sortiranje sa 1 mjestom : 05 12 18 42 44 55 67 94
Analiza ShellSort algoritma je postavila nekoliko veoma tekih matematickih problema
od kojih neki jo nisu 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 /
k1
= 3 /
k
+1, /
t
= 1, t = log
3
:| 1. Drugi prijedlog je niz
1. 3. 7. 15. ... gdje je /
k1
= 2 /
k
+ 1, /
t
= 1, t = log
2
:| 1. Analiza pokazuje da su u
posljednjem slucaju rezultati proporcionalni sa :
1:2
. Mada je ova vrijednost bitno bolja
od :
2
to ne znaci da se ne mogu praviti nova poboljanja.
26
2.2 Sortiranje nizova - poboljane metode 2 ALGORITMI SORTIRANJA
Procedura ShellSort
Ulaz : Niz c
n

Izlaz : Sortiran niz c


n

Konstanta t = 4
Inicirati i. ,. /. :. /
t

/[1] = 9; /[2] = 5; /[3] = 3; /[4] = 1


Za svako : = 1. t. 1
{
/ /[:]
: / //barijera
Za svako i = / + 1. :. 1
{
r c [i]
, i /
Ako je : = 0
{
: /
}
: : + 1
c [:] r
DokVrijedi r < c [,] raditi
{
c [, + /] c [,]
, , /
}
c [, + /] r
}
}
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 sor-
tiranja (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 (:log :) u ocekivanom slucaju i (:
2
) u na-
jgorem slucaju. Ako je implementiran prikladno, vjerovatnoca da ce algoritam trajati
asimptotski duze (pod pretpostavkom da je pivot odabran slucajno) je ekstremno mala
za veliko :.
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 (:) 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 (:).
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 : kljuceva u (:) vremenu a najmanji element moze biti
izvucen u (log :) 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 / najmanjih vrijednosti heap to moze omoguciti u (: + / log :) vre-
menu. Heap ima dodatnu prednost u koritenju u kontekstima gdje se mijenja kontekst
elemenata. Svaka izmjena prioriteta (vrijednosti kljuca) moze biti uraena u (log :)
vremenu.
28
3 POHLEPNI ALGORITMI
3 Pohlepni algoritmi
U mnogim algoritmima optimalizacije potrebno je praviti veliki broj selekcija. U di-
namickom 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 al-
ternativne 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 opti-
malno 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 o = 1. 2. .... : od : ak-
tivnosti koje se rasporeuju za koritenje nekog resursa pri cemu svaka aktivnost pocinje
u momentu :
i
i zavrava u datom momentu ,
i
. S obzirom da se koristi samo jedan resurs
i da se neka vremena starta i zavretka mogu preklapati ne moze se udovoljiti svim za-
htjevima. Kaze se da aktivnosti i i , nisu povezani ako se vremena njihovog starta -
zavretka ne preklapaju, formalno [:
i
; ,
i
) [:
j
; ,
j
) = . 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 (,
i
:
i
)
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
,
1
_ ,
2
_ ... _ ,
n
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 (:log :).
Na slici je primjer. Svaka aktivnost je prezentirana intervalom pocetka i zavretka. Sor-
tiranje je izvreno prema vremenu zavretka. Vidi se da je i raspored ,
2
. ,
4
. ,
7
optimalan
jednako kao ,
1
. ,
4
. ,
7
.
3.2 Knapsack problem (problem ranca)
Klasicni (0 1) knapsack problem je poznat problem optimalizacije. Lopov obija radnju
i nalazi : predmeta koje moze uzeti. Predmet i vrijedi
i
i tezak je n
i
, gdje su
i
i n
i
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 \. 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 : nosilaca
medija, npr. disketa, jednakog kapaciteta r smjestiti : fajlova velicina
1
.
2
. ....
m
.
Problem ranca (knapsack problem) (0 1) je tezak za rjeavanje i to je, u sutini, NP-
problem (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 j
i
=
i
,n
i
to
oznacava odnos vrijednosti i tezine. Stavke se sortiraju opadajucim redom velicine j
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 j 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 r vie jedinica nego alterna-
tivni. Svi naredni elementi alternativne selekcije su manje vrijednosti od
i
. Zamjenom
r jedinica bilo koje od tih stavki sa r 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 = (\ ; 1) razapinjuce
stablo je aciklicni skup ivica 1 _ 1 koje povezuju sve cvorove. Pretpostavlja se da svaka
ivica n(n; ) grafa G ima numericku tezinu ili cijenu (koja moze biti negativna ili nula)
cijena stabla 1 se denie kao suma ivica razapinjuceg stabla
n(1) =

(u;v)2T
n(n; )
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 razapin-
juceg stabla. Podsjetimo se da je pohlepni algoritam onaj koji rjeenje nalazi ponavljan-
jem 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 : cvorova ima tacno : 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 = (\. 1) neusmjeren povezan graf cije ivice imaju numericke vrijednosti tezine
(pozitivne, negativne ili nula). Intuicija u pozadini pohlepnih MST algoritama je jednos-
tavna : odrzava se podskup ivica koji je inicijalno prazan i dodaje se jedna po jedna
ivica sve dok ne postane MST. Kaze se da je o _ 1 most (prelaz) ako je podskup ivica
nekog MST (ne moze se reci MST jer nije neophodno i jedinstven). Kaze se da je ivica
(n. ) 1 sigurna ako je ' (n. ) prelaz. Drugim rijecima, izbor (n. ) je siguran
izbor tako da jo uvijek moze formirati MST. Ako je 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 o podskup cvorova o _ \ . Podjela (cut) (o. \ o) je particija cvorova u dva
disjunktna podskupa. Ivica (n; ) prelazi podjelu ako je jedna njena krajnja tacka u o a
druga u \ o. Za dati podskup ivica se kaze da podjela potuje ako ne postoje ivice
u 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 1 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 = (\. 1) povezan neusmjereni graf sa ivicama realnih vrijednosti.
Neka je prelazni podskup od 1 (odnosno podskup nekog MST) i neka je (o. \ o) bilo
koja podjela koja potuje i neka je (n; ) lagana ivica koja prelazi podjelu. Tada je
(n; ) sigurna za .
33
3.3 Pohlepni algoritmi na grafovima 3 POHLEPNI ALGORITMI
3.3.1 Kruskalov algoritam
Kruskalov algoritam radi tako da se ivice dodaju na u rastucem redoslijedu tezina
(najprije lake ivice). Ako naredna ivica ne formira ciklus unutar tekuceg skupa ivica
tada se dodaje u . 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 (n; ) koja se treba
dodati i pretpostavimo da ta ivica ne formira ciklus u . Neka je
0
stablo u umi
koje sadrzi cvor n. Posmatra se Podjela (
0
. \
0
). Svaka ivica koja prelazi podjelu nije
u tako da ta podjela potuje i (n; ) je lagana ivica preko podjele (jer su sve laganije
ivice iskoritene ranije u algoritmu). Stoga je (n; ) sigurna ivica.
Teki dio algoritma je kako ekasno detektovati da li dodavanje ivice kreira ciklus u .
Moze se provesti pretrazivanje podgrafa koji je kreiran ivicama iz skupa ali to uzima
jako puno vremena. Potreban je brz i pouzdan test koji nam daje odgovor na pitanje
da li je n ili u istom stablu . 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 n.
NaciSet(u) : Nalazenje skupa koji sadrzi datu stavku n.
Union(u;v) : Spojiti skup koji sadrzi n i skup koji sadrzi u zajednicki skup.
Svaka od ovih operacija se izvrava u C(log :) vremenu na skupu velicine :. Ova struk-
tura je zanimljiva jer se niz od : operacija izvrava mnogo brze od O(:log :).
U ovom algoritmu cvorovi grafa su elementi pohranjeni u skupove a skupovi su cvorovi
u svakom stablu . Skup 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 \ broj cvorova
i 1 broj ivica. S obzirom da je graf povezan moze se uzeti da je 1 _ \ 1. Za sortiranje
ivica potrebno je (1 log 1). Petlja se ponavlja 1 puta a svaka iteracija ukljucuje
konstantan broj pristupa Union-Find strukturi na skupu od \ stavki. Stoga, za svaki
pristup treba (\ ) vremena a skupa (1 log \ ). Stoga je ukupno vrijeme izvrenja
jednako njihovoj sumu koja je ((\ + 1) log \ ). S obzirom da \ u asimptotskom smislu
nije vece od 1 slijedi da je vrijeme izvrenja (1 log \ ).
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 algo-
ritam 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 : koji moze biti bilo koji. U bilo koje vrijeme
podskup ivica 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 o koji je dio stabla i njegov komplement tada postoji
podjela grafa i tekuci skup ivica potuje tu podjelu. MST lema kaze da je sigurno
dodavanje lagane ivice. Na slici to je ivica tezine 4 koja ide u cvor n. Stoga se n dodaje
u cvorove skupa o 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) sljed-
nika a numericka vrijednost u svakom cvoru je vrijednost kljuca.
Ilustracija Prim-ovog algoritma
Za analizu Prim-ovog algoritma racuna se vrijeme potroeno na svakomcvoru nakon to se
preuzme iz reda prioriteta (priority queue). Ova aktivnost uzima O(log \ ) vremena. Za
svaku ivicu se potroi oko O(log \ ) vremena kako bi se smanjio kljuc susjednih cvorova pa
je vrijeme C(log \ + deg (n) log \ ). Ostali koraci azuriranja se obavljaju u konstantnom
vremenu. Na osnovu ovoga je
1 (\. 1) =

u2V
(log \ + deg (n) log \ ) =

u2V
(1 + deg (n)) log \
= log \

u2V
(1 + deg (n)) = (log \ ) (\ + 21) = ((\ + 1) log \ )
S obzirom da je G povezan \ asimptotski nije veci od 1 tako da je rezultat (1 log \ ).
To je tacno jednako sa procjenom za Kruskalov algoritam.
3.3.3 Dijkstra algoritam
Ovaj algoritam je namijenjen trazenju najkraceg puta u usmjerenim grafovima. Pret-
postavlja se da ivice grafa imaju svoje vrijednosti i cilj je naci najkrace putanje iz jednog
cvora u sve cvorove grafa.
Distanca izmeu dva cvora n i , u oznaci o (n; ), je minimalna duzina putanje od n do
.
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 = (\ ; 1) i izdvojenim
pocetnim cvorom : \ . 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 j:cd () koji ukazuje na pocetak. Slijedeci pointere prethodnika
unazad od bilo kojeg cvora konstruie se reverzna slika najkraceg puta do .
Osnovna struktura Dijkstra algoritma je odrzavanje procjena najkraceg puta za svaki
cvor, u oznaci d []. Intuitivno gledano, d [] ce biti duzina najkraceg puta od : do koji
je poznat algoritmu. Ova vrijednosti je uvijek veca ili jednaka sa stvarno najkracim putem
od : do . Inicijalno, putevi su nepoznati tako da je d [] = . Inicijalno je d [:] = 0 a
svi ostali d [] su postavljeni na . Kako algoritam napreduje i kako se ukljucuje vie
cvorova azurira se d [] 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 : do koji je kraci od d [] tada se vri azuriranje te vrijednosti. Ovaj metod je
zajednicki za veliki broj algoritama optimalizacije.
Posmatra se ivica od cvora n do cvora cija je tezina n(n; ). Pretpostavka je da postoje
procjene za d [n] i d []. Poznato je da postoji put od : do n sa tezinom d [n]. Ako se uzme
ta putanja i ako se slijedi ivica (n; ) dobija se putanja do duzine d [n] + n(n; ). Ako
je ta putanja bolja od postojeceg puta do duzine d [] tada se d [] azurira na vrijednost
d [n] +n(n; ). Potrebno je zapamtiti da najkraci put do prolazi kroz n to se cini tako
da se azurira pointer prethodnika za .
Primjer relaksacije
Treba primijetiti da kad god se d [] postavi na konacnu vrijednost uvijek postoji trag
o putanji te duzine. Stoga je d [] _ o (:; ). Ako je d [] = o (:; ) tada naknadne
relaksacije ne mogu promijeniti tu vrijednost.
Nije teko vidjeti da ako se relaksacija provede nad svim ivicama grafa vrijednosti d []
obavezno konvergiraju konacnoj stvarnoj vrijednosti iz :. Cilj svakog dobrog algoritma
nalazenja najkraceg puta je da se azuriranja obavljaju na pametan nacin kako bi konver-
gencija 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, o _ \ , za koji se proglaava da "znamo" stvarnu distancu,
d [] = o (:; ). Inicijalno je o = , prazan skup i stavlja se d [:] = 0 a za sve ostale +.
Jedan po jedan cvor iz \ o se dodaje u o.
Skup o moze biti implementiran koritenjem niza boja koje su dodijeljene cvorovima.
Inicijalno su svi cvorovi bijeli a /o,c [:] = c::c kako bi se naznacilo da o.
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 n
\ o se odrzava procjena distance d [n]. Pohlepni dio algoritma se odnosi na to da se
uzima cvor iz \ o za koji je d [] minimalno tj. uzima se neobraeni cvor koji je (prema
procjeni) najblizi ka :.
Kako bi se ova selekcija izvrila ekasno, cvorovi iz \ o se stavlja u red prioriteta (tj.
heap - gomila) gdje je kljucna vrijednost svakog cvora n jednaka d [n]. 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, (1 log \ ).
Drugi algoritmi kojima se rjeava problem najkraceg puta su :
- Floyd Warshall-ov algoritam
- Algoritam mravlje kolonije
38
4 SLU

CAJNI 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, c. c i : i
inicijalnu vrijednost r
0
koja se zove sjeme. Prema njegovoj deniciji, niz slucajnih brojeva
je denisan izrazom
r
k+1
= (c r
k
+ c) mod :
Za c = 13, c = 0, : = 31, r
0
= 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 :1. Ako se niz pseudoslucajnih cijelih brojeva
podijeli sa : dobija se uniformno distribuirani brojevi u pokretnom zarezu iz intervala
[0; 1]. U prethodnom primjeru to je niz
39
4.2 Uniformna distribucija 4 SLU

CAJNI BROJEVI
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 ukljuci-
vao generator slucajnih brojeva koji se zvao RND ili RANDU. To je bio multiplikativno
kongruentalni algoritam sa parametrima c = 65539, c = 0 i : = 2
31
. Sa internim ob-
likom pohrane (32 bita) aritmetika mod 2
31
se lako izvrava. S obzirom da je c = 2
16
+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:
r
k+2
= (2
16
+ 3) r
k+1
= (2
16
+ 3)
2
r
k
= (2
32
+ 6 2
16
+ 9) r
k
= [6 (2
16
+ 3) 9] r
k
Stoga je
r
k+2
= 6 r
k+1
9 r
k
Rezultat je ekstremno velika korelacija izmeu tri sukcesivna slucajna broja.
Dugo godina je funkcija uniformno distribuiranih slucajnih brojeva bio multiplikativni
kongruentalni generator sa parametrima c = 7
5
, c = 0, : = 2
31
1 = 2147483647. Ove
vrijednosti su bile preporucene od strane Park i Miller (1988). Starije verzije programa
Matlab generiu slucajne brojeve u obliku /,: za / = 1. .... : 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. Algori-
tam 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, ., u intervalu [0; 1]. Preostale tri
rijeci sadrze inteks i koji se mijenja od 0 do 31, jednog cijelog broja , i aga za "poza-
jmljivanje" /. Cjelokupan vektor stanja se gradi po jedan bit u periodu inicijalizacije.
Razlicite vrijednosti , 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
.
i
= .
i+20
.
i+5
/
Tri velicine i. i +20 i i +5 se interpretiraju po modulu 32 (koritenjem njihovih 5 zadnjih
bitova). Velicina / se dobija iz prethodnog koraka; ona je ili nula ili mali pozitivni broj.
Ako je .
i
pozitivan tada je / = 0 za naredni korak; ako je .
i
negativan dodavanjem
velicine 1.0 se pretvara u pozitivan prije nego se sacuna i / se postavlja na vrijednost 2
53
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.3 Normalna distribucija 4 SLU

CAJNI BROJEVI
Marsaglia je pokazao da niz ima period skoro 2
1430
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 ,.
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 istovre-
meno. Zasniva se na nalazenju slucajne tacke u jedinicnom krugu putem generisanja uni-
formno 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 sosti-
cirani algoritam trazenja u tabeli koji je razvio, takoe, George Marsaglia. Nazvan je
ziggurat algoritam.
Funkcija gustine vjerovatnoca normalne distribucije je tzv. zvonasta kriva
, (r) = c c
x
2
=2
gdje je c = 1,
_
2: normalizacijska konstanta koja se u ovom slucaju moze ignorisati.
Ako se generiu slucajne tacke (r; ) uniformno distribuirane u ravni i ako se odbaci
bilo koja od njih koja nije ispod krive preostale vrijednosti r formiraju zeljenu normalnu
distribuciju. Ziggurat algoritam obuhvata prostor ispod funkcije gustine sa neto vecom
povrinom sa : sekcija.
41
4.3 Normalna distribucija 4 SLU

CAJNI BROJEVI
Ilustracija ziggurat algoritma
Slika pokazuje slucaj za : = 8; stvarni kod koristi : = 128. Gornjih : 1 sekcija su
pravougaonici. Donja sekcija je pravougaonik zajedno sa beskonacnim repom ispod grafa
, (r). Desne ivice pravougaonika su u tackama .
k
, / = 1. .... : oznacene kruzicima. Sa
, (.
1
) = 1 i , (.
n+1
) = 0 visina /-te sekcije je , (.
k
) , (.
k+1
). Kljucna ideja je da
se izaberu .
k
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 : sekcija moguce je rijeiti transcedentnu jednadzbu kako bi se nalo
.
n
, tacka u kojoj beskonacni rep sijece prvu pravougaonu sekciju. Na slici sa : = 8 se
dobija da je .
n
= 2.34. U stvarnom kodu sa : = 128 je .
n
= 3.4426. Jednom kad se
dobije .
n
lako je izracunati zajednicke povrine i druge tacke .
n
sa desne strane. Takoe
je moguce izracunati o
k
= .
k1
,.
k
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 .
k
i o
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 , izmeu 1 i : i jedan uniformno
distribuiran slucajni broj n izmeu 1 i 1. Nakon toga se pravi provjera da li n 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 : 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.4 Testiranje slu cajnosti 4 SLU

CAJNI BROJEVI
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. : =
6729. Taj broj se kvadrira pa se dobije 6279
2
= 39425841; iz njega se izdvoje srednje
cetiri cifre : = 4258 i to je naredni clan niza itd. U matematickom smislu, generisanje se
odvija po rekurentnom izrazu [r
2
k
,100] = r
k+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
log
_
1 +
1
d
_
. Pritom se pretpostavlja da skup brojeva zadovoljava jedan broj uslova.
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.4 Testiranje slu cajnosti 4 SLU

CAJNI BROJEVI
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.01
232
- 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 `1-kompletnost
i kreiran je mozda najveci problem u kompjuterskoj nauci : 1 = `1 ? 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 kom-
pleksnosti najgoreg slucaja kao funkcije od :, 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 op-
eracije 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 :
1
. :
2
. .... :
r
od /
1
. /
2
. .... /
r
bita respektivno kaze se da radi u polinomijalnom vremenu ako postoje prirodni brojevi
d
1
. d
2
. .... d
r
takvi da je broj potrebnih bit operacija za njegovo izvrenje O
_
/
d
1
1
. .... /
d
r
r
_
.
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(:log :)) su ogranicne
odozgo polinomima (kao to je O(:
2
)). Neke funkcije koje "izgledaju" kao polinomijalne
ustvari to nisu. Naprimjer, neka je predmet analize algoritam koji ima ulaz graf velicine
: i cijeli broj / koji radi u vremenu O
_
:
k
_
. On nije polinomijalni jer je / ulazna velicina
takva da je korisniku omoguceno da odabere / = : to povlaci da je vrijeme izvrenja
O(:
n
) a to nije polinom po :. Vazno je napomenuti da eksponent mora biti konstanta
nezavisna od :.
45
5.1 Problemi odlu civanja 5 NP KOMPLEKSNOST
Naravno, reci da su algoritmi polinomijalnog vremena "ekasni" nije tacna. Algoritam
cije je vrijeme izvrenja C(:
1000
) je sigurno veoma neekasan. Bez obzira na to, ako
algoritam radi loije nego u polinomijalnom vremenu (npr. 2
n
) tada je sigurno da nije
ekasan osim za male vrijednosti :.
Denicija. Algoritam je subeksponencijalni ako je njegova slozenost funkcija oblika
C
_
c
o(n)
_
gdje je : 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 `1-problema ce biti nazvan problemom odlucivanja. Prob-
lem se naziva problemom odlucivanja ako je njegov rezultat jedan od odgovora "Da" ili
"Ne".
Mnogi problemi se mogu formulisati kao problemi odlucivanja. Naprimjer, problem na-
jmanjeg razapinjuceg stabla se moze formulisati na sljedeci nacin : Za dati tezinski graf
G i cijeli broj / da li G ima razapinjuce stablo koje je najvie / ?
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 prob-
lema 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 : 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 prepoz-
navanja jezika. Jezik 1 se moze denisati kao
1 = (G; /) [G posjeduje MST tezine najvie /
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; /) algoritam bi trebao dati odgovor "Da" ako (G; /) 1
to povlaci da G posjeduje razapinjuce stablo tezine najvie / 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 1 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 / ili ne.
Denicija. Neka je sa 1 oznacen skup svih jezika za koje clanstvo moze biti testirano u
polinomijalnom vremenu.
Potrebno je primijetiti da su jezici skupovi stringova a 1 je skup jezika. 1 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 polinomi-
jalnom vremenu tada vrijedi da je 1 1.
Postoji i tezi jezik
` = (G; /) : G ima jednostavnu putanju tezine barem /
Za dati graf G i cijeli broj / kako bi se prepoznalo da li je on u jeziku ` ? Moze se
pokuati pretrazivanje grafa i traziti jednostavni putevi sve dok se ne nae neki tezine /.
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 1 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 `1 se sastoji od svih problema odlucivanja za koje se
odgovor DA moze provjeriti u polinomijalnom vremenu koritenjem neke dodatne infor-
macija zv. certikata. Klasa slozenost co `1 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 vre-
menu. Ova klasa sadrzi 1 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 `1 tc .c/ (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 `1 /o:j|ctc: ako je (1) NP, (2) NP-tezak.
To znaci da je `1C = `1 `1 tc .c/.
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 \ i 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 = (G) : G ima Hamiltonog ciklus
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.
3
.
7
. ....
13
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 1 i za r 1 algoritam verikacije je algoritam koji za dato r i
dato , koje se naziva certikat, moze vericirati da je r u jeziku 1 koristeci taj certikat
kao pomoc. Ako r nije u 1 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 :
lHC = (G) : G ima jedinstveni Hamiltonov ciklus
HC = (G) : G nema Hamiltonov ciklus
Neka je graf G u jeziku lHC. 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 :
ali bi to uopte ne bi bilo ekasno jer postoji ukupno :! 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 algorit-
mom 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 nedeter-
minizma.
NP je, kao i u slucaju P, skup jezika zasnovan na nekoj mjeri kompleksnosti (komplek-
snost verikacije). Potrebno je uociti da je 1 _ `1. Drugim rijecima, ako se problem
moze rijeiti u polinomijalnom vremenu tada se clanstvo sigurno moze vericirati u poli-
nomijalnom vremenu.
Nije poznato da li je 1 = `1. 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 1 ,= `1 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 l. Za H se zna (ili cvrsto vjeruje) da je tezak odnosno da ne moze biti rijeen u
polinomijalnom vremenu. Sa druge strane, kompleksnost za l je nedenisana ali se
sumnja da je jako tezak.

Zeli se dokazati da l ne moze biti rijeen u polinomijalnom
vremenu.

Zeli se pokazati da
(H , 1) = (l , 1)
Da bi se ovo pokazalo dokazuje se suprotna tvrdnja
(l 1) = (H 1)
Drugim rijecima, da bi se pokazalo ad l nije rjeiv u polinomijalnom vremenu pret-
postavlja se da postoji algoritam kojim se l rjeava u polinomijalnom vremenu pa se
izvodi kontradikcija kojom se pokazuje da H moze biti rijeen u polinomijalnom vre-
menu.
Neka je data podutina koja moze rijeiti bilo koju instancu problema l 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
probleml. 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 l 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 3Co|, 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 l sljedeci problem. Za dati graf G = (\ ; 1) se kaze da podskup cvorova \
0
_ \
formira clique ako za svaki par cvorova n. \
0
(n; ) vrijedi da je n. 1. To znaci
da je podgraf induciran sa \
0
kompletan graf.
5.4.2 Clique pokrivac (cover) (CCov)
Za dati graf G = (\ ; 1) i cijeli broj / skup cvorova se moze podijeliti u podskupove
\
1
. \
2
. .... \
k
takve da je
_
i
\
i
= \ i da je svaki \
i
clique od G.
Problem Clique pokrivaca se javlja u aplikacijama klasteringa
2
. Ivica izmeu dva cvora
se stavlja ako su oni dovoljno slicni da budu klasterisani u istu grupu.

Zeli se znati da li
je moguce klasterisati sve cvorova u / grupa.
Pretpostavimo da se zeli rijeiti CCo problem ali nakon uzaludnih i besplodnih napora ne
moze se naci algoritam polinomijalnog vremena. Kako se moze dokazati da nije izvjesno
da CCo nema rjeenje u polinomijalnom vremenu ? Poznato je da je 3Co| NP kompletan
problem pa strucnjaci vjeruju da 3Co| , 1. Osjeca se da postoji neka veza izmeu ova
dva problema.

Zeli se dati odgovor na pitanje da li vrijedi
(3Co| , 1) = (CCo , 1)
to se pokazuje tako da se dokaze suprotno tvrenje
(CCo 1) = (3Co| 1)
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 CCo (G; /).
Za dati graf i cijeli broj / ova podrutina vraca odgovor "istina" ako G ima clique velicine
/ i "neistina" u suprotnom, uz cinjenicu da ta rutina radi u polinomijalnom vremenu.
Kako se sada ovakva rutina koristi za rjeenje dobro poznatog tekog 3Co| problema ?
Treba se napisati rutina koja radi u polinomijalnom vremenu za 3Co| i koja moze zvati
rutinu CCo (G; /) za bilo koji graf i bilo koji cijeli /.
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 (n; )
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 3Co| =
_
G; 3
_
CCo
Dokaz: (=) Ako je G moguce obojiti sa 3 boje neka su \
1
. \
2
. \
3
tri klase za svaku od
boja. Tvrdi se da je to klik pokrivac velicine 3 za G s obzirom da ako su n i razliciti
cvorovi u \
i
tada n; , 1 (G) s obzirom da susjedni cvorovi ne mogu biti iste boje.
Ovo povlaci da n; 1
_
G
_
. Stoga svaki par razlicitih cvorova u \
i
cini susjedne u G.
(=) Neka je pretpostavka da G ima klik pokrivac velicine 3 oznacen sa \
1
. \
2
. \
3
. Za
i 1. 2. 3 se daje cvorovima u \
i
boja i. Smatra se da je to legalno bojenje za G s
obzirom da ako su razliciti cvorovi n i u \
i
tada slijedi da je n; 1 (G) s obzirom
da su zajednickom kliku. Ovo povlaci da n; , 1
_
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) 1
1
reducibilan na jezik
1
2
sa polinomijalnim vremenom, u oznaci 1
1
_
P
1
2
, ako postoji racunarska funkcija ,
koja radi u polinomijalnom vremenu takva da vrijedi
(\r) (r 1
1
= , (r) 1
2
)
U navedenom primjeru je pokazano da 3Co| _
P
CCo. Posebno, vrijedi da je , (G) =
_
G; 3
_
. Treba primijetiti da je lako formirati komplement grafa u O(:
2
) vremenu (tako
to se zamijene 0 i 1 u odgovarajucoj matrici). Stoga je , izracunljiva u polinomijalnom
vremenu.
Intuitivno gledano, kad se kaze 1
1
_
P
1
2
to znaci "Ako je problem 1
2
rjeiv u polinomi-
jalnom vremenu tada to vrijedi i za 1
1
". To je zbog toga to se rutina u polinomijalnom
vremenu za 1
2
moze primijeniti na , (r) kako bi se utvrdilo da li , (r) 1
2
ili ekviva-
lentno, da li r 1
1
. Stoga, u smislu izracunljivosti u polinomijalnom vremenu, 1
1
nije
tezi od 1
2
.
Nacin na koji se ovo koristi NP kompletnost je tacno obrnut. Obicno postoji jak dokaz
da 1
1
nije rjeiv u polinomijalnom vremenu pa je redukcija efektivno ekvivalentna kao
da se kaze "S obzirom da za 1
1
nije izvjesno da je rjeiv u polinomijalnom vremenu tada
ni za 1
2
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 1
1
_
P
1
2
i 1
2
1 tada 1
1
1.
Lema. Ako 1
1
_
P
1
2
i 1
2
, 1 tada 1
1
, 1.
Vazna cinjenica po osnovu reducibilnosti je tranzitivnost. Drugim rijecima
Lema. Ako 1
1
_
P
1
2
i 1
2
_
P
1
3
tada 1
1
_
P
1
3
.
Razlog je u tome to ako su dvije funkcije , (r) i q (r) izracunljive u polinomijalnom
vremenu tada je i njihova kompozicija , (q (r)) 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 1 je NP-tezak ako
54
5.5 NP kompletnost 5 NP KOMPLEKSNOST
1
0
_
P
1 za sve 1
0
`1
Ovdje 1 ne mora biti u NP.
Denicija. Jezik 1 je NP-kompletan ako
1 `1
1 je NP-tezak
Da bi se pokazalo da je problem NP kompletan alternativa je, kao obicno laki put,
koritenje tranzitivnosti.
Lema. 1 je NP kompletan ako
1 `1
1
0

P
1 za neki poznati NP kompletan jezik 1
0

Cinjenica da su svi 1
00
`1 reducibilni na 1
0
(s obzirom da je 1
0
NP kompletan pa time
i NP tezak) i stoga, zbog tranzitivnosti je 1
00
reducibilan na 1 povlaci da je 1 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 na problem 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 1 _ `1 i 1 _ co `1. Pitanje je da li je 1 = `1. 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 1
1
i 1
2
dva problema odluke. Kazemo da se 1
1
moze reducirati u
polinomijalnom vremenu na 1
2
, u oznaci 1
1
_ j1
2
ako postoji polinomijalni algoritam za
rjeavanje 1
1
koji kao potrpogram koristi algoritam za rjeavanje problema 1
2
pri cemu
je broj poziva tog programa takoer polinomijalan.
Drugim rijecima, ako je 1
1
_ j1
2
tada 1
1
nije bitno tezi od 1
2
.
Denicija. Problem odluke 1 je NP-potpun ako je 1 `1 i 1
1
_ j1 za svaki 1
1
`1.
Klasa svih `1 potpunih problema se oznacava sa `1C.
`1 potpuni problemi su najtezi problemi u klasi `1. Postojanje polinomijalnog algo-
ritma za bilo koji od `1 potpunih problema bi povlacilo da vrijedi 1 = `1. 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 1 polinomijalno ekvivalentna.
2. Dokazati NP-kompletnost sljedeceg problema. Za dati neusmjereni povezan graf G =
(\ ; 1) i prirodni broj / ustanoviti da li G sadrzi klik velicine / i nezavisni skup velicine
/
3. Dokazati NP-kompletnost sljedeceg problema. Dat je neusmjereni graf G = (\ ; 1) i
prirodni broj /. Utvrditi da li G sadrzi podskup od / cvorova ciji je inducirani podgraf
aciklicki.
4. Zadat je regularni graf G (graf ciji svi cvorovi imaju isti stepen) i prirodni broj /.
Treba utvrditi da li G sadrzi klik velicine /. 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

Zivkovic, Algoritmi, Matematicki fakultet, Beograd, 2000.
[4] S. A. Abramov, G. G. Gnezdilova, E. N. Kapustina, M. I. Selyun, Zadachi po pro-
gramirovaniyu, Bibilotechka programmista, Moskva, "Nauka", 1988
[5] Don Colton, A Quick Guide to Big Oh, Brigham Young University Hawaii
[6] Niklaus Wirth, Algorithms and data structure,
[7] Grzegorz Malewicz, Introduction to Computer Algorithms, Lecture Notes (under-
graduate CS470 course), 2005
[8] Marty Stepp, TCSS 342 Lecture Notes, Course Overview, Review of Math Concepts,
Algorithm Analysis and Big-Oh Notation, University of New York, 2005
[9] David Mount, Design and Analysis of Computer Algorithm, Department of Com-
puter Science, University of Maryland, Fall 2003
[10] www.wikipedia.com
[11] Richard Kaye, Some Mineseeper Congurtions, School of Mathematics, The Univer-
sity 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 NP-completness,
http://web.mat.bham.ac.uk/R.W.Kaye/minesw/ordmsw.htm
57

You might also like