Algor Prog 2018 Zim
Algor Prog 2018 Zim
MATEMATIČKI ALGORITMI
I
PROGRAMIRANJE
Radni materijal za vježbe
Autori :
Dr.sc. Samra Moranjkić
Dr.sc.mat. Zoran Jasak
Tekst obuhvata teorijski dio poglavlja koja su predviđena planom ovog predmeta. Tekst ne
obuhvata zadatke koji su rađeni kao praktični primjeri pojedinih vrsta algoritama. Njihova
namjena je bila izgraditi analitički pristup u rješavanju praktičnih matematičkih problema.
NAPOMENA : Tekst i dijelovi teksta ne mogu biti reprodukovani ili preuzimani bez znanja i
saglasnosti autora.
Autori :
Sadrµzaj
1 Opšti pojmovi o algoritmima 1
1.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Ulaz i izlaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Cikliµcni algoritmi 13
3.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Sume i proizvodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Cijeli brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 Nizovi brojeva i znakova . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4 Euklidov algoritam 39
4.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2 Kako radi Euklidov algoritam ? . . . . . . . . . . . . . . . . . . . . . . . 39
4.3 Sloµzenost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.4 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6 Asimptotska procjena 53
6.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1.1 -notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1.2 O-notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1.3 -notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.2 Sloµzenosti nekih tipova algoritama . . . . . . . . . . . . . . . . . . . . . . 55
6.2.1 Algoritmi konstantnog vremena . . . . . . . . . . . . . . . . . . . 55
6.2.2 Algoritmi linearnog vremena . . . . . . . . . . . . . . . . . . . . . 55
6.2.3 Algoritmi kvadratnog vremena . . . . . . . . . . . . . . . . . . . . 55
6.2.4 Algoritmi logaritamskog
p vremena . . . . . . . . . . . . . . . . . . 56
6.2.5 Algoritmi brzine n . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.2.6 Algoritmi eksponencijalnog vremena . . . . . . . . . . . . . . . . 57
6.2.7 Kombinacije algoritama . . . . . . . . . . . . . . . . . . . . . . . 57
6.3 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
7 Rekurzije 63
7.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.2 Rekurentne jednadµzbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.3 Procjena sloµzenosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.4 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8 Sortiranja 79
8.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
8.2 Sortiranje nizova - osnovne metode . . . . . . . . . . . . . . . . . . . . . 79
8.2.1 Sortiranje putem umetanja (Insertion sort) . . . . . . . . . . . . . 80
8.2.2 Shell sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.2.3 Sortiranje putem direktne podjele (Selection sort) . . . . . . . . . 86
8.2.4 Sortiranje putem zamjene (Bubble sort) . . . . . . . . . . . . . . 88
8.3 Poboljšane metode (sloµzenost n log n) . . . . . . . . . . . . . . . . . . . . 92
8.3.1 Merge sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
8.3.2 Quick sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
11 NP Sloµzenost 138
11.1 Problemi odluµcivanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
11.2 Problemi prepoznavanja jezika . . . . . . . . . . . . . . . . . . . . . . . . 140
11.3 Veri…kacija polinomijalnog vremena i certi…kati . . . . . . . . . . . . . . 142
11.3.1 NP klasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
11.3.2 Problem tri boje . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
11.3.3 Clique pokrivaµc (cover) (CCov) . . . . . . . . . . . . . . . . . . . 145
11.3.4 Redukcija na polinomijalno vrijeme . . . . . . . . . . . . . . . . . 146
11.4 NP kompletnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
13 Literatura 165
Prvi zapis algoritma prilago†en raµcunaru pripada Adi Byron iz 1842, pa se zbog ovoga
smatra prvom programerkom, a raµcunao je Bernoullijeve brojeve. Raµcunar za koji je
napisan je bio analitiµcki stroj koji je zamislio, ali nikad u potpunosti proveo u djelo, Englez
Charles Babbage. Analitiµcki stroj je trebao biti prvi programabilni raµcunar, sastavljen
u potpunosti od mehaniµckih dijelova. Mehaniµcki dijelovi i …ziµcka glomaznost su glavni
razlozi zašto nikad nije završen.
Algoritam je skup pravila kojima se provodi kalkulacija bilo ruµcno bilo putem mašine
Algoritam je niz raµcunskih koraka kojima se ulaz transformiše kako bi se dobio izlaz
Algoritam je niz operacija koje se izvode nad podacima koji trebaju biti organizo-
vani u strukturama podataka
U tekstu [11] algoritam se de…niše kao "jasno speci…ciran matematiµcki process izraµcuna-
vanja; skup pravila koji ako se slijede daju µzeljeni rezultat". U matematici, raµcunarstvu,
lingvistici i srodnim disciplinama, algoritam je konaµcan niz dobro de…nisanih naredbi
za ostvarenje zadatka, koji će za dato poµcetno stanje završiti u de…nisanom konaµcnom
stanju.
Iz datih de…nicija se moµze zakljuµciti da je algoritam skup koraka odnosno postupak kojim
se odre†eni problem rješava u konaµcnom broju koraka. Istorijski gledano, svi problemi su
rješavani nekim vidom algoritma ali je proteklo puno vremena da se napravi odgovarajuća
formalizacija.
Najpoznatiji algoritam u istoriji datira mnogo prije vremena starih grka; to je Euklidov
algoritam za raµcunanje najvećeg zajedniµckog djelioca dva cijela broja.
Ulazne veliµcine de…nišu skup podataka koji su predmet obrade (input). Ove veliµcine
mogu biti numeriµcke veliµcine, fajlovi, tekstovi, gra…ka itd.
Postupak rješavanja de…niše svaki pojedini korak koji je potreban za rješenje problema,
ukljuµcujući deklaracije, inicijalizacije i svaku operaciju koja se obavlja.
Izlaz (output) de…niše rezultat rada koji moµze biti numeriµcka veliµcina, skup vrijednosti,
datoteka itd.
Svaki algoritam mora imati završetak. Pravljenje tzv. vjeµcnih petlji je klasiµcna pro-
gramerska greška. Potrebno je razlikovati procedure od funkcija. U principu, svaka pro-
cedura ima rezultat ali on ne mora biti vidljiv u svim sluµcajevima. Primjer je procedura
sortiranja koja se moµze izvršavati kao dio nekog većeg algoritma odnoso uslova za naredne
korake. Funkcija mora kao rezultat imati vrijednost i moµze biti µclan u operacijama.
- Putem brojaµca, kojim se zadaje koliko puta se odabrani korak ili grupa koraka
ponavlja. Bitno je napomenuti da se u ovom tipu ciklusa zadati broj koraka ne
moµze mijenjati u toku samog izvršenja
- Putem uslova za koji se ne zna unaprijed koliko puta će se izvršiti. Ovo je sluµcaj
npr. kada se µzeli postići odre†ena taµcnost u raµcunanju; najµcešće nije poznato koliko
koraka treba napraviti da bi se taµcnost postigla pa se traµzi drugi naµcin.
Najveća opasnost cikliµcnih algoritama je formiranje tzv. vjeµcitih petlji jer uslov završetka
nije dobro de…nisan.
Serijski ili paralelni: Većina današnjih raµcunara sadrµzi samo jedan procesor te
stoga obavlja naredbe jednu po jednu odnosno serijski. Algoritmi dizajnirani da se
izvršavaju u takvom okruµzenju shodno tome se nazivaju serijski algoritmi. Suprotno
njima su paralelni algoritmi koji sa rastom broja višeprocesorskih raµcunara dobivaju
sve veću vaµznost. Paralelni algoritmi koriste mogućnost višeprocesorskog sistema
na naµcin da problem podijele na više malih potproblema koje svaki procesor rješava
zasebno te se zatim rezultati spajaju. Paralelni algoritmi uz resurse potrebne za
obradu podataka tako†er imaju i malu potrošnju resursa na komunkaciju izme†u
više procesora. Algoritmi za sortiranje su jedan od primjera algoritama koje je
moguće znatno poboljšati upotrebom paralelnih procesora, dok je neke probleme
sasvim nemoguće riješiti paralelnim algoritmom.
Taµcan ili pribliµzan: Iako algoritmi u principu daju taµcan rezultat, ponekad al-
goritam traµzi pribliµzno rješenje koje je dovoljno blizu toµcnom, ili je taµcno rješenje
nemoguće naći.
Brute force algoritmi: raµcunar "µcistom silom" isprobava sve mogućnosti i traµzi
odgovarajuće rješenje. Ovo su najnee…kasnijji algoritmi jer ukazuju na nesistem-
atiµcnost i neanalitµcnost u pristupu.
Podijeli i vladaj algoritmi (Divide and conquer): Problem se dijeli na više istih,
manjih problema. Podjela teµce tako dugo dok se ne do†e do malog problema kojeg
je jednostavno riješiti (obiµcno rekurzijom).
Tekstualno predstavljanje moµze biti putem pseudokoda ili putem odabranog program-
skog jezika. Pseudokod nije vezan ni za jedan speci…µcan programski jezik. U radu ćemo
koristiti sljedeće formulacije pseudokoda :
Primjer :
for(i=1;i 100;i++)
znaµci da će se promjenljiva i imati poµcetnu vrijednost 1 (i = 1), da će se u svakom koraku
povećavati za 1 (i + +, posebna konvencija C++ jezika) sve dok se ne dobije vrijednost
manja ili jednaka 100.
SveDokJe (<uslov>) : poµcetak ciklusa u kojem, u pravilu, nije poznat broj ko-
raka. Ciklus se izvršava sve dok vrijedi <uslov>. U programskom jeziku C++ ovo
je struktura while(...){...}
Poseban vid logiµcke strukture su tzv. sluµcajevi. Koristi se ako imamo više uslova, npr.
tri ili više, koje trebamo ispitivati. Osnovna forma je:
Svaki od sluµcajeva je zaseban blok. Pritom veliµcina moµze zadovoljavati više uslova uslov
1, uslov2, ... Primjer je u nastavku.
Piši(iz,a) : Na ovaj naµcin podatak a upisujemo u izlaz iz, koji moµze biti datoteka,
drugi program i sliµcno. U algoritmima koji slijede ovo je obiµcno naznaµceno kao
Izlaz, osim ako to nije posebno naznaµceno
M in min fx; yg
Na dijagramu je vidljiv tok odozgo naniµze, uz dva grananja odnosno mjesta na kojima
se ispituje uslov i donosi odgovarajuća odluka o nastavku. Ovaj isti algoritam se moµze
predstaviti pseudokodom koji je u algoritmu Kvadratna jednadµzba, V.1.
Isti algoritam je mogao biti ispisan na naµcin da se koriste labele, kao što je prikazano na
verziji 2.
p
D
Im -
2a
x1 (Re; Im)
x2 (Re; Im)
}
Ispis : Rješenja kvadratne jednadµzbe
Za ovaj naµcin je vaµzno osigurati da uslov iz pojedinog sluµcaja ne bude ukljuµcen u naredne
sluµcajeve.
Zad. 2.3 Napraviti algoritam i napisati program kojim se rješava bikvadratna jednadµzba:
ax4 + bx2 + c = 0
3 Cikliµcni algoritmi
3.1 Uvod
3.1.01. Cikliµcni algoritmi su strukture u kojima postoji skup operacija koje se ponavl-
jaju. Primjer je raµcunanje vrijednosti polinoma jer se mora osigurati da se iskoriste svi
koe…cijenti. Zbog potrebe konaµcnosti algoritma, mora se osigurati uslov završetka. Kod
cikliµcnih algoritama taj uslov se osigurava ili putem brojaµca koraka ili nekog od uslova,
od kojih je najµcešći uslov taµcnosti.
3.1.02. Ako se koristi brojaµc mora postojati cjelobrojna veliµcina koja ima startnu vrijed-
nost, graniµcnu vrijednost i korak povećanja ili smanjenja. Tada se u pseudokodu koristi
struktura :
3.1.03. Druga varijanta je da se ciklus odvija dok se ne zadovolji neki uslov završetka
koji se ispituje unutar ciklusa. U pseudokodu ovo se oznaµcava strukturom:
U ovom sluµcaju, u pravilu, nije poznat broj koraka. Ciklus se izvršava sve dok vrijedi
<uslov>. Primjer je uslov taµcnosti ali to moµze biti bilo koji drugi uslov. Algoritmi sa
uslovom taµcnosti su oni u kojima je kriterij zaustavljanja µzeljeni stepen raµcunske taµcnosti
koja se postiµze pore†enjem dvije uzastopne parcijalne sume, pore†enjem sa nekom vri-
jednosti koja je referenetna (npr. najbliµzi cijeli broj) ili na neki drugi naµcin.
3.1.04. U cikliµcnim algoritmima se µcesto koriste nizovi. Niz je konaµcni skup vrijednosti
jedne promjenljive u kojem svaki µclan ima svoj ’redni broj’odnosno indeks koji oznaµcava
dimenziju niza. Matrice se posmatraju kao dvodimenzionalni nizovi.
Rješenje. Da bi broj operacija bio maksimalno smanjen, dati izraz se piše u obliku:
S = (((2x 3) x + 4) x 5) x + 6
Raµcunanje poµcinje iz prve unutrašnje zagrade. Mnoµzenja koja se koriste se mogu sim-
boliµcki prikazati na sljedeći naµcin:
a 2 x 3; b a x + 4; c b x 5; d c x+6
Ovakav naµcin korištenja promjenljivih je neracionalan jer se svaka od njih koristi samo
jednom. Ako se suma koja se traµzi obiljeµzi promjenljivom S tada se ona moµze iskoristiti
tako da se na svakom koraku u nju upiše nova vrijednost. Simboliµcki, to se piše na sljedeći
naµcin:
S 2 x 3; S S x + 4; S S x 5; S S x+6
Ovdje je vidljivo da se prvi broj raµcuna na jedan a ostala tri na drugi naµcin. Ovo se moµze
promijeniti tako da se u svim koracima koristi isti obrazac sumiranja i mnoµzenja:
S 0
S S x + 2; S S x 3; S S x+4
S S x 5; S S x+6
Ovaj naµcin je bitan i po tome što se prvom naredbom vrši inicijalizacija promjenljive a u
svakom narednom izrazu koe…cijenti polinoma se pojavljuju kao sabirci. Ako se uzme da
je polinom napisan u sljedećem obliku:
S = an x n + an 1 x n 1
+ ::: + a1 x + a0
S 0; S S x + ak ; k = n; 0; 1
Raµcunanje polinoma
S = a0 x n + a1 x n 1
+ ::: + an 1 x + an
Algoritam sumiranja
Ovakav algoritam se naziva cikliµcni zbog µcinjenice da se jedan korak ponavlja odre†en
broj puta. Pri tome to ponavljanje moµze biti unaprijed utvr†eno (kao u ovom sluµcaju)
ili se operacija obavlja dok se ne postigne odre†eni uslov, npr. taµcnost raµcunanja.
Isti algoritam je mogao biti napravljen na naµcin da se u svakom ciklusu ispituje uslov, u
ovom sluµcaju da li je k dostigao traµzenu vrijednost.
n 0, jer tekuća promjenljiva k ide od 1 i u svakom koraku postaje veća, ali je realno da,
pod odre†enim uslovima, parametar n bude inicijalno zadat kao n = 0. Da bi se otklonio
ovaj rizik potrebno je odmah provjeriti da li je n 0 ili ne.
Raµcunanje sume
P (x) = an xn + an 1 xn 1
+ ::: + a1 x + a0
P 0 (x) = nan xn 1
+ (n 1) an 1 xn 2
+ ::: + 2a2 x + a1
S 0; S S x + k ak ; k = n; 0; 1
Pitanje 1 : U sluµcaju da se traµzi izvod bilo kojeg reda datog polinoma šta bi bio prvi
korak u dizajniranju ovog algoritma ?
Raµcunanje sume
Primjer 3.5 Neka je dat niz brojeva fxk g ; k = 1; n. Napraviti algoritam koji raµcuna :
a) najmanji od datih brojeva; b) najve´ci od datih brojeva; c) i najmanji i najve´ci od datih
brojeva
Rješenje. Zadatak će biti riješen za sluµcaj nalaµzenja minimalnog od datih brojeva.
Kao i u prethodnom zadatku, rezultat, npr. veliµcina M in, bi trebao biti broj koji se
moµze koristiti kao argument za neku drugu funkciju, operaciju i sliµcno. Prvi problem je
inicijalizacija. Logiµcno rješenje je da se kao inicijalna vrijednost uzme prvi µclan datog
niza koji se poredi sa preostalim µclanovima. Opisani algoritam je na sljedećem dijagramu.
U oba sluµcaja, veliµcina " odre†uje broj koraka u kojem se raµcuna suma.
Ako se traµzi da najveći broj koraka ne pre†e neko n, pored nivoa taµcnosti, ", ulazna
veliµcina je n, najveći broj koraka. Tada mora postojati korak u kojem se ispituje taj
uslov, što je prikazano na Varijanti 3, u kojoj je izbaµcen korak ’Idi na a:’.
Am n Bn p = Cm p
gdje su faj g cifre dekadnog zapisa. Indeksi tih cifara odgovaraju stepenu broja 10. Iz
tog razloga je prikladno u ovom sluµcaju koristiti relativno indeksiranje.
Cifre broja, suma cifara. S obzirom da n ne moµze biti proizvoljno veliko (ograniµceno je
kapacitetima za pohranu cijelih brojeva), u ovom primjeru ćemo se ograniµciti na n 108 ,
što ne mijenja koncept rješenja.
Za nalaµzenje samo broja cifara, ali ne i cifara pojedinaµcno, imamo dva naµcina. Ako je k
broj cifara tada vrijedi:
k = blog10 nc + 1
Drugi naµcin je da n poredimo sa brojevima 10, 100, ..., bilo da se poµcne od niµzih ili viših
vrijednosti. Ovaj naµcin je dobar za neke primjene ali se ne preporuµcuje kao generalno
dobro rješenje.
Ako je osim broja cifara potrebno znati i svaku cifru tada se mora inicirati niz u koji ćemo
ih pohranjivati. Broj cifara nije poznat a time ni dimenzija niza. Ovo nameće koncept
u kojem se algoritam prekida ako se stekne neki uslov u toku raµcunanja. Koncept rada
je da se broj dijeli sa 10, izraµcuna ostatak i tako dobije cifra; koliµcnik je ulaz za sljedeće
dijeljenje. Rad se prekida ako je koliµcnik jednak nuli. U nastavku je psedudokod.
Ovaj algoritam podrazumijeva da se niz proširuje jednim µclanom na svakom koraku. Osim
cifara, algoritam daje prvu i posljednju cifru.
Broj razliµcitih cifara. Uslov za ovaj dio je da su poznate cifre broja, niz fak g, što
je rezultat prethodnog algoritma i duµzina niza, k. Dekadni zapis koristi cifre d =
f0; 1; 2; :::; 9g. Za svaku od ovih cifara moramo ispitati da li se nalazi u nizu fak g i
taj podatak negdje pohraniti. Za to nam moµze posluµziti neki novi niz fbk g, µcija je duµzina
jednaka broju cifara. U nastavku je pseudokod.
Ovaj algoritam je prikladan ako je iz bilo kog razloga potreban podatak ne samo o tome
koliko je razliµcitih cifara već i broj pojavljivanja svake od cifara. Ako nam taj podatak
nije bitan, drugi naµcin da se dobiju sve razliµcite cifre je da se iz niza cifara izbace sva
ponavljanja jedne cifre. Drugim rijeµcima, uzmemo cifru na poziciji 1, pretraµzimo cijeli
niz i iz njega izbacimo sve cifre koje su joj jednake, što znaµci i smanjenje duµzine niza,
nakon toga uzmemo cifru na poziciji 2 i ponovimo postupak.
k
X
k
S= k k 1 + ::: + ( 1) 0 = ( 1)k i
i
i=1
Sumu µcine cifre, poµcev od cifre najveće ’teµzine’odnosno µclana ak niza cifara. Za raµcunanje
vrijednosti ( 1)k nije moguće koristiti funkciju stepenovanja koja se interno obavlja log-
aritmovanjem. Vrijednosti ( 1)k su 1 ili +1. Jedan od naµcina da se riješi problem je da
se uzme poµcetna vrijednost +1 za znak i ta vrijednost na svakom koraku mnoµzi sa 1,
µcime se postiµze efekt izmjene znaka za svaki sabirak. Pseudo kod je u nastavku.
Broj sa obratnim redoslijedom cifara. Rezultat ćemo smjestiti u neki novi broj nb.
Pseudo kod je u nastavku.
n = ds (s + 1)! + ds 1 s! + ::: + d1 2! + d0
n = ((ds (s + 1) + ds 1 ) s + ds 2 ) (s 1) + :::) 2 + d0
14910 = 74 2 + 1 = (24 3 + 2) 2 + 1
= ((6 4 + 0) 3 + 2) 2 + 1
= (((1 5 + 1) 4 + 0) 3 + 2) 2 + 1
= 1 5! + 1 4! + 0 3! + 2 2! + 1
= 11021f
Naznaµcene su ’cifre’u ovakvom razlaganju, što pokazuje kako ćemo napraviti algoritam:
Zadatak (obratni) : Ako je dato razlaganje broja na faktorijele naći dekadni zapis tog
broja.
Primjer 3.10 Dati broj n predstaviti u bazi p 2. Isto to uraditi za bazu p = 10.
Rješenje. Dekadni zapis broja n znaµci da postoji niz fak g takav da vrijedi relacija:
n = 10k ak + 10k 1
ak 1 + ::: + 10 a1 + a0
n = p m bm + p m 1
bm 1 + ::: + p b1 + b0 = bm bm 1 :::b1 b0 p
U ovim zapisima a0 i b0 odgovaraju ciframa najmanje teµzine. Cifre se dobijaju kao ostaci
dijeljenja sa odabranom bazom p, pri µcemu je koliµcnik na jednom koraku ujedno ulazna
veliµcina za dijeljenje u sljedećem koraku. Cifre novog zapisa smještamo u niz np. Pseudo
kod je u nastavku.
Prilikom konverzije u drugu bazu javlja se problem ako je baza p 11 jer to zahtijeva
simbole za ’cifre’veće od 10. Za sistem baze p = 16, tzv. heksadecimalni sistem, utvr†en
je standard oznaka:
Imajući ovo u vidu, cifre ćemo naći kao elemente niza duµzine 61. Inicijalno, niz će imati
vrijednost 1 na poziciji najmanje teµzine. Cifre dobijamo kao rezultat 200 mnoµzenja svih
µclanova niza sa 2. U prvoj verziji ćemo vršiti 200 mnoµzenja, bez postavljanja pitanja
racionalnosti takvog pristupa.
Ako se bilo koja cifra mnoµzi sa 2 najveći rezultat je 18, što znaµci da je prenos ili 1 ili
0. Cifru na tekućoj poziciji mnoµzimo sa 2 i dodajemo prenos sa prethodne pozicije.
Postupak je sljedeći:
Ovdje je C (n) oznaka za broj cifara. Imajući ovo u vidu, cifre ćemo naći kao elemente
niza duµzine 61. Inicijalno, niz će imati vrijednost 1 na poziciji najmanje teµzine. Cifre
dobijamo kao rezultat 200 dijeljenja svih µclanova niza sa 2. U prvoj verziji ćemo vršiti
200 mnoµzenja, bez postavljanja pitanja racionalnosti takvog pristupa.
Koliµcnik dijeljenja cifre na odre†enoj poziciji postaje nova cifra, ostatak se mnoµzi sa 10,
dodaje se sljedeći µclan niza i operacija ponavlja. Pseudo kod je u nastavku. Korišteno je
relativno indeksiranje.
Primjer 3.13 Za realni broj x 2 [0; 1) na´ci prvih m cifara zapisa u sistemu baze p 2
odnosno niz pozitivnih cijelih brojeva fak g, k = 1; :::; m, takve da je:
1 2 m
x = a 1p + a2 p + ::: + a mq
Rješenje. Svaku cifru zapisa u sistemu baze p u ovom sluµcaju dobijamo kao cijeli dio
proizvoda decimalnog broja x sa p. Drugim rijeµcima, broj x pomnoµzimo sa p, izdvojimo
cjelobrojni dio, oduzmemo ga od proizvoda i taj novi broj je ulaz za sljedeći korak. Prema
uslovima zadatka, ovo moramo uraditi m puta. Cifre koje dobijamo moµzemo usmjeriti u
niz. Pseudokod je u nastavku.
Za(k = 1 do m korak 1)
{ Broj Broj p
pc bBrojc // Izdvajamo cijeli dio novog broja
cif [k] pc // Cifru stavljamo u niz
Broj Broj pc // Dobijamo broj za naredni korak
}
// Rezultat : Niz cifara
Izlaz : cif
Primjer 3.14 Uµcitava se niz realnih brojeva. Uµcitavanje se prekida kad se uµcita simbol
#. Nakon uµcitavanja dati podatak o broju pozitivnih, negativnih i nula vrijednosti, a
zatim izraµcunati veliµcine:
v
u
1 X
n 1 u 1 X n 1
a = aA = ak s = t (ak a)2
n k=0 n 1 k=0
Koncept korištenja niza ima i prednosti i nedostatke. Prednost je što sa nizom moµzemo
brzo obavljati niz operacija. Sa druge strane, ovaj koncept je prihvatljiv ako je broj
uµcitavanja poznat. Ako niz koji se uµcitava ima mnogo µclanova tada njegovo memorisanje
moµze biti problem. Drugi koncept je da se kalkulacije vrše nakon svakog uµcitavanja.
Uslov su sljedeće transformacije:
1X X
n n
a = ak ) ak = n a
n k=1 k=1
v
u
u 1 X n
1 X
n
s = t (ak a)2 ) s2 = (ak a)2 )
n 1 k=1 n 1 k=1
X
n
2
X
n
2
s (n 1) = (ak a) = a2k 2ak a + a2
k=1 k=1
Xn X
n X
n X
n X
n X
n
= a2k 2a ak + a2 = a2k 2a ak + a2
k=1 k=1 k=1 k=1 k=1 k=1
X
n X
n
= a2k 2n a2 + n a2 = a2k n a2
k=1 k=1
v !
u
1 X
n
n u 1 X
n
s2 = a2k a2 ) s = t a2k a2
n 1 k=1
n 1 n 1 k=1
Za raµcunanje sume s trebaju nam dva podatka; jedan je suma veliµcina a drugi je suma
njihovih kvadrata. Na osnovu ovoga je jasno da se veliµcina s moµze izraµcunati tako da se
tokom uµcitavanja raµcuna suma kvadrata od koje se na kraju oduzme kvadrat aritmetiµcke
sredine, ta razlika podijeli sa n 1 i izraµcuna kvadratni korijen. Sve ovo se radi bez
memorisanja niza. Veliµcina s se moµze raµcunati i korištenjem imenioca n umjesto n 1.
Pseudo kod je u nastavku.
Pitanje 1 : Kako treba izmijeniti algoritam ako se treba traµziti aritmetiµcka sredina i
standardna devijacija: a) brojeva koji su razliµciti od nule; b) samo pozitivnih brojeva; c)
samo negativnih brojeva ?
Napomena 3.1 Ako se vrijednost nula tretira kao validan podatak tada se aritmetiµcka
sredina raµcuna kao:
Primjer 3.15 Uµcitava se niz realnih brojeva. Uµcitavanje se prekida kad se uµcita simbol
#. Izraµcunati veliµcinu:
" n #1=n
Y
aG = ak
k=1
1X
n
log10 aG = log10 ak
n k=1
{ br_poz br_poz + 1
S_po S_po + log10 (m) }
AkoJe(m = 0)
{ br_nul br_nul + 1 }
AkoJe(m < 0)
{ br_neg br_neg + 1 }
}
}
Zatvori(s)
// Ako nema pozitivnih brojeva nema ni sredine
AkoJe(br_poz = 0) Kraj
// Raµcunanje sredine logaritama
M _ge S_po=br_poz
// Antilogaritam
M _ge exp fM _ge ln 10g
Izlaz : M _ge
Primjer 3.16 Uµcitava se niz realnih brojeva. Uµcitavanje se prekida kad se uµcita simbol
#. Izraµcunati veliµcinu:
1X 1
n
1
=
aH n k=1 ak
U ovom izrazu n oznaµcava koliko je brojeva razliµcitih od nule.
AkoJe(m = #)
{ Uc = 0 }
Inaµce
{ // Aµzuriranje brojaµca i sume inverznih vrijednosti
AkoJe(m > 0)
{ br_poz br_poz + 1
S_ha ! S_ha + 1=m }
AkoJe(m = 0)
{ br_nul br_nul + 1 }
AkoJe(m < 0)
{ br_neg br_neg + 1
S_ha ! S_ha + 1=m }
}
}
Zatvori(s)
// Ako nema brojeva razliµcitih o nule nema ni harmonijske sredine
AkoJe(br_poz + br_neg = 0) Kraj
// Raµcunanje sredine inverznih vrijednosti
M _ha S_ha= (br_poz + br_neg)
// Raµcunanje inverzne vrijednosti prosjeµcne sume inverznih vrijednosti
M _ha 1=M _ha
Izlaz : M _ha
Pitanje : Šta moµze biti (veliki) problem prilikom raµcunanja harmonijske sredine ?
Primjer 3.17 Iz niza realnih brojeva koji se uµcitava izdvojiti opadaju´ci niz i upisati ga
na izlaz pod nazivom op. Uµcitavanje se prekida kad se uµcita simbol #.
Rješenje. Prvi µclan izlaznog niza će biti prvi µclan polaznog niza. Kad se na†e sljedeći
manji broj prethodni se upisuje na izlaz op a novi µclan postaje element za pore†enje sa
sljedećim uµcitanim znakom. Pseudo kod je u nastavku.
AkoJe(Br = #)
{ Uc 0 }
Inaµce
{ c_op1 Br // Uµcitano smještamo u c_op1
AkoJe(Korak = 1 _ c_op1 < c_op2)
{ Piši(c_op1; op)
c_op2 c_op1
Korak 0 }
}
}
Zatvori(op)
Zatvori(ul)
Zadatak (dodatno)
Primjer 3.18 Dat je niz fan g. Napraviti algoritam koji ´ce dati odgovor na pitanje da li
je niz opadaju´ci ili rastu´ci.
Rješenje. Niz je rastući ako za svako k vrijedi da je ak < ak+1 , k = 1; :::; n 1. Ako se u
toku ispitivanja desi da je ak < ak+1 ^ ak+1 > ak+2 imamo promjenu relacije. Brojanjem
ovih promjena dolazimo do zakljuµcka o prirodi niza. Ako nema promjena odnosno ako je
taj broj 0 niz je monoton. U ovom sluµcaju nemamo uµcitavanje (mada je i to moguće).
Pseudo kod je u nastavku.
4 Euklidov algoritam
4.1 Uvod
Euklidov algoritam je dobio je ime po starogrµckom matematiµcaru Euklidu. To je na-
je…kasniji algoritam za odre†ivanje najvećeg zajedniµckog djelitelja dva ili više brojeva.
Prvi poznati saµcuvani opis Euklidovog algoritma se nalazi u Elementima (oko 300. go-
dine p.n.e.), što ga µcini najstarijim numeriµckim algoritmom koji se još uvijek aktivno
koristi. U originalu, objašnjen je samo za prirodne brojeve i geometrijske duµzine (realne
brojeve), ali je u 19. stoljeću primjenjen na polinome i na Gaussove cijele brojeve, što je
dovelo do razvoja novih pojmova apstraktne algebre. Euklidov algoritam je primjenjivan
i na drugim matematiµckim strukturama, poput µcvorova i polinoma.
Euklidov algoritam ima široku terijsku i praktiµcnu primenu. Predstavlja kljuµcni element
RSA algoritma, metode asimetriµcne kriptogra…je koja se u znaµcajnoj meri primenjuje
u elektronskom poslovanju. Moµze se upotrijebiti za konstruiranje veriµznih razlomaka,
u Sturmovoj metodi za odre†ivanje realnih nula polinoma i još nekoliko modernih al-
goritama za faktorizaciju prirodnih brojeva. Na kraju, Euklidov algoritam je osnovno
sredstvo za dokazivanje teorema moderne teorije brojeva, kao što su Lagrangeova teo-
rema o µcetiri kvadrata i osnovna teorema aritmetike o jedinstvenoj faktorizaciji prirodnih
brojeva. Euklidov algoritam je e…kasan naµcin za odre†ivanje NZD velikih brojeva zbog
toga što mu ne treba više koraka od petostrukog broja cifara manjeg broja zapisanog sa
osnovom 10, što je dokazao Gabrijel Lame 1844. godine i time oznaµcio poµcetak teorije
sloµzenosti. U 20. stoljeću su razvijene metode za poboljšanje e…kasnosti Euklidovog
algoritma.
a = b q1 + r 1 ; 0 < r1 < b
b = r 1 q2 + r 2 ; 0 < r2 < r1
:::
rj 2 = rj 1 qj + rj ; 0 < rj < rj 1
rj 1 = rj qj+1
Tada je (a; b) = rj odnosno najveći zajedniµcki djelitelj je jednak posljednjem ostatku koji
je razliµcit od nule u Euklidovom algoritmu. Do situacije rj+1 = 0 se dolazi u konaµcno
mnogo koraka jer rj+1 = 0 implicira da je:
pa je N ZD (4002; 3102) = 6.
4.3 Sloµzenost
Pokazuje se da sloµzenost Euklidovog algoritma zavisi o logaritamski manjem broju b,
nezavisno od a b.
4.4 Zadaci
Primjer 4.1 Na´ci sve prirodne brojeve koji su manji od datog n i uzajamno su prosti sa
njim.
Rješenje. Za dva broja se kaµze da su uzajamno prosta ako nemaju zajedniµckih djelitelja
koji su razliµciti od 1 tj. ako je N ZD (m; n) = 1. Ako µzelimo naći sve brojeve koji su
uzajamno prosti sa n tada ćemo probati sve brojeve od 2 do n 2. Zašto ? Pseudo kod
je u nastavku.
U ovom algoritmu je korak Izlaz, koji daje rezultat i koji se moµze dati na displej, usmjeriti
u niz, usmjeriti u datoteku i sliµcno, zavisno od namjene programa.
Primjer 4.2 Za date brojeve m i n na´ci sve najmanje zajedniµcke sadrµzaoce manje od
m n.
vidimo da je broj najmanjih zajedniµckih sadrµzalaca jednak vrijednosti N ZD (m; n). Drugim
rijeµcima, sve najmanje zajedniµcke sadrµzaoce manje od m n odre†ujemo ako N ZS (m; n)
mnoµzimo sa k = 1; 2; :::; N ZD (m; n). Pseudo kod je u nastavku.
Primjer 4.3 Napraviti algoritam za raµcunanje proizvoda dva cijela broja tzv. russian
peasant metodom.
Rješenje. Neka su data dva broja a i b, a < b, koja treba pomnoµziti. Navedena metoda
se sastoji u tome da se broj a dijeli sa 2, do koliµcnika 1, a broj b mnoµzi sa 2; na kraju se
saberu vrijednosti niza za broj b koji odgovaraju neparnim vrijednostima koliµcnika broja
a. U nastavku je ilustracija za a = 37 i b = 146.
a 37 18 9 4 2 1
b 146 292 584 1168 2336 4672
Za prvi broj se uzima veći od data dva broja, kako bi se smanjio broj operacija i spri-
jeµcile devijacije. Provjera neparnosti je obavljena na naµcin da se raµcuna ostatak prilikom
dijeljenja a [m] sa 2. Ako je ostatak 1 broj je neparan. Koristi se cjelobrojno dijeljenje
(funkcija floor).
Ocjena vremenske sloµzenosti algoritma se sastoji u brojanju raµcunskih koraka koje treba
izvršiti. Termin "raµcunska operacija" moµze obuhvatiti više tipova operacija kao što je
sabiranje i mnoµzenje. Vrijeme izvršavanja zavisi od konkretnog raµcunara, odabranog
programskog jezika i sliµcno. Stoga se u algoritmu izdvaja korak koji se ponavlja i koji na
taj naµcin postaje osnova analize. Naprimjer, u sortiranju je to upore†ivanje.
Svaka instrukcija u sekvenci se broji kao 1 bez obzira na to koliko je izraz sloµzen i
koliko se stvarno koristi mašinskih instrukcija
Konstrukcija "ZaSvaki(...<>...)" se broji n + 1 puta ako se tijelo petlje izvrši
n puta, 1 za inicijalizaciju brojaµca a n za broj ciklusa
Konstrukcija "AkoJe(...)Tada" se broji kao 1 svaki put kad se "postavi pitanje";
ono što uslovljava naredba "Ako ..." broji se onoliko puta koliko to zahtijeva konkretni
sluµcaj
Konstrukcija "SveDokJe(<uslov>)" se broji n + 1 puta ako se tijelo petlje izvrši
n puta
5.2 Zadaci
Primjer 5.1 Sekvencijalno sumiranje. U nastavku je pseudo kod za jednostavan
sluµcaj sekvencijalnog sumiranja.
# Sumiranje Opis
1 Sumiraj(a,n) Ulaz : niz fag duµzine n
2 Suma 0 Inicijalizacija
3 Za(i = 1 do n) Poµcetak petlje
4 { Suma Suma + a [i] } Sumiranje
Primjer 5.4 Binarno pretraµzivanje. Ovo je jedan od veoma µcestih metoda pretraµzi-
vanja. Polazna osnova je niz duµzine n koji je sortiran rastu´cim redoslijedom i u kojem
se treba prona´ci vrijednost oznaµcena sa Kljuc. Naµcin na koji se obavlja ovaj posao je
sljede´ci:
Ako je Kljuc manji od te vrijednosti tada se pretraµzuje prva polovina niza; u suprot-
nom pretraµzuje se gornja polovina niza
Primjer 5.5 Napraviti algoritam koji raµcuna an uz zahtjev da broj izvršenja ne prelazi
log n, tj. ne bi trebao pre´ci C log n za neku konstantu C.
Rješenje. Ideja rješenja je da se raµcunaju stepeni a2 , a4 , ... sve dok je moguće a nakon
toga postignuti rezultat mnoµziti sa a dok se ne dobije traµzena veliµcina. Pseudo kod je u
nastavku.
AkoJe(a 0 _ n 0) Kraj
// Radne veliµcine
k n
b 1
c a
SveDokJe(k <> 0)
{ // Ako je k paran broj dijelimo ga dok ne dobijemo neparan broj
AkoJe(k 0 (mod 2))
{ // Raµcunamo parne stepene...
k k=2
c c c }
Inaµce
{ // Ako je k neparan smanjujemo ga 1
k k 1
b b c }
Izlaz : an
Ako je k na izlazu iz prvog pitanja (upit : AkoJe(...)) paran u narednoj iteraciji će biti
predmet istog uslova; ako je neparan u narednoj iteraciji će biti predmet alternative (red
µe). Algoritam ćemo demonstrirati na primjeru raµcunanja a12 , u sljedećoj tabeli.
: Inac
k 12 6 3 2 1 0
b 1 1 1 a4 a4 a12
c a a2 a4 a4 a8 a8
log (n + 1)
n = 2m 1 ) n + 1 = 2m ) log (n + 1) = m log 2 ) m =
log 2
Na osnovu ovoga je:
log n log (n + 1)
m
log 2 log 2
Drugim rijeµcima, sloµzenost algoritma je log n.
Primjer 5.6 Dat je neopadaju´ci niz cijelih brojeva fxn g. Napraviti algoritam koji prov-
jerava koliko niz ima razliµcitih µclanova. Dati ocjenu sloµzenosti.
Rješenje. Zadatkom se ne traµzi da se identi…kuju razliµciti µclanovi već samo broj ra-
zliµcitih µclanova. Koncept je da se svaki µclan xk poredi sa narednim, xk+1 (zbog svojstva
monotonije); ako su razliµciti aµzurira se brojaµc. Ako se po†e od pretpostavke da je naj-
manji broj razliµcitih brojeva jednak 1 tada algoritam ima izgled u nastavku.
Pitanje. Da li se ovaj algoritam moµze iskoristiti za sluµcaj nerastućeg niza i šta se mijenja
u tom sluµcaju ?
Primjer 5.7 Dat je niz cijelih brojeva fxn g, za koje ne postoji pretpostavka o monotoniji.
Napraviti algoritam koji provjerava koliko je razliµcitih µclanova ovog niza. Dati ocjenu
sloµzenosti.
Analiza sloµzenosti. Uvodni koraci se broje kao 1 korak, ukupno 3, µcemu se dodaje 1 za
inicijalizaciju brojaµca i (1 korak), ukupno 4. Prva petlja se izvršava n 1 puta. Najbolji
sluµcaj je kad su svi µclanovi polaznog niza jednaki. Tada se za svako i izvršavaju samo
korak pridruµzivanja j 1 i upit SveDokJe(b [j] <> x [i]), ukupno 2 operacije. Znaµci da
je ukupan broj koraka:
T (n) = 4 + 2 (n 1) = 2n + 2
Najgori sluµcaj je kada su svi µclanovi poµcetnog niza razliµciti. Prije upita SveDokJe(b [j] <>
x [i]) je jedna operacija j 1, ukupno n 1 operacija na nivou cijelog algoritma. Kada je
i = 2 upit upita SveDokJe(b [j] <> x [i]) se izvršava 1 put; kada je i = 3 upit se izvršava
2 puta, ... Unutar upita se vrši dodjela j 1 + 1 (dvije operacije) i upit AkoJe(j > k),
ukupno tri operacije. Tri operacije unutar upita AkoJe(j > k) realizuju se samo jednom.
Znaµci, za svako i se obavi 3 (i 1) + 3 = 3i operacija. Konaµcno:
X
n 1
n (n 1)
T (n) = 3 i + (n 1) + 4 = 3 +n+3
i=1
2
3n (n 1) + 4 (n + 3) 3n2 + n + 12
= =
2 2
Drugim rijeµcima, sloµzenost algoritma je n2 .
T (n) = 2n + 2
Ovo je vrijednost za najgori sluµcaj, kada se uslov na liniji 3 izvrši n puta. Na taj naµcin
se zakljuµcuje da algoritam ima linearnu brzinu odnosno T (n) = O (n). Drugim rijeµcima,
linearno pove´canje broja elemenata znaµci linearno pove´canje vremena njegovog izvršenja.
Primjer 5.9 Bubble sort. U ovom primjeru je data analiza sloµzenosti algoritma tzv.
Bubble sorta.
# Sortiranje Opis
1 BubbleSort(fag, n) Sortiranje niza fag
2 Za(i = 1 do n 1) { Poµcetak vanjske petlje
3 Za(j = n 1 do i korak 1) { Poµcetak unutrašnje petlje
4 AkoJe(a [j] > a [j + 1]) { Upit
5 b a [j] Zamjena vrijednosti
6 a [j] a [j + 1]
7 a [j + 1] b}
8 }
9 }
Korak na liniji 2 se izvodi 1+(n 1) puta. Korak na liniji 3 se za i = 1 izvodi 1+(n 1)
puta, za i = 2 izvodi 1 + (n 2) puta, ..., sve do i = n 1 kada se izvodi 1 + 1 puta.
Korak na liniji 4 se izvodi n i puta za i = 1; n 1. Najgori sluµcaj je ako je poµcetni
niz sortiran opadaju´cim redom. Koraci na linijama 5, 6 i 7 se izvode isti broj puta kao i
korak (upit) na liniji 4. To znaµci da je ukupan broj koraka ovog algoritma:
X
n 1 X
n 1 X
n 1
5 n (n 1) 5n2 3n
T (n) = n + i+4 i=n+5 i= +n=
i=1 i=1 i=1
2 2
Ovo je broj za najgori sluµcaj : kada je poµcetni niz sortiran opadaju´cim redom. Najbolji
sluµcaj je ako je niz sortiran rastu´cim redom; tada se ne rade koraci 5, 6 i 7 pa je:
X
n 1
T (n) = n + 2 i = n + n (n 1) = n2
i=1
6.1.1 -notacija
De…nicija 6.1 Neka je g (n) realna funkcija de…nisana na nekom podskupu skupa prirod-
nih brojeva. Sa (g (n)) se oznaµcava skup realnih funkcija f (n) de…nisanih na nekom
podskupu skupa realnih brojeva takvih da postoje pozitivne konstante c1 , c2 i prirodan broj
n0 takvi da je:
6.1.2 O-notacija
De…nicija 6.2 Neka je g (n) realna funkcija de…nisana na nekom podskupu skupa prirod-
nih brojeva. Sa O (g (n)) se oznaµcava skup realnih funkcija f (n) de…nisanih na nekom
podskupu skupa realnih brojeva takvih da postoji pozitivna konstanta c i prirodan broj n0
takvi da je:
0 f (n) c g (n) ; 8n n0
(9c > 0) (9n0 2 N) (8n n0 ) (0 f (n) c g (n))
Notacija Veliko-O (O) ima dvije glavne oblasti primjene. U matematici se obiµcno koristi
da opiše koliko blisko konaµcni niz aproksimira datu funkciju, posebno u sluµcaju skraćenog
(truncated) Tejlorovog niza ili asimptotske ekspanzije. U kompjuterskoj nauci je korisna
za analizu algoritama. U obje vrste primjene, funkcija koja se pojavljuje unutar O ( )
tipiµcno se bira da bude što je moguće jednostavnija, pri µcemu se izostavljaju konstantni
faktori i µclanovi manjeg reda.
Postoje dva formalno bliska ali bitno razliµcita korištenja ove notacije: beskonaµcna (in…-
nite) i in…nitezimalna asimptotika. Ova razlika je jedino u primjeni ali nije i principijelna.
5. Ako je f (n) monotono rastuća funkcija koja nije ograniµcena, a > 1 i c > 0, tada:
f (n)c = O af (n)
6.1.3 -notacija
De…nicija 6.3 Neka je g (n) realna funkcija de…nisana na nekom podskupu prirodnih
brojeva. Sa (g (n)) se oznaµcava skup realnih funkcija f (n) de…nisanih na nekom pod-
skupu skupa realnih brojeva takvih da postoji konstanta c > 0 i prirodan broj n0 takvi da
vrijedi:
0 c g (n) f (n) ; 8n n0
(9c > 0) (9n0 2 N) (8n n0 ) (0 c g (n) f (n))
f (n)
f (n) = (g (n)) , lim sup >0
n!1 g (n)
Veliµcina ( ) se tumaµci tako da je g (n) donja granica za f (n). U tom smislu, oznaka
f (n) = (g (n)) se tumaµci da "f raste najmanje kako raste g".
Teorema 6.1 Za bilo koje dvije funkcije f (n) i g (n) vrijedi f (n) = (g (n)) ako i samo
ako je f (n) = O (g (n)) i f (n) = (g (n)).
Prosta naredba ima (1) vrijeme što je i razlog za naziv. Niz mnogo jednostavnih naredbi
još uvijek se izvršava u vremenu (1) :
Primjer iz realnog µzivota je izbor prvog dokumenta sa vrha gomile. Nije vaµzno kolika je
gomila. Algoritmi sa konstantnim vremenom su najbolji mogući algoritmi ukoliko vrijeme
same operacije nije predugaµcko. Primjeri ovih algoritama su:
- Push i Pop operacije na stack-u (koji sadrµzi n elemenata);
- Operacije umeatanja i uklanjanja u redu za izvršenje
Brzina ovih algoritama, u oznaci O (log n), raste sporije od rasta veliµcine ulaza. Ako se
ulaz udvostruµci vrijeme izvo†enja se samo malo produµzi. Klasiµcan primjer algoritma u log-
aritamskom vremenu je binarno pretraµzivanje, koje se koristi u poznatoj igri "poga†anje
brojeva". U toj igri jedan igraµc mora pogoditi broj koji zamisli drugi igraµc. Na svakom
koraku se vrši poga†anje na naµcin da saigraµc kaµze da li je predloµzeni broj veći ili manji.
Ako je broj izme†u 1 i 100 prvi prijedlog je 50. Time se prostor poga†anja smanjuje
za polovinu. Naredni korak je predlaganje broja koji je u polovini odgovarajućeg inter-
vala µcime se (grubo) suµzava krug brojeva za poga†anje. Ako se u toj igri poµcetni opseg
udvostruµci broj poga†anja se ne udvostruµcava. Ako se ulaz poveća n puta potrebno je
log2 n lg n koraka da se do†e do inicijalnog opsega.
Baš kao što postoje algoritmi na koje povećanje obima ulaza nema uticaja postoje al-
goritmi za koje se µcini da vrijeme izvršenja eksplodira. Kaµze se da se eksponencijalni
algoritmi izvršavaju u O (an ) ili eksponencijalnom vremenu.
Konstrukcije Ako ... Inaµce ... Za ove konstrukcije se uvijek uzima najgori mogući
sluµcaj ako ne postoji sigurnost šta će se desiti. Najgori sluµcaj u bilo kojoj konstrukciji
ovog tipa je da se izvršava bilo Ako bilo Inacµe dio, koji god da je od njih najgori. Iz
praktiµcnih razloga se uzima kako da se dešavaju obje strane.
Petlje. Vrijeme izvršenja jednostavne petlje (koja sadrµzi samo jednostavne naredbe)
zavisi od toga koliko puta se petlja izvršava. Vrijeme petlji u nizu se sabira što znaµci da
dominira petlja sa većim vremenom izvršenja.
Ugnjeµzdeni blokovi. Ako je blok ugra†en unutar drugog bloka efekti se multipliciraju.
Ukupno vrijeme izvršenja postaje (n2 ). Primjer je pore†enje dvije nesortirane liste
kako bi se vidjelo da li je neka stavka sadrµzana u obje liste. Uzima se element prve liste i
poredi sa svakim elementom druge liste što uzima vrijeme reda n. S obzirom da se posao
ponavlja za n elemenata druge liste obavlja se n n = n2 operacija pore†enja. Dupliranje
obima ulaza ima za posljedicu µcetiri puta duµze vrijeme izvršenja.
6.3 Zadaci
Primjer 6.1 Neka je f (n) = 23 n2 n, n 2 N. Tada je f (n) = (n2 ). Najprije, vrijedi
2 2 2 1
c1 n2 3
n n c2 n2 za svako n0 n ako i samo ako c1 3 n
c2 za svako
2
n0 n. Odavdje slijedi da mora biti c2 3
. Kako c 1 mora biti pozitivan broj to mora
2 1 2 1 1
biti 3 n 0. To znaµci da je dovoljno uzeti n0 = 3. Iz c1 3 3 slijedi c1 3 . Dakle,
vrijedi da je 13 n2 f (n) 23 n2 za svako n 3.
Primjer 6.8 Neka je f (n) broj bita broja n. Tada je f (n) = [log2 n] + 1. Kako je:
f (n)
lim =1
n!1 log2 n
Primjer 6.9 Sabiranje ili oduzimanje dva n-bitna cijela broja ima sloµzenost O (n).
Rješenje. Za analizu sloµzenosti mnoµzenja dva broja potreban je kratki prikaz postupka.
Jedan od mogućih naµcina mnoµzenja dva cijela n-bitna broja je tzv. digitalni metod. Neka
su:
Moµze se staviti:
Ovo znaµci da se za proizvod dva 2n-bitna broja moraju izraµcunati dvije razlike A1 A0
i B0 B1 dva n-bitna broja, tri proizvoda A1 B1 , (A1 A0 ) (B0 B1 ), A0 B0 a zatim
izvršiti pomjeranje ulijevo i sabiranje.
Ako se sa M (n) oznaµci broj bit operacija potrebnih za mnoµzenje dva n-bitna cijela broja,
vrijedi:
M (2n) 3 M (n) + C n
gdje je C konstanta. Naime, svako mnoµzenje dva n-bitna cijela broja zahtijeva M (n)
bitnih operacija a sabiranje, oduzimanje i pomjeranje ulijevo su operacije reda O (n).
Odavdje se dobija relacija:
M 2k D 3k 2k
gdje je D = max fM (2) ; Cg.
Teorema 6.2 Mnoµzenje dva n-bitna cijela broja moµze biti izvedeno korištenjem O nlog2 3
bit operacija.
Dokaz. Za mnoµzenje dva n-bitna broja je potrebno M (n) bit operacija. Na osnovu
prethodnih relacija vrijedi:
Xb
b b k k
(n + a)b = n a
k=0
k
= nb + bnb 1 a + :::bnab 1
+ ab = nb
Primjer 6.13 Na´ci najve´ci cijeli broj k takav da je f (x) = O nk za svaku od narednih
funkcija: a) f (n) = 2n2 +n3 log n; b) f (n) = 3n5 +(log n)4 ; c) f (n) = (n4 + n2 + 1) = (n4 + 1);
d) f (n) = (n3 + 5 log n) = (n4 + 1).
Rješenje. U svakom od sluµcajeva moramo naći najveći cijeli broj k takav da je f (x) =
O nk tako da moraju postojati konstante c i n0 takve da je f (n) c nk za n n0 .
a) S obzirom da n3 log n nije O (n3 ) (jer log n raste neograniµceno kako se n povećava)
imamo da je k = 3 premalo. Sa druge strane, sigurno je da log n raste puno sporije od n
pa vrijedi:
2n2 + n3 log n 2n4 + n4 = 3n4
Stoga je k = 4 odgovor, uz uslov da je c = 3 i n0 = 1.
b) Broj (log n)4 je beznaµcajan u pore†enju sa µclanom n5 tako da je odgovor k = 5.
Formalno uzimamo da je c = 4 i n0 = 1.
c) Za velike n koliµcnik je blizak vrijednosti 1. Stoga je odgovor k = 0 odnosno f (n) =
O (n0 ) = O (1). Formalo, moµzemo pisati da je f (n) 3n4 =n4 za sve n 1, tako da
moµzemo uzeti da je c = 3 i n0 = 1.
d) Ovdje je odgovor k = 1 s obzirom da je f (n) bliska vrijednosti 1=n za velike n.
Formalno moµzemo pisati da je:
Rješenje. a) Moguće. Moµze sep odabrati c takvo da je c n < n log. b) Moguće. Moµze
se odabrati c takvo da je c n n < n2 . c) Moguće. Prosjeµcna sloµzenost znaµci da donja
granica sloµzenosti moµze biti (n2 ). d) Nemoguće. Razlog : narušavanje sloµzenosti u
najgorem sluµcaju (n log n).
0 < n < c n lg n; n n0
Ovo je ekvivalentno tome da pokaµzemo da za svako c > 0 postoji n0 > 0 takvo da je:
0 1=c < lg n
Za svako c > 0 odaberemo n0 > 21=c . Tada za svako n n0 imamo da je n > 21=c što je
ekvivalentno relaciji lg n > 1=c.(n)
izraziti putem notacije što je mogu´ce jednostavnije. Drugim rijeµcima, na´ci što je
mogu´ce jednostavniju funkciju f (n) takvu da je Sn = (f (n)).
logb n
a logb n+1
X a i 1 a logb n
Sn = = b =
b a b
i=0 1
b
nlogb a
= = nlogb a 1
n
7 Rekurzije
7.1 Uvod
Rekurzija se pojavljuje kada se pojam de…niše pomoću samog sebe ili pomoću istog tipa.
Javlja se u niz disciplina, od lingvistike do logike. Najraširenije je korištenje u matematici
i raµcunarskoj nauci, gdje se funkcije de…nišu pomoću same sebe. Pritom se pazi da se ne
pojavi beskonaµcna petlja odnosno neograniµceno ponavljanje. Brojni su primjeri rekurzija
u matematici, kao što su faktorijel i Fibonaµcijevi brojevi.
Prednost ovakvog naµcina rada je što slijedi de…niciju faktorijela. Sa druge strane, pri
svakom pozivu funkcije u memoriji se alocira kopija iste procedure. Tu se vidi i najveći
nedostatak rekurzija: trošenje resursa a samim tim i vremena izvršenja. Iz tog razloga je
potrebno rekurzije mijenjati alternativnim procedurama gdje god je to moguće.
U teoriji algoritama pojam rekurzije se odnosi na rutine (funkcije, procedure) koje pozi-
vaju same sebe. One su tipiµcne za pristupe "podijeli pa vladaj" gdje se ulaz dijeli na
manje dijelove i poziva se na svakom od tih dijelova. Primjer je binarno pretraµzivanje :
u svakom koraku se traµzi polovina prostora koji je dobijen u prethodnom koraku (npr.
sredina niza).
Fn = f (Fn 1 ; Fn 2 ; :::; F1 ; n)
kaµze se da niz Fn zadovoljava diferentnu jednadµzbu ili rekurentni izraz. Specijalno, ako
se za neko k 1 µclan Fn izraµzava preko k prethodnih µclanova niza:
Fn = f (Fn 1 ; Fn 2 ; :::; Fn k ; n)
Fn = Fn 1 + Fn 2 ; F1 = F2 = 1
gdje rekurzivna funkcija za ulaz dimenzije n vrši k rekurzivnih poziva za ulaze (ne
obavezno razliµcitih) dimenzija n1 , ..., nk , dok je sa c dato vrijeme potrebno za pripremu
poziva i objedinjavanje rezultata. Izraz kojim se izraµcunava svaki µclan niza koji se generiše
zove se rješenje.
T (n) = a T (n 1) ; T (0) = c
c0 = + ; c1 = t1 + t2
c0 = + ; c1 = t1 + n t2
T (n) = a1 T (n 1) + a2 T (n 2) + ::: + ak T (n k)
T (0) = c0 ; T (1) = c1 ; :::; T (k 1) = ck 1
tk = a1 tk1 1
+ a2 tk2 2
+ ::: + ak
T (n) = a T (n 1) + b; T (0) = c
U ovom sluµcaju je cilj procijeniti gornju granicu za koju je T (n) f (n). Vrijedi:
n=2k = 1 ) n = 2k ) k = log2 n
Opšte rješenje kojim se daju uslovi procjene vremena rekurentnih algoritama daje Master
teorem, koji je formulisan i dokazan od strane Cormen, Leierson, Rivest i Stein u knjizi
Introduction to Algorithms. Generaliziranu formu Master teorema dali su Akra i Bazzi
1998. godine i on se odnosi na mnogo širu klasu rekuzivnih algoritama.
Jedna od varijanti formulacije ovog problema je cilj analiza algoritma A pri µcemu je broj
operacija T (n) za ulaz veliµcine n (vremenska sloµzenost) dat rekurentnim izrazom:
n
T (n) = a T + c nk
b
pri µcemu je a; b; c; k > 0, b 6= 0 odnosno f (n) = c nk i zadata je vrijednost T (1).
Ovakva jednadµzba se dobija za algoritam kod kojeg se obrada ulaza veliµcine n svodi na
obradu a ulaza veliµcine n=b poslije µcega je potrebno izvršiti još c nk koraka da bi se od
parcijalnih rješenja konstruisalo rješenje kompletnog ulaza veliµcine n. Drugim rijeµcima,
broj a je broj podproblema na koje se dijeli poµcetni problem. Za ove algoritme se kaµze
da su tipa "podijeli pa vladaj" (divide-and-conquer) što je drugi naziv za algoritme koji
su zasnovani na dekompoziciji. Uobiµcajeno je da bude b 2 N.
Dokaz. Dokaz će biti proveden samo za podniz n = bm gdje je m cijeli nenegativni broj.
Mnoµzenjem izraza (1) sa a m =c dobija se rekurentni izraz:
1
tm = tm 1 + qm; t0 = T (1)
c
1 m
gdje je tm = a T (bm ) i q = bk =a. Rješenje je:
c
X
m
tm = t0 + qi
i=1
Za q 6= 1 je:
X
m
1 q m+1
qi = 1
i=1
1 q
pa se asimptotsko ponašanje niza tm opisuje sljedećim jednakostima:
8
< O (m) q=1
tm = O (1) 0 < q < 1
:
O (q m ) q>1
Rekurzija Algoritam O( )
T (n) = T (n=2) + O (1) Binarno pretraµzivanje O (log n)
T (n) = T (n 1) + O (1) Sekvencijalno pretraµzivanje O (n)
T (n) = 2 T (n=2) + O (1) Put po stablu O (n)
T (n) = T (n 1) + O (n) Selection sort O (n2 )
T (n) = 2 T (n=2) + O (n) Merge sort O (n log n)
7.4 Zadaci
Primjer 7.1 Napraviti rekurzivni algoritam koji izraµcunava maksimalni element u nizu
cijelih brojeva. Podrazumijeva se postojanje funkcije max fa; bg, koja daje maksimum dva
cijela broja a i b.
Rješenje. Rješenje je u algoritmu u nastavku.
Algoritam 7.2 Rekurzivno raµcunanje maksimalnog elementa niza
Funkcija NadjiMax(a,n)
AkoJe(n = 1)
{ Vrati(a [1]) }
Inaµce
{ Vrati(max fa [n] ,NadjiMax(a; n 1)g) }
Sada ćemo pokazati da je algoritam korektan. Neka je P (n) oznaka za tvrdnju da algo-
ritam nalazi i daje maksimalni cijeli broj na pozicijama a [1] do a [n]. U skladu sa tim,
pokazujemo da je P (n) taµcna za svako n 2 N.
Poµcetni korak: Ako niz ima samo jedan element tj. ako je n = 1 tada je jasno da je taj
element maksimalni i dobija se na liniji 2 algoritma. Ujedno vidimo da je P (1) taµcno.
Indukcijska hipoteza. Pretpostavimo da algoritam nalazi i daje maksimalni element ako
niz a ima taµcno k elemenata. Posmatrajmo sluµcaj kada niz a ima k + 1 elemenata. S
obzirom da je (k + 1) > 1 izvršava se korak na liniji 4. U tom koraku se prvo poziva
funkcija NadjiMax sa taµcno k elemenata. Na osnovu indukcijske hipoteze je poznat
maksimalni element sa pozicija a [1] do a [k]. Sada je maksimalni element ili a [k + 1]
ili maksimalni element na pozicijama a [1] do a [k]; neka je to broj r. Stoga, traµzenjem
maksimuma izme†u a [k + 1] i r jasno se dobija maksimalni element niza a što zaµci da
P (1) ! P (k + 1). Primjenom prvog principa matematiµcke indukcije, zakljuµcujemo da
je P (n) istinita za svako n 2 N. Algoritam je korektan.
n
Primjer 7.2 Neka je T (n) = 8 T + 1000n2 .
2
Rješenje. Ovdje je a = 8, b = 2, f (n) = 1000n2 , logb a = log2 8 = 3. Sada se provjerava
da li vrijedi:
f (n) = O nlogb a " ) 1000n2 = O n3 "
Ako se izabere " = 1 tada se dobije 1000n2 = O (n2 ). S obzirom da ovo vrijedi koristi se
prvi sluµcaj Master teoreme pa se zakljuµcuje da je:
T (n) = nlogb a = n3
Taµcno rješenje ovog rekurentnog izraza je T (n) = 1001n3 1000n2 sa uslovom T (1) = 1.
n
Primjer 7.3 Neka je T (n) = 2 T + 10n.
2
Rješenje. Ovdje je a = 2, b = 2, k = 0, f (n) = 10n, logb a = log2 2 = 1. Sada se
provjerava da li vrijedi:
f (n) = O nlogb a ) f (n) = O (n)
Sada se koristi drugi sluµcaj Master teoreme pa se zakljuµcuje da je:
T (n) = nlogb a logk+1 n = (n log n)
Taµcno rješenje ovog rekurentnog izraza je T (n) = n + 10n log2 n uz uslov da je T (1) = 1.
n
Primjer 7.4 Neka je T (n) = 2 T + n2 .
2
Rješenje. Ovdje je a = 2, b = 2, f (n) = n2 , logb a = log2 2 = 1. Sada se provjerava da
li vrijedi:
f (n) = nlogb a+" = n1+"
Ako se uzme " = 1 tada se dobije n2 = (n2 ). Koristi se treći sluµcaj Master teoreme, s
tim da se najprije provjerava uslov regularnosti:
n n 2
a f c f (n) ) 2 c n2
b 2
Ako se uzme c = 1=2 tada je uslov zadovoljen 8n 2 N pa je T (n) = (f (n)) odnosno
T (n) = (n2 ). Taµcno rješenje je T (n) = 2n2 n uz uslov da je T (1) = 1.
n
Primjer 7.5 Neka je T (n) = 6 T + n2 log n.
3
Rješenje. U ovom sluµcaju je:
n n
T (n) = 3 T + n2 T (n) = 3 T +n
2 2
n n p
T (n) = 4 T + n2 T (n) = 3 T + n
2 3
n
T (n) = T + 2n n
2 T (n) = 4 T + cn
2
n
T (n) = 2n T + nn n
2 T (n) = 3 T + n log n
n 4
T (n) = 16 T +n
4 n n
T (n) = 3 T +
n 3 2
T (n) = 2 T + n log n
2 n n
n n T (n) = 4 T +
T (n) = 2 T + 2 log n
2 log n
n
n T (n) = 64 T n2 log n
T (n) = 2 T + n0:51 8
4
n
1 n 1 T (n) = 7 T + n2
T (n) = T + 3
2 2 n
n n
T (n) = 16 T + n! T (n) = 4 T + log n
4 2
p n n
T (n) = 2 T + log n T (n) = T + n (2 cos n)
4 2
Rješenja.
n
T (n) = 3 T + n2 ) T (n) = (n2 ) (sluµcaj 3)
2
n
T (n) = 4 T + n2 ) T (n) = (n2 log n) (sluµcaj 2)
2
n
T (n) = T + 2n ) T (n) = (n2 ) (sluµcaj 3)
2
n
T (n) = 2n T + nn ) ne primjenjuje se (a nije konstanta)
2
n
T (n) = 16 T + n ) T (n) = (n2 ) (sluµcaj 1)
4
n
T (n) = 2 T + n log n ) T (n) = n log2 n (sluµcaj 2)
2
n n
T (n) = 2 T + )ne primjenjuje se (nepolinomijalna razlika izme†u f (n)
2 log n
i nlogb a )
n
T (n) = 2 T + n0:51 ) T (n) = (n0:51 ) (sluµcaj 3)
4
1 n 1
T (n) = T + )ne primjenjuje se (a < 1)
2 2 n
n
T (n) = 16 T + n! ) T (n) = (n!) (sluµcaj 3)
4
p n p
T (n) = 2 T + log n ) T (n) = ( n) (sluµcaj 1)
4
n
T (n) = 3 T + n ) T (n) = nlg 3 (sluµcaj 1)
2
n p
T (n) = 3 T + n ) T (n) = (n) (sluµcaj 1)
3
n
T (n) = 4 T + c n ) T (n) = (n2 ) (sluµcaj 1)
2
n
T (n) = 3 T + n log n ) T (n) = (n log n) (sluµcaj 3)
4
n n
T (n) = 3 T + ) T (n) = (n log n) (sluµcaj 2)
3 2
n n
T (n) = 4 T + ) T (n) = (n2 ) (sluµcaj 1)
2 log n
n
T (n) = 64 T n2 log n )ne primjenjuje se jer f (n) nije pozitivna
8
n
T (n) = 7 T + n2 ) T (n) = (n2 ) (sluµcaj 3)
3
n
T (n) = 4 T + log n ) T (n) = (n2 ) (sluµcaj 1)
2
n
T (n) = T + n (2 cos n) )Ne primjenjuje se. Pripada sluµcaju 3 ali je narušen
2
uslov regularnosti (pretpostavimo da je n = 2 k gdje je k neparan i proizvoljno
veliki. Za svaki takav izbor od n pokazuje se da je c 3=2 pa je narušen uslov
regularnosti)
U primjeru 7 razlika izme†u f (n) i nlogb a se moµze prikazati kao koliµcnik:
n
f (n) log n n 1
= = =
nlogb a nlog2 2 n log n log n
1
Jasno je da je < n" za bilo koje " > 0. Stoga razlika nije polinomijalna i ne moµze
log n
se primijeniti Master teorema.
p
Primjer 7.8 Riješiti rekurziju T (n) = 2 T ( n) + 1, metodom smjene promjenljivih.
Rješenje treba biti asimptotski taµcno.
Rješenje. Napravimo smjenu m = lg n ) n = 2m , na osnovu µcega rekurzija postaje:
T (2m ) = 2 T 2m=2 + 1
Neka je S (m) = T (2m ) tako da rekurzija postaje:
S (m) = 2 S (m=2) + 1 ) S (m) = O (lg m)
Vraćamo smjenu i dobijamo:
T (n) = T (2m ) = S (m) = O (lg m) = O (lg lg n)
log4 a = lg 7 ) a = 48
Drugim rijeµcima, algoritam B je asimptotski brµzi od A ako je a < 48. Drugi sluµcajevi
Master teoreme se ne primjenjuju za a > 48.
Primjer 7.10 Neko je otkrio naµcin da matrice 68 68 pomnoµzi sa 132464 mnoµzenja, ma-
trice 70 70 pomnoµzi sa 143640 mnoµzenja i matrice 72 72 pomnoµzi sa 155424 mnoµzenja.
Koja metoda daje asimptotski najbolje vrijeme izvršenja ako se koristi strategija "podijeli
i vladaj" ?
k+1
T (k + 1) = 2 T + (k + 1)
2
k+1 k+1
= 2 log2 + (k + 1)
2 2
= (k + 1) [log2 (k + 1) log2 2] + (k + 1)
= (k + 1) log2 (k + 1) (k + 1) + (k + 1)
= (k + 1) log2 (k + 1) (k + 1) lg (k + 1)
1X
n 1
T (n) = T (k) + n
n k=1
Pretpostaviti da rekurzija vrijedi za sve n > 1 i T (1) = 1. Koristiti relaciju T (n) cn2
za sve n n0 kao procjenu. Identi…kovati speci…µcne vrijednosti za c i n0 za koje procjena
vrijedi.
Rješenje. Izaberimo da je n0 = 1.
Osnovni sluµcaj. Trebamo pokazati da je T (1) c 12 . Izborom c T (1) = 1 ovo je
osigurano.
Induktivna hipoteza. Za sve k, 1 k < n vrijedi T (k) c k 2 .
Induktivni korak. Zamjenom induktivne hipoteze u datu rekurziju imamo:
3X
n 1
3c n (n 1) (2n 3)
T (n) c k2 + n = +n
n k=1 n 6
c c
= (n 1) (2n 3) + n = 2n2 5n + 3 + n
2 2
2 5cn 3c
= c n + +n
2 2
Da bi ovo bilo najviše c n2 mora biti:
5cn 3c
+ +n 0
2 2
Ovo je taµcno za sve c 1 i n 1, što znaµci da je izbor c = 1 dovoljan da vrijedi osnovni
sluµcaj i induktivna hipoteza.
Primjer 7.14 Dati donje i gornje granice za T (n) za svaku od sljede´cih rekurzija, pod
pretpostavkom da je T (1) konstatno: a) T (n) = T (n 1)+n; b) T (n) = T (n 1)+1=n;
n
c) T (n) = T (n 1) + lg n; d) T (n) = 2T (n=2) + n lg n; e) T (n) = 5T (n=5) + .
lg n
T (n) = T (n 1) + n
= n + (n 1) + (n 2) + ::: + 2 + T (1)
Xn
n (n + 1)
= k= = n2
k=1
2
X
n Z
n+1
1 dx
T (n) = = ln (n + 1) ln n = (ln n)
k=1
k x
1
X
n Xn Zn
1 1 dx
T (n) = =1+ 1+ = 1 + ln n = O (ln n)
k=1
k k=2
k x
1
) T (n) = (ln n) = (lg n)
T (n) = T (n 1) + lg n
= lg n + lg (n 1) + lg (n 2) + ::: + lg 2 + lg 1
!
Xn Yn
= lg k = lg k = lg (n!) = (n lg n)
k=1 k=1
Primjer 7.15 Sljede´ce rekurzije riješiti metodom iteracije. Za svaki problem pretpostaviti
da je T (n) = (1) za n 1 i T (n) za n > 1 kako slijedi: a) T (n) = aT (n=b) + (n);
b) T (n) = 5T (n=5) + n2 ; c) T (n) = T (n=2) + T (n=3) + n; d) T (n) = T (n 2) + 7;
e) T (n) = n T (n 1) + 1. U taµcki a) je potrebno zasebno analizirati sluµcajeve a > b,
a = b i a < b.
kao i da vrijedi:
nlogb x xk < x nlogb x
Sada razmatramo sluµcajeve a = b i a 6= b zasebno.
Sluµcaj 1: a = b. Prethodna rekurzija implicira da je:
n
T (n) = bk T + (nk)
bk
Zamjenom u nejednakosti za k dobijamo:
n X 1 k 1
k
T (n) = 5 T k + n2
5 i=0
5i
Xk
k n X
k 1
5
i
T (n) = T j k j
+n
j=0
j 23 i=0
6
Sada se koristi µcinjenica da je T (n) monotono rastuća kako bi se dobile sljedeće granice
sumiranja:
Xk
k n X
k 1
5
i Xk
k n X
k 1
5
i
T k +n T (n) T k +n
j=0
j 3 i=0
6 j=0
j 2 i=0
6
n 3k ^ log3 n k 1 + log3 n )
log3 2
n 2k 2 nlog3 2
T (n) = T (n 2k) + 7k
n n 2 n 1
af =a lg = n2 (lg n lg a)
a a a a
1 1
n2 (lg n lg a) n2 lg n
a a
Kako je a > 1 vrijedi da je 1=a < 1 pa vrijedi uslov regularnosti. U skladu sa tim se
koristi Sluµcaj 3 Master teoreme i imamo da je T (n) = (n2 lg n).
Primjer 7.17 Sljede´ce rekurzije riješiti metodom zamjene. Pretpostaviti da svaka rekurz-
ija vrijedi za n > 1 i da je T (n) = (1) za n < 1: a) T (n) = T (n=2) + T (n=3) + n,
uz T (n) = O (n); b) T (n) = T (n=3) + T (2n=3) + n, uz T (n) = (n lg n); c) T (n) =
T ( n) + n, 2 (0; 1), uz T (n) = (n).
Rješenje. a) Neka je n0 = 1.
Osnovni korak. Trebamo pokazati da je T (1) c 1. Ako odaberemo c T (1) ovaj
uslov je zadovoljen.
Indukcijska hipoteza. Neka vrijedi da je T (n) c k za sve k takve da je n0 k < n.
Sada ćemo pokazati da je T (n) c n. Zamjenom indukcijske hipoteze u rekurziju za
T (n) dobijamo:
n n 5n
T (n) c +c +n=c +n
2 3 6
5n
Da bi se pokazalo da je T (n) c n dovoljno je pokazati da je c + n c n za neko
6
c > 0. Ovo vrijedi za c 6. Stoga osnovni korak i indukcijska hipoteza vrijede ako je
c max fT (1) ; 6g.
b) Neka je n0 = 2.
Osnovni korak. Trebamo pokazati da je T (2) c 2 lg 2 = 2c. Ako odaberemo c T (2) =2
ovaj uslov je zadovoljen.
Indukcijska hipooteza. Neka vrijedi da je T (n) c k lg k za sve k takve da je n0 k < n.
Zamjenom indukcijske hipoteze u rekurziju za T (n) dobijamo:
n n 2n 2n
T (n) c lg +c lg +n
3 3 3 3
cn
= [lg n lg 3 + 2 lg (2n) 2 lg 3] + n
3
cn
= [lg n 3 lg 3 + 2 lg n + 2] + n
3
cn
= [3 lg n 3 lg 3 + 2] + n
3
2
= c n lg n c n lg 3 + cn + n
3
Da bi se pokazalo da je T (n) cn lg n dovoljno je pokazati da je:
2
c n lg n c n lg 3 + cn + n c n lg n
3
Ovo je ekvivalentno uslovu da je:
2
cn + n c n lg 3
3
Rješenje po c daje:
1
c
2
lg 3
3
Kako je lg 3 > 1 > 2=3 vrijedi da je 1= (lg 3 2=3) > 0, pa postoji c > 0 takvo da nije
veće od ove veliµcine. Izbor c min fT (2) ; 1= (lg 3 2=3)g osigurava da vrijede i osnovni
sluµcaj i indukcijska hipoteza.
c) Neka je n0 = 1.
Osnovni korak. Trebamo pokazati da je c1 1 T (1) c2 1. Ako odaberemo c1 T (1)
i c2 T (1) uslov će biti zadovoljen.
8 Sortiranja
8.1 Uvod
Algoritmi sortiranja su primjer matematiµckih algoritama koji se rješavaju putem mnogih
drugih razliµcitih metoda.
U opštem sluµcaju, sortiranje se shvata kao proces pregrupisavanja datog skupa objekata u
nekom odre†enom redoslijedu. Cilj sortiranja je olakšati pretraµzivanje elemenata u tako
sortiranom skupu. To je skoro univerzalni, fundamentalni zadatak. U svakodnevnom
µzivotu se srećemo sa puno primjera kao što su telefonski imenici, rijeµcnici i sliµcno.
Izbor algoritama za rješavanje bilo kog problema zavisi od strukture podataka, što je
skoro zakon, a u sluµcaju sortiranja takva zakonitost je toliko duboka da se odgovarajuće
metode dijele na dvije klase, sortiranje nizova i sortiranje fajlova. Nekada se nazivaju
unutrašnje i vanjsko sortiranje, s obzirom da se nizovi pohranjuju u brzo internoj memoriji
dok su fajlovi pohranjeni na spoljnim, sporijim ure†ajima (diskovi,...). Ovo je moguće
ilustrovati na primjeru sortiranja igraćih karata. Ako se karte posmatraju u obliku niza
onda su posloµzene na stolu i onaj ko ih sortira vidi ih sve pojedinaµcno i ima neposredan
pristup svakoj od njih. Ako karte obrazuju fajl to podrazumijeva da je vidljiva samo ona
na vrhu svake gomile. Ovakvo ograniµcenje ima ozbiljan uticaj na metod sortiranja.
Ako su dati elementi a1 ; a2 ; :::; an ; ::: tada je sortiranje permutacija tih elemenata u niz
ak1 ; ak2 ; :::; akn ; ::: u kojem, po osnovu neke funkcije poretka f vrijedi f (ak1 ) f (ak2 )
::: f (akn ) :::. Funkcija poretka se obiµcno ne raµcuna po nekom pravilu već se µcuva
kao sastavni dio (polje) svakog elementa. Znaµcenje te funkcije se naziva kljuµc (key).
Metod sortiranja je lokalan (in-place) ako ne koristi dodatne memorijske resurse za sor-
tiranje i stoga je moguće sortirati veoma velike liste bez potrebe alokacije (dodjeljivanja)
dodatnog memorijskog prostora.
Mada dobri algoritmi sortiranja trebaju n log n upore†ivanja, analiza poµcinje od prostijih
i oµciglednih algoritama koji se nekada nazivaju direktni. Motiv za ovakav izbor moµze biti:
Postupci tih metoda se lako pamte i kratki su. Ne treba zaboraviti da i programi
zauzimaju memoriju
Usloµznjavanje metoda trebaju manji broj operacija koje su same po sebi dosta
sloµzene pa su za male n direktne metode brµze mada ih ne treba koristiti za velike n
U apsolutnom indeksiranju µclanovi niza imaju indeks koji odgovara njihovoj stvarnoj pozi-
ciji (a1 ; a2 ; :::; an ; :::). Pomoću jednostavne transformacije je moguće pretvoriti jednu no-
taciju u drugu.
Insertion sort će biti objašnjen na primjeru sortiranja niza A = fa0 ; a1 ; :::; an 1 g u ras-
tućem poretku. Na poµcetku algoritma sortirani dio se sastoji samo od prvog elementa a0
dok svi ostali elementi µcine nesortirani dio niza. U prvom koraku se porede elementi a1 i
a0 (drugi i prvi element u nizu). Ako je element a0 veći od elementa a1 tada se element a1
pohranjuje u privremenu lokaciju priv, element a0 se pomjera na drugo mjesto (i = 1) te
se na prvo mjesto u nizu, s indeksom i = 0, pohranjuje element a1 iz privremene lokacije
priv. U ovom trenutku sortirani dio niza sadrµzi dva elementa (a0 i a1 ) a nesortirani dio
sadrµzi n 2 elemenata (a2 , a3 ,...an 1 ).
Na tabeli su naglašeni elementi koji u tom algoritmu imaju indeks i. Pseudo kod kojim
se opisuje ovaj algoritam je u nastavku.
Ovakav tipiµcan sluµcaj ponavljajućeg procesa sa dva uslova završetka dozvoljava korištenje
graniµcnika (sentinel). U ovom sluµcaju to moµze biti element a0 (što znaµci da je dovoljno
raspon indeksa proširiti indeksom 0). Analiza sloµzenosti ove metode je data dijelom na
sljedećoj tabeli.
Korak Dinamika
0 1 i 1
1 Za(i = 1 do Duzina [a] 1 korak 1) { n 1+1
2 priv a [i] n 1
3 j i 1 n 1
4 DokVrijedi (j 0 & a [j] > priv) {
5 a [j + 1] a [j]
6 j j 1}
7 a [i + 1] priv n 1
8 j j+1 n 1
0 }
X
n
n (n 1)
Tc (n) = i=
i=1
2
Na taj naµcin se dobija da ovaj algoritam ima kvadratnu zavisnost od veliµcine niza odnosno
njegova brzina se izraµzava sa O (n2 ).
Analiza ove metode putem broja pore†enja i premještanja pokazuje da broj pore†enja
kljuµceva (Ci ) u i-tom koraku moµze biti najviše i 1, najmanje 1 a u prosjeku i=2,
pod pretpostavkom da su sve permutacije od n elemenata jednako vjerovatne. Broj
premještanja Mi je jednak Ci + 2 (ukljuµcujući barijeru, sentinel). Na sljedećoj tabeli su
procjene brzine ovog algoritma.
C M
min n 1 3 (n 1)
n2 + n 4 n2 + 9n 10
prosjek
4 4
n2 + n 2 n2 + 3n 4
max
4 4
Minimalne ocjene se mogu desiti kod već sortiranih nizova a najgore kada je niz sortiran
opadajućim redoslijedom.
Za razumljiviji opis ovog algoritma će biti korišten konkretan primjer. Neka je zadatak
sortirati sljedeći niz brojeva:
28; 17; 10; 79; 13; 67; 23; 33; 12; 5; 9; 80; 86; 15; 59; 49; 64; 54; 36; 29
Pošto Shell sort poredi brojeve iz niza uzimajući neki razmak, neka je u prvoj fazi taj
razmak 7 tj. h1 = 7. To znaµci da će se porediti i me†usobno eventualno razmjenjivati
mjesta sljedeći brojevi: 28, 33 i 59 (jer su razmaknuti za 7 mjesta). Isto tako, porediće
se i eventualno me†usobno razmjenjivati mjesta brojevi 17, 12 i 49 (jer su tako†er raz-
maknuti za 7 mjesta). Da bi proces bio jasnije objašnjen, moµze se koristiti drugaµciji
naµcin prikaza. Naime, ako je odabran razmak 7 onda se gornji poµcetni niz brojeva moµze
prikazati sljedećom tabelom koja ima 7 kolona, pri µcemu svaka kolona sadrµzi elemente
pojedine grupe koji se posebno sortiraju:
28 17 10 79 13 67 23
33 12 5 9 80 86 15
59 49 64 54 36 29
28 12 5 9 13 29 15
33 17 10 54 36 67 23
59 49 64 79 80 86
Ova tabela se sada moµze prikazati u obliku jednodimenzionalnog niza, što zapravo i
odgovara stvarnom rasporedu elemenata u memoriji:
28; 12; 5; 9; 13; 29; 15; 33; 17; 10; 54; 36; 67; 23; 59; 49; 64; 79; 80; 86
Moµze se primijetiti da rezultirajući niz u trenutnoj fazi sortiranja, kada je uzet razmak 7,
ima veći stepen ure†enosti od poµcetnog niza. Vidljivo je pomjeranje elemenata sa većim
vrijednostima prema kraju niza i elemenata sa manjim vrijednostima prema poµcetku niza.
Na primjer, element 29 sa zadnje pozicije se pomjerio na šesto mjesto, dok se, na primjer,
element 36 sa predzadnje pozicije pomjerio na dvanaesto mjesto.
Postupak primjene algoritma Shell sort se nastavlja tako što se sada uzme, na primjer,
razmak h2 = 3. To znaµci da se ulazni niz u drugoj fazi za potrebe vizualizacije elemenata
koji se tretiraju kao posebne grupe moµze prikazati u obliku sljedeće tabele sa 3 kolone
(lijeva tabela) :
28 12 5 9 12 5
9 13 29 10 13 17
15 33 17 15 23 29
10 54 36 ) 28 33 36
67 23 59 49 54 59
49 64 79 67 64 79
80 86 80 86
Opet se grupe (kolone) sortiraju primjenom osnovne varijante sortiranja umetanjem te
se dobija se tabela desno koja zapravo prikazuje sljedeći niz:
9; 12; 5; 10; 13; 17; 15; 23; 29; 28; 33; 36; 49; 54; 59; 67; 64; 79; 80; 86
Rezultujući niz ima veći stepen ure†enosti u odnosu na niz u prethodnoj fazi. Naime,
došlo je do daljnjeg pomjeranja većih brojeva prema kraju niza i manjih brojeva prema
poµcetku niza. Rezultujući niz ipak jošnije sortiran, te je ostalo da se napravi jošjedna faza
nakon µcega će niz biti konaµcno sortiran. Pošto je trenutni niz „skoro sortiran”, razumno je
zapravo uzeti razmak h3 = 1 a to znaµci primijeniti osnovnu varijantu algoritma sortiranja
umetanjem, jer će biti potreban mali broj pore†enja i premještanja s obzirom da je niz već
„skoro sortiran”. Dakle, primjenom algoritma sortiranja umetanjem s razmakom h3 = 1,
dobija se rezultirajući sortirani niz:
5; 9; 10; 12; 13; 15; 17; 23; 28; 29; 33; 36; 49; 54; 59; 64; 67; 79; 80; 86
Algoritam za Shell Sort je u nastavku. U njemu je fHg niz razmaka koji se uzimaju na
svakom koraku. U našem primjeru je H = f7; 3; 1g.
Do sortiranog niza će dovesti primjena bilo kojeg niza razmaka H = fh0 ; h1 ; :::; ht 1 g
takvih da je :
ht 1 =1
Pitanje : da li se i u kom dijelu ovaj algoritam mijenja ako se za niz fHg uzmu brojevi
Fibonaµcijevog niza ?
Sliµcno kao i za Insertion sort, i kod Selection sort algoritma u procesu sortiranja se
razlikuju sortirani i nesortirani dio niza. Na poµcetku svi elementi niza:
0 1 2 3 4 5 0 1 2 3 4 5
4 11 2 9 3 10 2 3 4 9 11 10
2 11 4 9 3 10 2 3 4 9 11 10
2 11 4 9 3 10 2 3 4 9 11 10
2 3 4 9 11 10 2 3 4 9 11 10
2 3 4 9 11 10 2 3 4 9 10 11
što na kraju daje Mavg = n (n ln +g). Odavdje se izvodi zakljuµcak da je ovaj algoritam
preporuµcljiviji u odnosu na sortiranje umetanjem. Ako su kljuµcevi sortirani ili skoro
sortirani insertovanje je nešto bolji algoritam.
Bubble sort je jedan od najjednostavnijih algoritama sortiranja. Ovaj algoritam radi tako
da više puta sekvencijalno prolazi kroz niz, pri µcemu se pri svakom prolazu upore†uje svaki
element sa elementom koji se nalazi neposredno iza njega. Ako se nakon pore†enja utvrdi
da susjedni elementi nisu u µzeljenom poretku, onda elementi me†usobno izmjenjuju svoje
pozicije, što ima za posljedicu da se prema kraju niza postepeno pomjeraju elementi sa
većim vrijednostima ako je µzeljeni poredak sortiranja rastući, ili da se prema kraju niza
postepeno pomjeraju elementi sa manjim vrijednostima ako je µzeljeni poredak sortiranja
opadajući.
U prvom prolazu kroz niz na zadnjem mjestu će se pozicionirati najveći (najmanji) el-
ement, pa sortirani dio µcini element a [n 1], a nesortirani dio µcine a [k], k = 0; ; n 2.
U drugom prolazu, porede se elementi na pozicijama 0 do n 2, te će se nakon tog pro-
laza na poziciju s indeksom n 2 sigurno pozicionirati najveći element iz nesortiranog
dijela. Općenito, prije nekog i-tog prolaza, za i > 1, sortirani dio µcine elementi a [k],
k = n i + 1; ; n 1 a nesortirani dio elementi a[k], k = 0; ; n i. U nekom i-tom
prolazu pore†enja i izmjene pozicija susjednih elemenata, na (n i)-tu poziciju će doći
najveći element iz nesortiranog dijela. Sekvencijalni prolazi se nastavljaju do (n 1)-og
prolaza odnosno dok se na drugu poziciju u nizu s indeksom 1 ne pozicionira odgovarajući
element. Naime, n-ti prolaz kroz niz nije ni potreban jer je ostao samo jedan element i
samo jedna dostupna pozicija s indeksom 0, pa je praktiµcno niz nakon (n 1)-og prolaza
već sortiran.
Algoritam Bubble sort je ilustriran po koracima na slici za jedan primjer poµcetnog ne-
sortiranog niza od 6 elemenata. Algoritam ukljuµcuje n 1 prolaza kroz nesortirani dio
niza, pri µcemu svaki prolaz osigurava smještanje najvećeg elementa iz nesortiranog dijela
na zadnju poziciju tog dijela niza. Ta pozicija je na slici za svaki prolaz istaknuta linijom
s donje strane. Okvirom su oznaµceni elementi koji se nalaze u sortiranom dijelu niza,
odnosno, elementi koji se nalaze na svojim konaµcnim pozicijama. U prvom koraku su
oznaµcene prva pozicija sa indeksom 0 na kojoj se nalazi element 10 i druga pozicija sa
indeksom 1 na kojoj se nalazi element 11. Pošto su elementi 10 i 11 u µzeljenom poretku,
ne dolazi do zamjene njihovih pozicija. U sljedećem koraku se porede elementi 11 i 3.
Budući da se ovi elementi ne nalaze u µzeljenom poretku, dolazi do zamjene njihovih
pozicija. Prvi prolaz kroz niz se nastavlja sve dok promjenljiva j ne dostigne vrijednost
j = 5. Nakon prvog prolaza će se najveći element 11 nalaziti na svojoj konaµcnoj poziciji s
indeksom i = 5. U ovom trenutku sortirani dio niza µcini jedino element 11 dok svi ostali
elementi predstavljaju nesortirani dio niza.
Ovaj algoritam je prikazan u obliku procedure u nastavku. Ulaz u proceduru je niz a koji
se sortira. Vanjskom for petljom se implementira Duzina[a] 1 prolaza kroz nesortirani
dio niza, µcime se osigurava smještanje najvećeg elementa na zadnju poziciju tog dijela
niza. Unutarnjom for petljom se implementira jedan prolaz u kojem se nakon pore†enja
susjednih elemenata i utvr†ivanja da nisu u µzeljenom poretku izmjenjuju njihove pozicije.
Pretpostavimo da je ulazni niz a već sortiran. U toj situaciji će broj potrebnih operacija
ostati opet isti, bez obzira na poµcetnu ure†enost niza. Me†utim, da bi se u odre†enoj
mjeri povećala e…kasnost, moguće je oblikovati takvu varijantu algoritma Bubble sort
koja će detektirati prolaz kroz niz u kojem nije došlo ni do jedne zamjene pozicija, što
je zapravo znak da je niz već sortiran. Nakon takve detekcije proces sortiranja se moµze
prekinuti da bi se izbjegle nepotrebne operacije pore†enja. Postoji mogućnost da je samo
jedan dio niza već sortiran pa se e…kasnost moµze povećati i tako što će se identi…cirati
taj dio niza kojeg u sljedećoj iteraciji neće biti potrebno prolaziti. Detekciju prolaza kroz
niz u kojem nije došlo ni do jedne zamjene pozicija, a isto tako i identi…ciranje dijela
niza koji je već sortiran, moµze se napraviti tako da se u svakom prolazu kroz niz zapamti
pozicija sa najvećim indeksom j na kojoj je izvršena zamjena. Neka se, na primjer, sortira
niz koji ima n = 9 elemenata, te da je nakon trećeg prolaza raspored elemenata kao na
sljedećoj tabeli.
0 1 2 3 4 5 6 7 8
i = 5; j = 1; p = 1 27 24 17 28 31 33 35 38 43 a
i = 5; j = 2; p = 2 24 27 17 28 31 33 35 38 43 b
i = 5; j = 3; p = 2 24 17 27 28 31 33 35 38 43 c
i = 5; j = 4; p = 2 24 17 27 28 31 33 35 38 43 d
i = 5; j = 5; p = 2 24 17 27 28 31 33 35 38 43 e
pozicija. Prolazi se izvode u sklopu repeat-until petlje, te pri svakom novom prolazu
se vrijednost promjenljive p postavlja na nulu. Ako se dogodi da u nekom prolazu već
postoji sortiran poredak elemenata tada će i na kraju prolaza biti p = 0 pa će algoritam
završiti svoj rad. Unutarnjom for petljom ostvaruje se jedan prolaz kroz nesortirani dio
niza ali samo do pozicije i = p 1 jer na pozicijama iznad p nije bilo izmjena, pa je taj
dio niza već sortiran.
L 2 3 3 4 4
R 8 8 7 7 4
Smjer " # " # " # "
44 06 06 06 06 06 06 06
55 44 44 12 12 12 12 12
12 55 12 44 44 18 18 18
42 12 42 42 42 44 44 42
94 42 55 55 55 42 42 44
18 94 18 18 18 55 55 55
06 18 67 67 67 67 67 67
67 67 94 94 94 94 94 94
{ x a [j 1] ;
a [j 1] a [j]
a [j] x
k 1 }
}
L k+1
Za(j = L; R; 1)
{
AkoJe(a [j 1] > a [j])
{ x a [j 1] ;
a [j 1] a [j]
a [j] x
k 1 }
}
R k 1
}
SveDokJe(L > R)
Analiza poboljšanih verzija, posebno Shaker Sort-a, je dosta sloµzena. Minimalni broj
pore†enja je Cm = n 1. Knuth smatra dap je prosjeµcan broj prolaza u poboljšanom Bub-
ble Sort algoritmu proporcionalan sa n k1 n a prosjeµcan broj pore†enja proporcionalan
sa (1=2) (n2 n (k2 + ln n)). Predloµzena poboljšanja ne utiµcu na broj premještanja, oni
jedino skraćuju nepotrebna binarna pore†enja. Naµzalost, zamjena dva elementa je mnogo
µcešća operacija tako da se ne dobiju oµcekivana poboljšanja. Pokazuje se da je Bubble Sort
po karakteristikama negdje izme†u sortiranja umetanjem i sortiranja zamjenom. Faktiµcki,
Bubble Sort ne donosi ništa novo osim privlaµcnog naziva. Shaker Sort se uspješno koristi
u sluµcajevima kada je niz dosta sortiran, što se u praksi dosta rijetko dešava.
sortiranih podnizova na e…kasan naµcin mogu spajanjem tih podnizova dobiti novi sorti-
rani podnizovi. Prije faze spajanja sortiranih podnizova, koja zapravo predstavlja drugu
fazu algoritma, Merge sort u svojoj prvoj fazi dijeli poµcetni nesortirani niz na manje i
manje podnizove. Minimalni niz je niz sa samo jednim elementom, pa je takav niz sam
po sebi već sortiran. Zato algoritam Merge sort dijeli poµcetni nesortirani niz na manje i
manje dijelove, sve dok se ne dobiju nizovi sa samo jednim elementom. Nakon te prve faze
dijeljenja, slijedi druga faza spajanja sortiranih podnizova u kojoj se od manjih sortiranih
podnizova njihovim objedinjavanjem stvaraju sve veći i veći sortirani podnizovi, sve dok
se na kraju ove faze ne kreira cijeli sortirani niz.
Merge sort se moµze realizovati kao rekurzivni algoritam, pri µcemu se na svakom nivou
rekurzije obavljaju sljedeći koraci:
dijeljenje poµcetnog nesortiranog niza na dva podniza od kojih svaki ima po n=2
elemenata;
Ulazni argument a predstavlja niz koji se treba sortirati. Argument l oznaµcava indeks
prve pozicije a argument u oznaµcava indeks zadnje pozicije podniza a [l::u] koji se sortira.
Postupak sortiranja se ostvaruje tako što se ulazni podniz a [l::u] dijeli na dva podniza
a zatim se proces nastavlja rekurzivnim pozivima procedure M ergeSort koji kao ulazne
nizove imaju podnizove nastale dijeljenjem. Dijeljenje ulaznog niza na dva podniza se
ostvaruje izraµcunavanjem vrijednosti promjenljivih p i q. Promjenljiva p predstavlja in-
deks zadnje pozicije prvog podniza, a vrijednost promjenljive q oznaµcava prvu poziciju
drugog podniza. Na taj naµcin ulazni niz a [l::u] je podijeljen na podnizove a [l::p] i a [q::u].
U proceduri M ergeSort se nalaze dva rekurzivna poziva ove procedure. Prvim pozivom
M ergeSort (a; l; p) proces se nastavlja nad prvom polovinom podijeljenog niza, dok se
pozivom M ergeSort (a; q; u) proces nastavlja nad drugom polovinom podijeljenog niza.
Nesortirani niz se rekurzivno dijeli na podnizove, sve dok se ne dobiju podnizovi koji
sadrµze samo jedan element, tj. dok vrijedi u > l. Nakon povratka iz obje ove proce-
dure na svakom nivou rekurzije se pozivom procedure M erge obavlja spajanje sortiranih
podnizova. Taj postupak, opisan procedurom M erge, je dat kasnije. Na primjer, nakon
povratka iz obje procedure M ergeSort na zadnjem nivou rekurzije, kada podnizovi nastali
dijeljenjem imaju veliµcine 1 poziva se procedura M erge za spajanje tih podnizova da bi
se kreirao niz veliµcine 2. Na sljedećem, višem nivou, su dva sortirana niza veliµcine 2 koji
će se spojiti u sortirani podniz veliµcine 4. Ovaj proces se nastavlja sve dok se ne do†e do
prvog poziva, koji spaja dva sortirana podniza koji sadrµze po pola elemenata poµcetnog
nesortiranog niza.
Na slici je ilustriran proces sortiranja algoritmom Merge sort za niz sa 13 elemenata. Al-
goritam u prvoj fazi dijeli poµcetni niz na polovine rekurzivnim procesom sve dok rezultira-
jući podnizovi ne sadrµze samo jedan element. Nakon toga se prelazi u drugu fazu, u kojoj
nakon završavanja rekurzivnih poziva procedure M ergeSort na svakom nivou rekurzije
imamo procese spajanja podnizova. Kretanjem prema prvom rekurzivnom pozivu pod-
nizovi se spajaju, te se oblikuju sve veći i veći sortirani podnizovi.
Kljuµcni koraci u algoritmu Merge sort su koraci spajanja dva sortirana podniza. Neka su
nizovi b [0::5] i b [6::12] sortirani, naprimjer, u rastućem poretku. Da bi ta dva sortirana
podniza bila spojena u jedan sortirani niz a prvo treba odrediti najmanji element iz oba
podniza. Sigurno je da je najmanji element ili b [0] ili b [6]. Isto tako, najveći element je
ili b [5] ili b [12]. Operacija spajanja poµcinje tako da se u a [0] smjesti manji od elemenata
b [0] ili [6]. Neka je b [0] < b [6] pa je tada a [0] = b [0]. Nisu raspore†eni elementi b [1::5] i
b [6::12]. U a [1] se treba smjestiti manji od elemenata na prvim pozicijama neraspore†enih
dijelova podnizova b [1::5] i b [6::12]. Dakle, u a [1] se treba smjestiti manji od elemenata:
b [1] ili b [6]. Neka je manji element b [1] pa je a [1] = b [1]. Sada su neraspore†eni elementi
b [2::5] i b [6::12].
SveDokJe(i p l ^ j u l)
{
AkoJe(b [i] < b [j])
{ a [k] b [i]
i i+1 }
Inaµce
{ a [k] [j]
j j+1 }
k k+1
}
SveDokJe(i p 1)
{ a [k] b [i]
k k+1
i i+1 }
SveDokJe(j u l)
{ a [k] b [j]
k k+1
j j+1 }
Moµze se zakljuµciti da za formiranje sortiranog niza a treba mehanizam koji će omogućiti
oznaµcavanje raspore†enih i neraspore†enih elemenata iz podnizova b [0::5] i b [6::12]. Ovaj
mehanizam praćenja se realizuje uvo†enjem dva indeksa za spomenute podnizove, koji
će oznaµcavati poziciju u oba podniza na kojoj se trenutno nalaze kandidati za minimalni
element od preostalih neraspore†enih elemenata. Neka je i indeks za praćenje podniza
b [0::5] a j indeks za praćenje podniza b [6::12]. Svakim odre†ivanjem minimalnog ele-
menta taj element se smješta u niz a a indeks pridruµzen podnizu koji je u tom koraku
sadrµzavao minimalni element se povećava za 1. Dakle, preostali neraspore†eni elementi u
podnizu b [0::5] će biti elementi b [i::5] a u podnizu b [6::12] će biti neraspore†eni elementi
b [j::5]. U jednom trenutku će se rasporediti svi elementi iz jednog od podnizova pa će se
preostali elementi iz podniza u kojem je ostalo jošneraspore†enih elemenata jednostavno
nadovezati na spojeni niz. Postupak spajanja je opisan procedurom M erge.
0 1 2 3 4 5 6 7 8 9 10 11 12
Niz B 4 11 16 18 20 25 5 7 10 14 28 32 35 a
i = 0; j = 6; k = 0 4 b
i = 1; j = 7; k = 1 4 5 c
i = 1; j = 7; k = 2 4 5 7 d
i = 1; j = 8; k = 3 4 5 7 10 e
i = 1; j = 9; k = 4 4 5 7 10 11 f
i = 2; j = 9; k = 5 4 5 7 10 11 14 g
i = 2; j = 10; k = 6 4 5 7 10 11 14 16 h
i = 3; j = 10; k = 7 4 5 7 10 11 14 16 18 i
i = 4; j = 10; k = 8 4 5 7 10 11 14 16 18 20 j
i = 5; j = 10; k = 9 4 5 7 10 11 14 16 18 20 25 k
i = 5; j = 10; k = 10 4 5 7 10 11 14 16 18 20 25 28 l
i = 5; j = 11; k = 11 4 5 7 10 11 14 16 18 20 25 28 32 m
i = 5; j = 12; k = 12 4 5 7 10 11 14 16 18 20 25 28 32 35 n
Ako se utvrdi da je manji element b [j] tada se u rezultirajući niz a na poziciju k smješta taj
element pa se povećava indeks j. Tada podniz b [j::12] predstavlja trenutno neraspore†ene
elemente iz drugog podniza. Nakon svakog smještanja elementa u rezultirajući niz a,
inkrementira se promjenljiva k. Promjenljive i i j inicijalno imaju vrijednosti i = 0,
j = 6, k = 0 (b). Pore†enjem elemenata b [0] i b [6] vidi se da je manji element b [0] = 4
pa se taj element u nizu a smješta na poziciju k = 0, a[0] = 4. Pošto je u ovom koraku
izabran element iz prve polovine, inkrementira se promjenljiva i kao i promjenljiva k,
koja se inkrementira u svakom pojedinom koraku smještanja elemenata u rezultirajući
niz a. U ovom trenutku vrijednosti promjenljivih su: i = 1, j = 6, k = 1. U sljedećem
koraku se izabire manji od elemenata b [1] i b [6]; vidi se da je manji element b [6] = 5 pa
se taj element u nizu a smješta na poziciju k = 1, a [1] = 5 (c). Na tabeli su ilustrovani
i ostali koraci spajanja podnizova. U koraku k svi elementi iz prvog podniza (b[0::5]) su
već raspore†eni u rezultirajući niz a pa je u nastavku algoritamskog procesa potrebno
samo da se preostali elementi (b[10::12]) jednostavno dodaju u rezultirajući niz a (l do
n).
koristi drugi niz za pohranu. Nije stabilan. Postoji stabilna verzija QuickSort algoritma
ali ona nije lokalna. Ovaj algoritam je (n log n) u oµcekivanom i (n2 ) u najgorem
sluµcaju. Ako je implementiran prikladno, vjerovatnoća da će algoritam trajati asimptotski
duµze (pod pretpostavkom da je pivot odabran sluµcajno) je ekstremno mala za veliko n.
Algoritam Quick sort tako†er koristi strategiju “podijeli, pa vladaj”. Ulazni niz se dijeli
na dva dijela tako što se taj niz reorganizira tako da su svi elementi u prvom donjem
dijelu manji od svih elemenata u drugom gornjem dijelu niza. Ta dva dijela nakon
reorganizacije su nesortirana i razdvojena elementom koji se naziva pivot i koji se nalazi
na nekoj poziciji j. Dakle, donji dio µcine elementi koji imaju vrijednost manju ili jednaku
vrijednosti pivota (a [i] pivot, i = 0; 1; : : : ; j 1) a gornji dio µcine elementi koji imaju
vrijednost veću ili jednaku vrijednosti pivota (a[i] pivot, i = j + 1; j + 2; : : : ; n 1).
Mogući su razliµciti naµcini izbora pivota. Na primjer, pivot se moµze napraviti tako da
se uzme prvi element niza koji se dijeli, mada postoje i e…kasniji naµcini. Idealno, pivot
element bi trebao dijeliti niz na dva podniza sa jednakim brojem elemenata. Zbog naµcina
na koji je ulazni niz reorganiziran moµze se zakljuµciti da je pivot element pozicioniran na
svoju konaµcnu poziciju j te se u daljnjem postupku više neće pomjerati. Nadalje, moµze
se zakljuµciti da se sortiranje moµze nastaviti tako da se isti algoritam rekurzivno primijeni
na dobijena dva dijela ulaznog niza. Rekurzivni postupak se nastavlja sve dok se ne
postigne da rezultirajući dijelovi imaju samo jedan element. Završetkom rekurzivnog
postupka dobiva se sortirani niz.
Kljuµcni dio u algoritmu Quick sort je naµcin reorganizacije niza na dvije particije odvojene
pivotom, bez korištenja dodatnog pomoćnog memorijskog prostora. Taj naµcin je opisan
funkcijom P articija u tabeli. Funkcija P articija vraća indeks pozicije na kojoj je sm-
ješten pivot. Neka se kao pivot koristi prvi element u nizu. U primjeru na tabeli za pivot
se uzima element 42 (oznaµcen tankom donjom crtom). Funkcijom P articija potrebno je
reorganizirati niz tako da se prona†e odgovarajuća pozicija za pivota te da svi elementi
manji od njega budu na pozicijama ispred njega a svi veći elementi da budu na pozicijama
iza njega. Na tabeli p oznaµcava poziciju elemenata koji se trenutno porede sa pivotom.
Kada se prona†e prvi element veći od pivota, tada se za oznaµcavanje pozicija elemenata
koji se trenutno porede sa pivotom koristi oznaka i. Te pozicije su na tabeli istaknute
donjom podebljanom crtom. Poµcevši od drugog elementa u nizu zapoµcinje pronalaµzenje
prvog elementa koji je veći ili jednak pivotu (42) te na poziciji s indeksom 3 pronalazimo
prvi takav element a to je 54. Prona†ena pozicija p = 3 se oznaµcava kao privremeni poµce-
tak druge particije (koja će se nalaziti iza pivota) što je oznaµceno osjenµcenom pozicijom.
Postupak se nastavlja pore†enjem pivota i elemenata iz niza (i = p + 1; p + 2; : : : ; n 1)
koji se nalaze iza oznaµcene pozicije. Kada se prona†e element koji je veći ili jednak piv-
otu, taj element se ostavlja na svojoj poziciji, te se nastavlja proces pore†enja pivota i
elemenata na preostalim pozicijama. Na primjer, na tabeli na poziciji i = 4 je element 49
pa taj element ostaje na svojoj poziciji. Kada se prona†e element koji je manji od pivota,
tada taj element i element na poziciji p razmjenjuju pozicije, te se oznaka p povećava za
1 tako da oznaka p pokazuje na novi poµcetak druge particije. Na primjer, na poziciji s
indeksom i = 5 se nalazi element 22 koji je manji od pivota (42), pa element 22 razm-
jenjuje poziciju s elementom na poziciji p a to je 54. Istovremeno, privremena vrijednost
indeksa p za poµcetak druge particije se povećava za 1 pa sada ima vrijednost p = 4. Ovaj
proces se nastavlja sve dok se ne do†e do kraja niza. Svi ostali koraci u reorganizaciji
niza s ciljem njegovog particioniranja su tako†er ilustrirani na tabeli.
Pri kraju procesa, kada indeks i dostigne vrijednost 9 (i = n 1) pivot se jošuvijek nalazi
na prvoj poziciji. Me†utim, niz je prethodno reorganiziran tako da su svi elementi od
pozicije 1 do pozicije 4 (p 1) manji od pivota, dok su elementi na pozicijama 5 do 9 (p do
n 1) veći od pivota. Pošto je cilj da pivot dijeli te dvije grupe elemenata, potrebno je još
razmjeniti pozicije pivota i elementa na poziciji 4 (p 1), µcime se završava particioniranje
niza. Dakle, na kraju opisanog procesa, pivot element 42 se nalazi na poziciji 4. Svi
elementi na pozicijama s indeksima 0 do 3 su manji od pivot elementa 42 dok su svi
elementi na pozicijama 5 do 9 veći od pivot elementa. Inicijalni raspored elemenata
niza je prikazan prvim rasporedom na sljedećoj tabeli (na kojoj je ilustrovan postupak
particije).
0 1 2 3 4 5 6 7 8 9
p=1 42 36 17 54 49 22 63 57 20 46
p=2 42 36 17 54 49 22 63 57 20 46
p=3 42 36 17 54 49 22 63 57 20 46
p = 3; i = 4 42 36 17 54 49 22 63 57 20 46
p = 3; i = 5 42 36 17 54 49 22 63 57 20 46
p = 4; i = 5 42 36 17 22 49 54 63 57 20 46
p = 4; i = 6 42 36 17 22 49 54 63 57 20 46
p = 4; i = 7 42 36 17 22 49 54 63 57 20 46
p = 4; i = 8 42 36 17 22 49 54 63 57 20 46
p = 5; i = 8 42 36 17 22 20 54 63 57 49 46
p = 5; i = 9 42 36 17 22 20 54 63 57 49 46
j = 4; p = 5 20 36 17 22 42 54 63 57 49 46
20 36 17 22 42 54 63 57 49 46 (a)
20 36 17 22 42 54 63 57 49 46 (b)
17 20 36 22 42 54 63 57 49 46 (c)
17 20 36 22 42 54 63 57 49 46 (d)
17 20 22 36 42 54 63 57 49 46 (e)
17 20 22 36 42 46 49 54 63 57 (f)
17 20 22 36 42 46 49 54 63 57 (g)
17 20 22 36 42 46 49 54 57 63 (h)
Na slici je raspored elemenata u nizu nakon prve particije. Izabrani pivot u pojedinim
fazama je oznaµcen pojaµcno a elementi koji su zauzeli svoje konaµcne pozicije su uokvireni
obiµcnom linijom. Bez linija su elementi koji u pojedinim fazama algoritma µcine podnizove
koji u nastavku ulaze u proces particije. U sljedećem koraku kao pivot se uzima element
20, a proces particije se nastavlja sa podnizom koji µcine elementi koji se nalaze na pozi-
cijama 0 do 3. Rezultat particije je prikazan u liniji (c). Pivot element 20 je zauzeo svoje
konaµcno mjesto na poziciji s indeksom 1, donju particiju µcini samo jedan element (17),
dok gornju particiju µcine dva elementa (36 i 22). Na linijama (d) do (h) su ilustrirane i
ostale faze u radu algoritma.
9 Grafovski algoritmi
9.1 Uvod
U cilju potpunog razumijevanja grafovskih algoritama potrebno je de…nisati odgovarajuće
pojmove i utvrditi konvencije.
Predmet analize su samo prosti grafovi, koji nemaju petlje u pojedinim µcvorovima
i nemaju ponavljajućih ivica
Jedan od prvih problema koji se rješava kada se raµcunarski simuliraju grafovski algoritmi
je predstavljanje odnosno na koji naµcin tu informaciju prenijeti raµcunaru. Postoje tri
naµcina:
Lista µcvorova (edge list) : formira se jednostavna numerisana lista koja u nekim
sluµcajevima moµze biti sortirana
1 0 1 0
U ovoj listi vrijedi da je aij = aji što znaµci da je graf neusmjeren. U sluµcaju da je aij 6= aji
radi se o usmjerenom grafu.
Ako se svakoj grani dodijeli neka vrijednost govori se o teµzinskom grafu (ponderisani
graf, weighted graph, ...). "Teµzina" je u tom sluµcaju veliµcina koja je od interesa kao
npr. rastojanje, cijena, vjerovatnoća i sliµcno. Namjena ovog teksta nije da se bavi inter-
nom prezentacijom. U tom smislu će za svaki tip problema biti korištena odgovarajuća
notacija.
Ideja je da se µcvorovi koji još nisu pretraµzeni obiljeµze Bijelo a pretraµzeni Crno. Kad se
pretraµzuju µcvorovi kojima se nastavlja zapoµceta putanja (tzv. child µcvorovi) mora se
osigurati da se ne obra†uju ponovo pa se oznaµcavaju kao Sivi. Inicijalno, svi µcvorovi su
oznaµceni Bijelo.
i svaka iteracija petlje mijenja boju barem jednog µcvora tako da se ne pojavljuje beskon-
aµcna petlja. Algoritam se završava samo ako su svi µcvorovi oznaµceni Bijelo ili Crno. Bilo
koji µcvor koji je oznaµcen Bijelo ne moµze biti susjed µcvora koji je povezan sa startnim
µcvorom (jer bi inaµce bio oznaµcen kao Sivo). Bilo koji µcvor koji je oznaµcen Crno mora
biti povezan sa poµcetnim µcvorom. Stoga, putanja od µcvora n do µcvora m postoji ako i
samo ako je w oznaµcen kao Crno na kraju algoritma. U suštini, ovo je naµcin da se na†u
povezane komponente, zasebne cjeline grafa koje nisu povezane ivicama.
AkoJe(boja [i]=Bijelo)
{
numCC numCC + 1
cc [i] numCC
boja [i] Sivo
SveDok(Postoji µcvor Sivo)
{
Uzmi Sivi µcvor j
Obojiti sve njegove Bijele susjede Sivo
cc [j] numCC
boja [j] Crno }
}
}
Kad se ovaj algoritam završi veliµcina numCC sadrµzi ukupan broj povezanih komponenti
a cc [i] daje oznaku komponente koja je povezana sa µcvorom i. Korak "Uzmi Sivi µcvor j"
se moµze raditi na dva naµcina:
Ova dva pristupa se bitno razlikuju po sloµzenosti i dinamici pretraµzivanja i oba pristupa
imaju puno praktiµcnih primjena.
Prvi od njih ima sloµzenost O (n2 ) jer se koristi kvadratna matrica. Svaka ivica (grana)
se pretraµzuje najviše dva puta. Algoritam ima prednosti ako je šema "rijetka" (engl.
sparse). Putanja koja se formira zove se stablo. Ako je graf pritom povezan to stablo se
zove minimalno razapinjuće stablo.
Drugi algoritam koristi strukturu koja se zove stek (engl. stack). Realizuje se operacijama
"stavi" (engl. push), koja dodaje element na kraj niza (lanca koji se pretraµzuje) i "uzmi"
(engl. pop), koji uklanja element sa kraja. Ovo je struktura podataka koja se zove LIFO
(Last-In-First-Out). Postoji i struktura FIFO (First-In-First-Out), koja se ne koristi u
ove svrhe. Sloµzenost ovog algoritma je O (n + m).
Primjena druge verzije ovog algoritma nije odmah oµcigledna. Me†utim, moµze se razmišl-
jati kao o skupu µcvorova od kojih svaki ima nekoliko konekcija na sebe tako da svaki tako
stvoren lanac ima odre†ena svojstva "separabilnosti".
Primjer. Neka je data mreµza raµcunara. Potrebno je naći sve kompjutere koji, ako se
uklone, µcine da se mreµza raspada.
Duµzina najkraćeg puta od x do y se oznaµcava sa d (x; y). Sada se problem najkraćeg puta
lako formuliše.
Problem 9.1 Za dati teµzinski graf G i dva µcvora x i y na´ci d (x; y). Pretpostavka je
w (i; j) > 0.
Problem najkraćeg puta iz jednog µcvora (single source shortest path) se de…niše na sljedeći
naµcin. Dat je usmjeren graf sa nenegativnim teµzinama ivica G = (V ; E) i izdvojenim
poµcetnim µcvorom s 2 V . Problem je odrediti distancu poµcetnog µcvora do svakog µcvora u
grafu.
Moguće je imati grafove sa negativnim teµzinama ivica ali kako bi najkraći putevi bili
dobro de…nisani potrebno je dodati zahtjev da uopšte nema ciklusa µcija je ukupna teµzina
negativna (inaµce bi se mogao napraviti beskonaµcno kratak put kretanjem zauvijek u tom
ciklusu). Ovdje se naglašava posao raµcunanja minimalne distance od poµcetnog µcvora
do svakog µcvora. Raµcunanje stvarne duµzine je dosta lagano proširenje problema. Za
svaki µcvor se formira pointer pred (v) koji ukazuje na prethodnika. Slijedeći pointere
prethodnika unazad od bilo kojeg µcvora konstruiše se reverzna slika najkraćeg puta do v.
Proces kojim se vrši aµzuriranje procjene se zove relaksacija. Intuitivno gledano, ako nije
postignuta optimalna vrijednost ona je bliµza ka optimumu. Ako se otkrije put od s do v
koji je kraći od d [v] tada se vrši aµzuriranje te vrijednosti. Ovaj metod je zajedniµcki za
veliki broj algoritama optimalizacije.
Posmatra se ivica od µcvora u do µcvora v µcija je teµzina w (u; v). Pretpostavka je da postoje
procjene za d [u] i d [v]. Poznato je da postoji put od s do u sa teµzinom d [u]. Ako se uzme
ta putanja i ako se slijedi ivica (u; v) dobija se putanja do v duµzine d [u] + w (u; v). Ako
je ta putanja bolja od postojećeg puta do v duµzine d [v] tada se d [v] aµzurira na vrijednost
d [u] + w (u; v). Potrebno je zapamtiti da najkraći put do v prolazi kroz u što se µcini tako
da se aµzurira pointer prethodnika za v.
Treba primijetiti da kad god se d [v] postavi na konaµcnu vrijednost uvijek postoji trag
o putanji te duµzine. Stoga je d [v] (s; v). Ako je d [v] = (s; v) tada naknadne
relaksacije ne mogu promijeniti tu vrijednost.
Nije teško vidjeti da ako se relaksacija provedi sa svim ivicama grafa, vrijednosti d [v]
obavezno konvergiraju konaµcnoj stvarnoj vrijednosti iz s. Cilj svakog dobrog algoritma
nalaµzenja najkraćeg puta je da se aµzuriranja obavljaju na naµcin da je konvergencija što
je moguće brµza. Posebno, najbolji naµcin bi bio da se operacije relaksacije poredaju na
naµcin da se za svaku ivicu provode taµcno jednom. Taµcno ovo radi Dijkstra algoritam.
Skup S moµze biti implementiran korištenjem niza boja koje su dodijeljene µcvorovima.
Inicijalno su svi µcvorovi bijeli a boja [s] = crna kako bi se naznaµcilo da v 2 S.
Minimalno razapinjuće stablo je ono koje ima minimalnu teµzinu. Ovo stablo ne mora biti
jedinstveno. Ako sve ivice imaju razliµcitu teµzinu tada su minimalna razapinjuća stabla
razliµcita. Ovo još nije dokazano već je µcinjenica koja se koristi.
Slika prikazuje tri razapinjuća stabla za isti graf. U sredini i desno su su dva minimalna
razapinjuća stabla.
Neka je G = (V; E) neusmjeren povezan graf µcije ivice imaju numeriµcke vrijednosti teµzine
(pozitivne, negativne ili nula). Intuicija u pozadini pohlepnih MST algoritama je jednos-
tavna : odrµzava se podskup ivica A koji je inicijalno prazan i dodaje se jedna po jedna
ivica sve dok A ne postane MST. Kaµze se da je S E most (prelaz) ako je podskup ivica
nekog MST (ne moµze se reći MST jer nije neophodno i jedinstven). Kaµze se da je ivica
(u; v) 2 EnA sigurna ako je A [ (fu; vg) prelaz. Drugim rijeµcima, izbor (u; v) je siguran
izbor tako da A još uvijek moµze formirati MST. Ako je A prelaz ne moµze sadrµzavati
ciklus. Izvorni (generiµcki pohlepni algoritam radi tako da dodaje sigurne ivice na tekuće
razapinjuće stablo. Potrebno je voditi raµcuna da je prelaznost svojstvo podskupa ivica a
sigurnost svojstvo pojedine ivice.
Neka je S podskup µcvorova S V . Podjela (cut) (S; V nS) je particija µcvorova u dva
disjunktna podskupa. Ivica (u; v) prelazi podjelu ako je jedna njena krajnja taµcka u S a
druga u V nS. Za dati podskup ivica A se kaµze da podjela poštuje A ako ne postoje ivice
u A koje prelaze podjelu. Nije teško vidjeti zašto je poštovanje podjele vaµzno za ovaj
problem. Ako je formiran djelimiµcni MST i ako se µzeli znati koje ivice koje mogu biti
dodate i koje ne formiraju ciklus u tekućem MST, bilo koja ivica koja prelazi poštujuću
podjelu je mogući kandidat.
Ivica u E je lagana ivica koja prelazi podjelu ako ima minimalnu duµzinu od svih ivica
koje prelaze podjelu. Lagana ivica moµze ne biti jedinstvena. Prema intuiciji, s obzirom
da sve ivice koje prelaze poštujuću podjelu ne formiraju ciklus tada je lagana ivica koja
prelazi podjelu prirodan izbor.
Lema 9.2 (MST) Neka je G = (V; E) povezan neusmjereni graf sa ivicama realnih vri-
jednosti. Neka je A prelazni podskup od E (odnosno podskup nekog MST) i neka je
(S; V nS) bilo koja podjela koja poštuje A i neka je (u; v) lagana ivica koja prelazi podjelu.
Tada je (u; v) sigurna za A.
Ova strategija vodi ka korektnom algoritmu. Uzmimo npr. ivicu (u; v) koja se treba
dodati i pretpostavimo da ta ivica ne formira ciklus u A. Neka je A0 stablo u šumi A
koje sadrµzi µcvor u. Posmatra se Podjela (A0 ; V nA0 ). Svaka ivica koja prelazi podjelu nije
u A tako da ta podjela poštuje A i (u; v) je lagana ivica preko podjele (jer su sve laganije
ivice iskorištene ranije u algoritmu). Stoga je (u; v) sigurna ivica.
Teški dio algoritma je kako e…kasno detektovati da li dodavanje ivice kreira ciklus u A.
Moµze se provesti pretraµzivanje podgrafa koji je kreiran ivicama iz skupa A ali to uzima
jako puno vremena. Potreban je brz i pouzdan test koji nam daje odgovor na pitanje
da li je u ili v u istom stablu A. Ovo se moµze uraditi putem strukture podataka koja
se zove Unija-Traµzenje (Union-Find) dva disjunktna skupa. Ova struktura podrµzava tri
operacije:
Svaka od ovih operacija se izvršava u O (log n) vremenu na skupu veliµcine n. Ova struk-
tura je zanimljiva jer se niz od n operacija izvršava mnogo brµze od O (n log n).
Analiza. Koliko dugo traje Kruskalov algoritam ? Kao i obiµcno, neka je V broj µcvorova
i E broj ivica. S obzirom da je graf povezan moµze se uzeti da je E V 1. Za sortiranje
ivica potrebno je (E log E). Petlja se ponavlja E puta a svaka iteracija ukljuµcuje
konstantan broj pristupa Union-Find strukturi na skupu od V stavki. Stoga, za svaki
pristup treba (V ) vremena a skupa (E log V ). Stoga je ukupno vrijeme izvršenja
jednako njihovoj sumu koja je ((V + E) log V ). S obzirom da V u asimptotskom smislu
nije veće od E slijedi da je vrijeme izvršenja (E log V ).
Kruskalov algoritam radi tako da sortira ivice i umeće ih jednu po jednu u razapinjuće
stablo vodeći raµcuna da se nikada ne formira ciklus. Intuitivno gledano, Kruskalov algo-
ritam radi tako da spaja dva stabla ili ih razdvaja sve dok se sve ivice ne na†u u istom
stablu.
Za razliku od njega, Prim-ov algoritam gradi stablo dodavanjem po jednog lista na tekuće
stablo. Startuje se sa korijenskim µcvorom r koji moµze biti bilo koji. U bilo koje vrijeme
podskup ivica A formira jedno stablo (u Kruskalovom algoritmu se formira šuma). Traµzi
se dodavanje µcvora kao lista na stablo. Proces je ilustrovan na narednoj slici.
Ako se posmatra skup µcvorova S koji je dio stabla i njegov komplement tada postoji
podjela grafa i tekući skup ivica A poštuje tu podjelu. MST lema kaµze da je sigurno
dodavanje lagane ivice. Na slici to je ivica teµzine 4 koja ide u µcvor u. Stoga se u dodaje u
µcvorove skupa S i dijeli izmjene. Treba primijetiti da neke ivice, koje više ne sijeku podjelu
koju su presijecale prije ovog koraka, nestaju a javljaju se nove koje nisu presijecale tu
podjelu.
Naredna slika ilustruje Prim-ov algoritam. Strelice indiciraju pointere (pokazivaµce) sljed-
nika a numeriµcka vrijednost u svakom µcvoru je vrijednost kljuµca.
Za analizu Prim-ovog algoritma raµcuna se vrijeme potrošeno na svakom µcvoru nakon što se
preuzme iz reda prioriteta (priority queue). Ova aktivnost uzima O (log V ) vremena. Za
svaku ivicu se potroši oko O (log V ) vremena kako bi se smanjio kljuµc susjednih µcvorova pa
je vrijeme O (log V + deg (u) log V ). Ostali koraci aµzuriranja se obavljaju u konstantnom
vremenu. Na osnovu ovoga je:
X X
T (V; E) = (log V + deg (u) log V ) = (1 + deg (u)) log V
u2V u2V
X
= log V (1 + deg (u)) = (log V ) (V + 2E) = ((V + E) log V )
u2V
9.5 Zadaci
Zadatak 01. Kruskalovim algoritmom naći minimalno razapinjuće stablo na sljedećem
grafu.
Table 1: Graf 02
Korak µ
Cvorovi Raspoloµzivo Uzeto
1 a (a,b), (a,e), (a,f) (a,e)
2 a, e (a,b), (a,f), (e,f), (e,i), (e,j) (e,i)
3 a, e, i (a,b), (a,f), (e,f), (e,j), (i,j) (e,j)
4 a, e, j (a,b), (a,f), (e,f), (j,f), (j,g), (j,k) (j,f)
5 a, f, j (a,b), (f,b), (f,c), (f,g), (j,g), (j,k) (j,k)
6 a, f, j, k (a,b), (f,b), (f,c), (f,g), (j,g), (k,g), (k,l) (k,l)
7 a, f, j, k, l (a,b), (f,b), (f,c), (f,g), (j,g), (k,g), (l,g), (l,h) (f,b)
8 b, f, j, k, l (b,c), (f,c), (f,g), (j,g), (k,g), (l,g), (l,h) (b,c)
9 c, f, j, k, l (c,d), (c,g), (f,g), (j,g), (k,g), (l,g), (l,h) (c,g)
10 c, g, l (c,d), (g,d), (g,h), (l,h) (c,d)
11 d, g, l (d,h), (g,h), (l,h) (l,h)
U ovom sluµcaju je dobijeno stablo identiµcno onome iz prethodnog zadatka. Ovo ne mora
uvijek biti sluµcaj.
Korak µ
Cvorovi Veze Uzeto
1 a b(10), e(2), f(8) (a,e)
2 a, e b(10), f(8), i(3), j(5) (e,i)
3 a, e, i b(10), f(8), j(5) (e,j)
4 a, e, j b(10), f(7), g(11), k(7) (f,j)
5 a, f, j b(10), c(12), g(10), k(7) (j,k)
6 a, f, k b(10), c(12), g(10), l(8) (k,l)
7 a, f, l b(10), c(12), g(10), h(13) (a,b)
8 b, f, l c(12), g(10),h(13) (f,g)
9 b, g, l c(11), d(12), h(13) (c,g)
10 c, g, l d(13), h(13) (c,d)
11 d, g, l h(13) (l,h)
Korak µ
Cvorovi Veze Uzeto
1 a b(10), d(5) (a,d)
2 a, d b(8), c(14), e(7) (d,e)
3 a, d, e b(8), c(13) (d,b)
4 b, d, e c(9) (b,c)
short int : cijeli broj koji za zapis koristi polovinu prostora od tipa int
long int : cijeli broj koji za zapis koristi dva puta više prostora od tipa int
long long int : cijeli broj koji za zapis koristi µcetiri puta više prostora od tipa int
float : realni broj u formi pokretnog zareza obiµcne taµcnosti odnosno u obliku
x = m 10t gdje je m 2 (0; 1) a t 2 Z. Dosadašnji uobiµcajeni naziv za m je do sada
bio mantisa. U cilju izbjegavanja pogrešnih terminoloških tumaµcenja prihvaćen je
termin signi…kand
double : realni broj u formi pokretnog zareza dvostruke taµcnosti tj. koristi dva
puta više prostora za signi…kand od tipa ‡oat
long double : realni broj u formi pokretnog zareza dvostruke taµcnosti tj. koristi
tri puta više prostora za signi…kand od tipa ‡oat
Ispred numeriµckih tipova se moµze dodati rijeµc unsigned kojom se oznaµcava da broj ne
moµze biti negativan. Prostor koji zauzima pojedini numeriµcki tip zavisi od raµcunara i
instalacije C++ kompajlera. Da bi se dobio taj podatak potrebno je pokrenuti sljedeći
program :
U programskom jeziku C++ tip se moµze promijeniti u toku izvršenja koraka unutar
programa. Moguće je napisati npr. x=sqrt(float(a)). Ovo znaµci da ako je broj a bio
npr. cjelobrojan tada se sa float(a) pretvara u broj u pokretnom zarezu a zatim se
izvršava naredba sqrt().
Inicijalizacija je veoma vaµzan korak jer operacija nad promjenljivom koja nije inicirana
daje potpuno neizvjestan rezultat.
Svaka promjenljiva dobija naziv koji moµze biti bilo kakva kombinacija slova, brojeva i
odre†enih znakova, jedini je uslov da prvi simbol mora biti slovo.
Programski jezik C++ pravi razliku izme†u velikih i malih slova. Tako su promjenljive
JedanBroj, jedanbroj, Jedanbroj, jedanBroj sa stanoviša C++ jezika potpuno ra-
zliµcite.
12. 02. Nizovi i matrice. Niz u C++ jeziku se deklariše imenom i dimenzijom. Tako,
deklaracije :
int a[25];
float indeksi[12];
znaµce da je deklarisan niz cijelih brojeva pod nazivom a koji ima 25 elemenata i niz realnih
brojeva pod nazivom indeksi koji ima 12 elemenata. U ovakvom naµcinu deklarisanja
mora se navesti dimenzija niza u zagradi. To znaµci da dizajner mora unaprijed znati ili
pretpostaviti najveću moguću dimenziju niza.
U C++ jeziku se koristi tzv. relativno referenciranje. U tom sistemu prvi µclan niza ima
indeks 0 a svi ostali, drugi µclan indeks 1 itd. Drugim rijeµcima, indeks svakog µclana
odgovara ’rastojanju’od prvog (nultog) µclana.
µ
Cest praktiµcni problem je kako unijeti µclanove niza, posebno kada je u pitanju veći broj.
Ovaj problem se rješava na nekoliko naµcina:
predstavlja niz koji predstavlja broj dana po mjesecima u godini. Ovakvom deklaraci-
jom se odre†uje i dimenzija niza koja nije navedena u de…niciji već program odre†uje
dimenziju nakon uµcitavanja.
U nastavku je primjer potpuno funkcionalnog programa kojim se vrši unos µclanova niza
sa proizvoljnim brojem µclanova.
U ovom sluµcaju su jasno naznaµcene grupe brojeva koje predstavljaju pojedine redove.
Ako se neki red ne deklariše stavljaju se zagrade bez sadrµzaja. Primjer je deklaracija
int a[3][4] = {{3, 4, 2, 5}, {}, {3, 1, 0, 2}};
imag = sqrt(-D)/(2*a);
cout << "Imaginarni dio jenn" << imag << endl; }
else
{
if(D==0)
{
cout << "Jednadµzba ima jednake korijenenn" << endl;
x1 = -b/(2*a);
cout << x1 << endl; }
else
{
cout<<"Jednadµzba ima realne i razliµcite korijenenn"<<endl;
x1 = (-b - sqrt(D))/(2*a);
x2 = (-b + sqrt(D))/(2*a);
cout << "Rješenje broj 1 : " << x1 << endl;
cout << "Rješenje broj 2 : " << x2 << endl; }
}
getch();
return(0);
}
{
// Deklaracija i inicijalizacija niza
int koef[]={2,-3,4,-5,6}, k;
float x, S;
cout << "Unesite broj x :";
cin >> x;
// Inicijalizacija promjenljive S
S=koef[4];
for(k=3;k>=0;k--)
{
S=S*x+koef[k]; }
cout << "Vrijednost polinoma je : " << S << endl;
system("PAUSE");
}
Raµcunanje sume
Xn
i2
S=
i=1
i+1
Raµcunanje sume:
1 1 1 1
S= + + + ::: +
sin 1 sin 1 + sin 2 sin 1 + sin 2 + sin 3 sin 1 + sin 2 + ::: + sin n
U ovom algoritmu je vršena konverzija k= jer argumenti trigonometrijskih funkcija u
C++ jeziku moraju biti izraµzeni u radijanima. Potpuno drugaµcija bi se vrijednost dobila
ako bi na tom mjestu umjesto float(k)/PI stajalo float(k/PI). U drugom sluµcaju bi
se konverzija u tip float vršila nakon izraµcunavanja koliµcnika k= . U ovoj verziji nije
korištena veliµcina ".
// De…nisanje matrica
int a[3][4]={{2,7,3,8},{-2,-1,5,4},{0,-3,7,-2}};
int b[4][2]={{1,3},{-2,-5},{8,-3},{9,4}};
int c[3][2]={{},{},{}};
// Brojaµci na uµcitavanju
int i, j, k;
// Deklaracija niza; uzeto je da je niz cjelobrojni
cout << "Najprije ćemo izlistati matrice A i Bnn" << endl;
cout << "Matrica A je : nn" << endl;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
// Ispis jednog reda; µclanovi se odvajaju znakom tab
{
cout << a[i][j] << "nt"; }
// Novi red nakon ispisanog reda
cout << "nn";
}
// Prelazak na novi red
cout << "nn" << endl;
// Saµcekaj dok se ne pritisne taster
system("PAUSE");
cout << "Matrica B je : nn" << endl;
for(i=0;i<4;i++)
{
for(j=0;j<2;j++)
// Ispis jednog reda; µclanovi se odvajaju znakom tab
{
cout << b[i][j] << "nt"; }
// Novi red nakon ispisanog reda
cout << "nn" << endl;
}
// Prelazak na novi red
cout << "nn" << endl;
// Saµcekaj dok se ne pritisne taster
system("PAUSE");
// Za svaki red matrice A...
for(i=1;i<3;i++)
{
// ...uzimamo jedan red matrice B...
for(j=1;i<2;i++)
{
// ...iniciramo sumu...
c[i][j]=0;
for(k=0;k<4;k++)
{
// Raµcunamo element c(i,j)
c[i][j]=c[i][j]+a[i][k]*b[k][j]; }
}
}
cout << "Matrica C je : nn" << endl;
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
// Ispis jednog reda; µclanovi se odvajaju znakom tab
{
cout << c[i][j] << "nt"; }
// Novi red nakon ispisanog reda
cout << "nn" << endl;
}
// Prelazak na novi red
cout << "nn" << endl;
// Saµcekamo da vidimo je li sve u redu
system("PAUSE");
}
Spremanje rezultata programa radi arhiviranja, kasnijih analiza ili obrada od strane
nekih drugih programa kao što su Excell i sliµcni
i sliµcno. Poseban problem je unos većeg broja podataka kako zbog vremena za unos tako
i zbog mogućih grešaka. Jedno od rješenja je korištenje datoteka za ulaz, me†ukorake i
izlaz.
µcitanje iz datoteka
upis u datoteku
Ako su datoteke već kreirane tada se mogu koristiti naredbe open (otvoriti) i close
(zatvoriti).
Svaka datoteka koja se koristi u radu, bilo da se u nju upisuje ili iz nje vrši µcitanje, mora
imati naziv. Na sljedećem algoritmu je primjer programa koji u datoteku kvadrati.txt
upisuje brojeve od 1 do 100 i njihove kvadrate, odvojene zarezom.
"algoritminprobenproba01.txt"
"algoritminnprobennproba01.txt"
µ
Cesta je potreba da naziv datoteke daje (upisuje) korisnik u samom programu (koji mu
postavlja "upit"). Na sljedećem algoritmu je primjer takvog pristupa.
U ovom sluµcaju ofstream kreira izlaznu datoteku µciji naziv se upisuje u promjenljivu ime
a funkcijom ime.c_str() se iz upisanog tekstualnog niza odbacuju evenutalni blankovi
sa poµcetka i kraja.
Za ulazne datoteke vrijede ista pravila kao i za izlazne osim što se umjesto naredbe
ofstream koristi ifstream a ulazni tok cin mijenja oznakom ulazne datoteke. Na
sljedećem algoritmu je primjer u kojem se elementi matrice uµcitavaju iz datoteke.
Otvaranje datoteke se vrši metodom open a zatvaranje metodom close. Druge varijante
rada sa datotekama kao ulaznim odnosno izlaznim tokovima nisu predmet daljeg rada.
Ovaj tip je veoma pogodan za neke upotrebe jer se osigurava bolji kontekst. Sa druge
strane, oµcito je, kao u ovom primjeru, da nedostaje mogućnost kontrole sadrµzaja u smislu
me†usobne veze pojedinih komponenti strukutre. Jedna od mogućnosti da se ovaj prob-
lem, makar djelimiµcno, riješi je de…nicija funkcija koje pristupaju poljima strukture na
strogo kontrolisan naµcin i koje se koriste za tu svrhu. Jedan od boljih primjera za ilus-
traciju ovih kontrola je rad sa datumima, što će biti uµcinjeno u nastavku.
Prvi tip kontrole u radu sa datumima je provjera smislenosti odnosa pojedinih elemenata.
U tu svrhu moµzemo de…nisati funkciju PostaviDatum koja postavlja elemente datuma
unutar strukture a koja moµze imati izgled dat na sljedećem algoritmu.
Osnovu objektno orijentiranog pristupa programiranju µcine klase odnosno razredi (engl.
class) koje objedinjuju grupe podataka i postupke koji se mogu primjenjivati nad njima.
Klasa se dobija tako što se unutar strukture dodaju prototipovi funkcija koje se mogu
primjenjivati nad tim podacima. Na primjer, deklaracija na sljedećem algoritmu de…niše
klasu Datum koja pored podataka dan, mjesec i godina sadrµzi i prototip funkcije Postavi,
koja će se primjenjivati nad promjenljivima tipa Datum:
Promjenljive µciji je tip klasa obiµcno se nazivaju primjerci klase, instance klase ili prosto
objekti. U tom smislu, klasa je apstrakcija koja de…niše zajedniµcka svojstva i zajedniµcke
postupke koji su svojstveni svim objektima nekog tipa.
Funkcije µciji su prototipovi navedeni unutar same klase nazivaju se funkcije µclanice klase
ili metode. Njihova namjena je da se primjenjuju nad konkretnim objektima te klase a ne
da im se kao parametri šalju objekti te klase. Ovome je prilago†ena i sintaksa pozivanja
funkcija µclanica. One se uvijek primjenjuju nad nekim konkretnim objektom korištenjem
operatora “.”(taµcka), istog operatora koji se koristi i za pristup atributima unutar klase.
Primjer pozivanja funkcije Postavi na dva konkretna objekta tipa Datum je sljedeći :
Datum d1, d2;
d1.Postavi(14,5,2001);
d2.Postavi(36,14,2012);
Drugi poziv bi trebao dati odnosno odbaciti izuzetak, s obzirom na besmislen datum.
Promjena u sintaksi upućuje i na promjenu naµcina razmišljanja. Funkciji PostaviDatum
se kao argument šalju objekti d1 i d2, dok se funkcija Postavi primjenjuje nad objektima
d1 i d2.
Prvo što se uoµcava je da se ispred imena funkcije nalazi dodatak Datum:: što treba
ukazivati na to da se radi o funkciji µclanici klase Datum. Na taj naµcin je moguće da
postoje i obiµcna funkcija i funkcija µclanica istog imena, uz dodatnu mogućnost da više
razliµcitih klasa imaju funkcije µclanice istih imena. Znak “::” (dupla dvotaµcka) spada u
operatore, i obiµcno se naziva operator razluµcivosti, vidokruga ili dosega (engl. scope oper-
ator). Unutar funkcije µclanice direktno se pristupa atributima dan, mjesec i godina bez
navo†enja na koji se konkretni objekt ovi atributi odnose. Ovakvu privilegiju, direktnog
pristupa atributima klase, imaju iskljuµcivo funkcije µclanice te klase. Funkcije µclanice
klase nikad se ne pozivaju samostalno nego se uvijek primjenjuju nad nekim konkretnim
objektom (osim kada se neka funkcija µclanica poziva iz druge funkcije µclanice iste klase),
tako da se samostalno upotrijebljeni atributi unutar funkcije µclanice zapravo odnose na
atribute onog objekta nad kojim je funkcija µclanica pozvana. Poziv d1.Postavi(14,
5, 2004) znaµci da se atributi dan, mjesec i godina unutar funkcije µclanice Postavi
odnose na odgovarajuće atribute objekta d1 tj. interpretiraju se kao d1.dan, d1.mjesec
i d1.godina.
Pristup atributu dan je moguć na dva naµcina. Jedan je eksplicitno korištenje pokazivaµca
(pointera) this. Funkcija Postavi mogla je biti napisana kao na sljedećem algoritmu.
Drugi, mnogo µcešći, naµcin je upotreba operatora razluµcivosti “::”. Notacija Datum::dan
eksplicitno naglašava da se misli na atribut dan koji pripada klasi Datum. Stoga se metoda
Postavi moµze napisati i na naµcin dat na sljedećem algoritmu.
Bitno je istaći razliku izme†u operatora “.”(taµcka) i “::”(scope). Operator “.”se uvijek
primjenjuje na neki konkretan objekt. Tako, d1.dan oznaµcava atribut dan konkretnog
objekta d1. Sa druge strane, operator “::” se primjenjuje nad samom klasom, kao
apstraktnim tipom podataka. Tako, Datum::dan oznaµcava atribut dan koji pripada klasi
Datum, bez speci…kacije na koji se konkretan objekt klase Datum taj atribut odnosi. Iz
tog razloga, ovakva upotreba atributa dan moµze imati smisla jedino unutar de…nicije neke
metode.
private i public. One se koriste iskljuµcivo unutar deklaracija klase a iza njih uvijek
slijedi znak “:” (dvotaµcka). Njima se speci…cira privatni i javni dio klase. Neka je
deklaracija klase Datum izmijenjena kao na sljedećem algoritmu.
Oµcitavanje datuma
{
mjesec = 1; godina++;
}
}
Metode iz prve kategorije samo µcitaju atribute klase, ali ih ne mijenjaju. U našem sluµcaju
to su Ocitaj, VratiDan, VratiMjesec i sliµcno. U jeziku C++ se smatra dobrom prak-
som posebno oznaµciti funkcije inspektore kljuµcnom rijeµci const. Tako oznaµcene funkcije
nazivaju se konstantne funkcije µclanice. Na taj naµcin se omogućava kompajleru prijava
greške u sluµcaju da se unutar metode za koju je poznato da treba biti inspektor pokuša
promjena vrijednosti nekog od atributa. Pomoću kljuµcne rijeµci const moguće je de…nirati
konstantne objekte, na isti naµcin kao i npr. cjelobrojne konstante.
Metode iz druge kategorije mijenjaju atribute klase nad kojom su primijenjene. U našem
sluµcaju to je metoda Postavi.
Ispis datuma kao redni broj dana u godini i godina. Naprimjer, datum 24.10.2013
se na ovaj naµcin prikazuje u obliku 297.2013.
Zadatak. Zadat je datum dd:mm:gggg, pri µcemu je gggg > 1900. Uraditi sljedeće :
Odrediti koji dan u sedmici (Ponedjeljak, ..., Nedjelja) odgovara tom datumu.
Pritom je poznato da je 01.01.1900 bio ponedjeljak
Odrediti koliko petaka ima datum 13 u godini tog datuma. Problem generalizirati
za bilo koji datum i dan u sedmici
Broj dana izme†u dva datuma. Na osnovu toga izraµcunaj svoju starost izraµzenu
brojem dana
1
Da li znate zašto je razlika baš 13 dana ?
11 NP Sloµzenost
Tokom 60-ih godina napravljeni su veliki pomaci u nalaµzenju e…kasnih rješenja za mnoge
kombinatorne probleme ali je nastala rastuća lista problema za koje se µcinilo da ne postoji
e…kasno algoritamsko rješenje. Ljudi su poµceli traµziti neku nepoznatu paradigmu koja bi
vodila ka rješenju tih problema ili dokaz da su moµzda ti problemi sami po sebi teški za
rješavanje i da ne postoje algoritamska rješenja koja rade ispod eksponencijalnog vremena.
Potreban je neki naµcin da se klasa e…kasno rješivih problema odvoji od problema koji
ne mogu biti e…kasno riješeni. To se moµze uµciniti analizom problema koji mogu biti
riješeni u polinomijalnom vremenu. Zadatak da se dokaµze da nešto ne moµze biti uµcinjeno
e…kasno mora se analizirati mnogo paµzljivije kako se ne ostavila mogućnost bilo kome
da pravila krši na neprihvatljiv naµcin i istovremeno tvrdi da postoji e…kasno rješenje ako
takvo rješenje stvarno ne postoji.
De…nicija 11.3 (Pojednostavljena de…nicija klase NP) Ako se neki problem predstaviti u
vidu najviše eksponencijalno mnogo instanci i ako za bilo koju instancu moµze biti riješen
u polinomijalnom vremenu, tada kaµzemo da problem pripada klasi N P .
Neke funkcije koje ne izgledaju kao polinomijalne (kao što je O (n log n)) su ograniµcne
odozgo polinomima (kao što je O (n2 )). Neke funkcije koje izgledaju kao polinomijalne
ustvari to nisu. Naprimjer, neka je predmet analize algoritam koji ima ulaz graf veliµcine
n i cijeli broj k koji radi u vremenu O nk . On nije polinomijalni jer je k ulazna veliµcina
takva da je korisniku omogućeno da odabere k = n što povlaµci da je vrijeme izvršenja
O (nn ) a to nije polinom po n. Vaµzno je napomenuti da eksponent mora biti konstanta
nezavisna od n.
Mnogi problemi se mogu formulisati kao problemi odluµcivanja. Naprimjer, problem na-
jmanjeg razapinjućeg stabla se moµze formulisati na sljedeći naµcin : Za dati teµzinski graf
G i cijeli broj k da li G ima razapinjuće stablo koje je najviše k ?
Ovo se moµze µciniti kao mnogo zanimljivija formulacija problema. Ovdje se ne postavlja
pitanje teµzine minimalnog razapinjućeg stabla niti za ivice stabla za koje se dostiµze ova
teµzina. Me†utim, zadatak je pokazati da odre†eni problemi ne mogu biti riješeni e…kasno.
Ako se pokaµze da jednostavni problem odluµcivanja ne moµze biti riješen e…kasno tada je
sigurno da ni mnogo generalniji problem sigurno ne moµze biti riješen e…kasno.
De…nicija 11.7 Las Vegas algoritam je vjerovatnosni algoritam koji za odre†enu vrstu
problema moµze ne dati odgovor sa vjerovatno´com 0 " < 1. Ako algoritam daje odgovor
onda je taj odgovor uvijek korektan.
Dakle, Las Vegas algoritam moµze ne vratiti odgovor ali odgovor koji daje mora biti taµcan,
za razliku od Monte Carlo algoritma koji uvijek daje odgovor ali on nije uvijek taµcan.
Prema tome, ako se za rješavanje nekog problema koristi Las Vegas algoritam onda se on
jednostavno iznova pokreće ponovo dok se ne dobije odgovor. Vjerovatnoća da algoritam
ne pruµzi odgovor za m pokušaja puta je "m . Da bi algoritam bio u stanju dati odgovor
broj pokretanja je prosjeµcno 1= (1 ").
Ovaj skup se sastoji od parova u kojem je prvi element graf G (odnosno matrica kodirana
kao string) a drugi cijeli broj kodiran kao binarni broj. Na prvi pogled moµze izgledati
µcudno da se graf de…niše kao string ali je oµcigledno da se u raµcunaru sve predstavlja u
obliku niza (string) bitova. Ako mu se prezentira string (G; k) algoritam bi trebao dati
odgovor "Da" ako (G; k) 2 L što povlaµci da G posjeduje razapinjuće stablo teµzine najviše
k i "Ne" u suprotnom sluµcaju. U prvom sluµcaju se kaµze da algoritam "prihvata" a u
suprotnom "odbacuje" ulaz.
Za bilo koji dati jezik se moµze postaviti pitanje koliko teško je utvrditi da li je dati
string u jeziku ili ne. Naprimjer, u sluµcaju MST jezika L µclanstvo se moµze lako utvrditi
u polinomijalnom vremenu. Dovoljno je graf pohraniti interno, pokrenuti Kruskalov
algoritam i vidjeti da li je dobijena optimalna teµzina najviše k ili ne.
De…nicija 11.8 (Formalna de…nicija klase NP). Ako je U skup svih mogu´cih ulaznih
vrijednosti za neki problem odluµcivanja (za koji je potrebno dati odgovor da ili ne) i
L P skup svih ulaznih vrijednosti za koje je odgovor na problem potvrdan, onda L
zovemo jezik koji odgovara problemu.
De…nicija 11.9 Neka je sa P oznaµcen skup svih jezika za koje µclanstvo moµze biti testi-
rano u polinomijalnom vremenu.
Slika ilustruje jedan od mogućih naµcina interpretacije kako bi mogao izgledati odnos
skupova P, NP, NP-teµzak, NP-kompletan. Naglašeno je "mogući odnos" jer jošnije poz-
nato da li su ove klase sloµzenosti disjunktne ili su sve rješive u polinomijalnom vremenu.
Neki od problema na slici iziskuju dublju diskusiju. Jedna od njih se odnosi na Izomor-
…zam grafova u kojem se postavlja pitanje da li su dva grafa identiµcna do nivoa imena
njihovih ivica. Poznato je da je problem NP ali nije poznato da li je u P. Drugi je QBF što
je skraćenica za Quanti…ed Boolean Formulas. U tom problemu su date bulovske formule
sa kvanti…katorima 8 i 9 i potrebno je dati odgovor na pitanje da li je formula taµcna ili
ne.
Kao primjer će biti uzet problem Hamiltonovog ciklusa. Za dati neusmjereni graf G se
postavlja pitanje da li postoji ciklus koji obilazi sve µcvorove taµcno jednom. Ovaj problem
se moµze opisati kao problem prepoznavanja jezika
µ
gdje je sa (G) oznaµcava graf kao string. Cini se da je problem Hamiltonovog ciklusa
mnogo teµzi i nije poznat algoritam u polinomijalnom vremenu koji rješava ovaj problem.
Na slici je primjer ciklusa koji je Hamiltonov i jednog koji to nije. Ako se po†e od
pretpostavke da je graf imao Hamiltonov ciklus tada bi trebao biti jednostavan zadatak
da se to potvrdi. Ako se uzme ciklus npr. hv3 ; v7 ; :::; v13 i tada bi se graf mogao ispitati
i provjeriti da li je to stvarno legalan ciklus koji obilazi sve µcvorove grafa taµcno jednom.
Stoga, iako nije poznat e…kasan naµcin da se riješi problem Hamiltonovog ciklusa postoji
veoma e…kasan naµcin veri…kacije (provjere) da li je dati graf u HC. Dati ciklus je certi…kat.
To je dio informacije koji omogućava da se veri…kuje da je dati string jezik.
Treba uoµciti da nemaju svi jezici svojstvo da ih je lako veri…cirati. Naprimjer, neka su
dati sljedeći jezici :
Neka je graf G u jeziku U HC. Koja bi informacija trebala biti data koja bi omogućila
da se veri…kuje da je G stvarno jezik ? Moµze se dati primjer jedinstvenog Hamiltonovog
ciklusa i to bi se moglo veri…cirati ali koja vrsta certi…kata je potrebna kako bi se utvrdilo
da je to jedini graf ? Moµze se uzeti drugi ciklus koji nije Hamiltonov ali to ne znaµci da
nema drugog ciklusa koji jeste Hamiltonov. Moµze se pokušati sa svim ciklusima teµzine n
ali bi to uopšte ne bi bilo e…kasno jer postoji ukupno n! ciklusa. Stoga je teško zamisliti
da se moµze dati informacija koja bi omogućila da se e…kasno uvjerimo da je dati graf u
jeziku.
11.3.1 NP klasa
Kako je reµceno, NP se de…niše kao skup svih jezika koji mogu biti veri…cirani algorit-
mom u polinomijalnom vremenu. Zašto je dat naziv NP umjesto VP ? Originalan naziv
je skraćenica od "Nedeterministiµcko Polinomijalno vrijeme". Ovo se odnosi na program
koji se izvršava na nedeterministiµckom raµcunaru koji se moµze zamisliti. U osnovi, takav
kompjuter bi mogao nedeterministiµcki pogoditi vrijednost certi…kata i zatim veri…cirati
u polinomijalnom vremenu da je string u jeziku. Ovdje je izbjegnuta de…nicija nedeter-
minizma.
NP je, kao i u sluµcaju P, skup jezika zasnovan na nekoj mjeri sloµzenosti (sloµzenost veri-
…kacije). Potrebno je uoµciti da je P N P . Drugim rijeµcima, ako se problem moµze riješiti
u polinomijalnom vremenu tada se µclanstvo sigurno moµze veri…cirati u polinomijalnom
vremenu.
Prije toga je potrebno razmotriti sljedeće pitanje. Pretpostavimo da postoje dva problema
H i U . Za H se zna (ili µcvrsto vjeruje) da je teµzak odnosno da ne moµze biti riješen u
polinomijalnom vremenu. Sa druge strane, sloµzenost za U je nede…nisana ali se sumnja
µ se dokazati da U ne moµze biti riješen u polinomijalnom vremenu.
da je jako teµzak. Zeli
µZeli se pokazati da
(H 2
= P ) ) (U 2
= P)
(U 2 P ) ) (H 2 P )
Neka je data podrutina koja moµze riješiti bilo koju instancu problema U u polinomijalnom
vremenu. Sve što je nuµzno u tom sluµcaju je pokazati da se ta rutina moµze koristiti da
se problem H moµze riješti u polinomijalnom vremenu. Time je problem H reduciran na
problem U . Vaµzno je uoµciti da je ta pretpostavljena rutina u suštini imaginacija (fantasy).
Zna se (ili se µcvrsto vjeruje) da H ne moµze biti riješen u polinomijalnom vremenu pa se
dokaz svodi na to da takva rutina ne moµze postojati što povlaµci da U ne moµze biti riješen
u polinomijalnom vremenu. Ovo je veoma vaµzno sa stanovišta razumijevanja pojma i
koncepta redukcije.
Problem tri boje : Da li svaki µcvor datog grafa G moµze biti oznaµcen jednom od tri
razliµcite boje tako da ne postoje dva susjedna µcvora koji imaju istu boju ?
Ovaj tip problema, obiµcno u oznaci 3Col, se javlja u raznim problemima particioniranja
pri µcemu je ograniµcenje da dva objekta ne mogu biti u istom setu particije. Pojam
"bojenja" dolazi od izvorne primjene u bojenju geografskih karata. Dvije drµzave koje
imaju zajedniµcku granicu bi trebale na mapi biti obojene sa dvije razliµcite boje. Dobro je
poznato da grafovi u ravni mogu biti obojene sa µcetiri boje i za ovakav problem postoji
algoritam polinomijalnog vremena. Cini µ se da je utvr†ivanje da li je to moguće za tri
boje, µcak i za grafove u ravni, teµzak problem za koji nije poznat algoritam polinomijalnog
vremena.
Na slici su dva grafa od kojih je jedan moguće obojiti na traµzeni naµcin a drugi ne.
Problem bojenja sa tri boje ima ulogu H problema za koji se sumnja da je moguće
riješiti u polinomijalnom vremenu.
Problem Clique pokrivaµca se javlja u aplikacijama klasteringa2 . Ivica izme†u dva µcvora
µ se znati da li
se stavlja ako su oni dovoljno sliµcni da budu klasterisani u istu grupu. Zeli
je moguće klasterisati sve µcvorove u k grupa.
Pretpostavimo da se µzeli riješiti CCov problem ali nakon uzaludnih i besplodnih napora ne
moµze se naći algoritam polinomijalnog vremena. Kako se moµze dokazati da nije izvjesno
da CCov nema rješenje u polinomijalnom vremenu ? Poznato je da je 3Col NP kompletan
problem pa struµcnjaci vjeruju da 3Col 2 = P . Osjeća se da postoji neka veza izme†u ova
µ se dati odgovor na pitanje da li vrijedi:
dva problema. Zeli
(3Col 2
= P ) ) (CCov 2
= P)
(CCov 2 P ) ) (3Col 2 P )
Da bi se ovo dokazalo potrebno je pretpostaviti da postoji pristup podrutini CCov (G; k).
Za dati graf i cijeli broj k ova podrutina vraća odgovor "istina" ako G ima clique veliµcine
k i "neistina" u suprotnom, uz µcinjenicu da ta rutina radi u polinomijalnom vremenu.
Kako se sada ovakva rutina koristi za rješenje dobro poznatog teškog 3Col problema ?
Treba se napisati rutina koja radi u polinomijalnom vremenu za 3Col i koja moµze zvati
rutinu CCov (G; k) za bilo koji graf i bilo koji cijeli k.
2
Klastering je grupisanje po nekoj osobini sliµcnosti. Pritom se "sliµcnost" de…niše u kontekstu problema
(Euklidska duµzina, prosjek, ...)
Oba problema ukljuµcuju particioniranje µcvorova u grupe. Jedina razlika je što je u jednom
problemu broj klikova dat kao dio ulaza a u drugom je broj klasa …ksiran na 3. Da bi dva
µcvora u problemu clique bila u istoj grupi moraju biti susjedni. U problemu bojenja dva
µcvora ne moraju biti susjedni da bi bili u istoj grupi. Na neki naµcin su problemi gotovo
jednaki ali zahtjev da budu susjedni je obratan.
Tvrdimo da se problem tri boje moµze reducirati na problem klika na sljedeći naµcin. Za
dati graf G za koji se µzeli utvrditi mogućnost bojenja sa tri boje rezultat je par G; 3
gdje G oznaµcava komplement od G. To znaµci da je G graf na istim µcvorovima ali je (u; v)
ivica u G ako i samo ako nije ivica u G. Tada se par G; 3 moµze koristiti kao ulaz u
rutinu za klik.
Tvrdnja 11.1 Graf G je mogu´ce obojiti sa tri boje ako i samo ako komplement G ima
pokrivanje klikom veliµcine 3. Drugim rijeµcima
G 2 3Col , G; 3 2 CCov
Dokaz: ()) Ako je G moguće obojiti sa 3 boje neka su V1 ; V2 ; V3 tri klase za svaku od
boja. Tvrdi se da je to klik pokrivaµc veliµcine 3 za G s obzirom da ako su u i v razliµciti
µcvorovi u Vi tada fu; vg 2 = E (G) s obzirom da susjedni µcvorovi ne mogu biti iste boje.
Ovo povlaµci da fu; vg 2 E G . Stoga svaki par razliµcitih µcvorova u Vi µcini susjedne u G.
(() Neka je pretpostavka da G ima klik pokrivaµc veliµcine 3 oznaµcen sa V1 ; V2 ; V3 . Za
i 2 f1; 2; 3g se daje µcvorovima u Vi boja i. Smatra se da je to legalno bojenje za G s
obzirom da ako su razliµciti µcvorovi u i v u Vi tada slijedi da je fu; vg 2 E (G) s obzirom
da su zajedniµckom kliku. Ovo povlaµci da fu; vg 2 = E G . Stoga dva µcvora iste boje nisu
susjedna.
Naµcin na koji se ovo koristi NP kompletnost je taµcno obrnut. Obiµcno postoji jak dokaz
da L1 nije rješiv u polinomijalnom vremenu pa je redukcija efektivno ekvivalentna kao
da se kaµze "S obzirom da za L1 nije izvjesno da je rješiv u polinomijalnom vremenu tada
ni za L2 nije izvjesno da je rješiv u polinomijalnom vremenu". Stoga je ovo naµcin kako
redukcije polinomijalnog vremena mogu biti korištene da se pokaµze da su problemi teški
onoliko koliko su teški poznati problemi.
Razlog je u tome što ako su dvije funkcije f (x) i g (x) izraµcunljive u polinomijalnom
vremenu tada je i njihova kompozicija f (g (x)) izraµcunljiva u polinomijalnom vremenu.
Treba obratiti paµznju da se u nekim sluµcajevima termin "redukcija" mijenja terminom
"transformacija". Razlika u terminološkom smislu moµzda nije velika ali treba voditi
raµcuna o tome.
11.4 NP kompletnost
Skup NP kompletnih problema su svi problemi u klasi sloµzenosti NP za koje je poznato
da ako je jedan rješiv u polinomijalnom vremenu tada to vrijedi za sve njih i obratno, ako
jedan od njih nije rješiv u polinomijalnom vremenu tada nijedan od njih nije rješiv na
taj naµcin. Ovo se matematiµcki formalizuje korištenjem oznaka redukcija polinomijalnog
vremena.
L0 P L; 8L0 2 N P
L 2 NP
L je NP-teµzak
L 2 NP
µ
Cinjenica da su svi L00 2 N P reducibilni na L0 (s obzirom da je L0 NP kompletan pa time
i NP teµzak) i stoga, zbog tranzitivnosti je L00 reducibilan na L povlaµci da je L NP teµzak.
Rješenje svakog zadatka treba imati sljedeće elemente : Matematiµcka ili logiµcka analiza
problema, Dijagram toka, Pseudokod, Procjenu sloµzenosti algoritma, Program u odabra-
nom programskom jeziku ili programskom paketu.
12.2 Zadaci
Zad. 12.1 Na šahovsku tablu n n postaviti n 15 dama na naµcin da nikoje dvije nisu
u istom redu ili dijagonali. Napraviti algoritam koji generiše sve kombinacije poloµzaja n
dama.
Zad. 12.2 Dato je 50 brojeva koji odre†uju 25 intervala na brojnoj osi. Dati odgovore
na sljede´ca pitanja:
Primarno praviti algoritam pod taµckom 1. Pokušati napraviti verziju jedinstvenog algo-
ritma kojim se rješavaju obje taµcke.
Zad. 12.3 Dato je 10 tegova teµzina a1 ; a2 ; :::; a10 . Neka je ck broj naµcina na koji se moµze
sastaviti teµzina k tj. sva rješenja jednadµzbe:
a1 x1 + a2 x2 + ::: + a10 x10 = k
gdje je xi 2 f0; 1g, i = 1; :::; 10. Generisati sve ck za dato k.
Zad. 12.4 Date su novµcanice nominalne vrijednosti 10, 20, 50 i 100 NJ. Kako isplatiti
iznos od n NJ ako se svaki apoen moµze javiti najviše k puta i ako je m najve´ci ukupan broj
svih apoena. Problem je nastao iz potrebe da se na novµcanim automatima odredi koncept
izdavanja novµcanica kojim se osigurava ravnomjerno trošenje apoena svih, pri µcemu je
mogu´ce isplatiti bilo koji cjelobrojni iznos. U cilju lakšeg rješavanja, najprije postaviti
neku …ksnu granicu, npr. 500 i na tom sluµcaju dedukcijom odrediti generalni koncept.
Poµcetna varijanta problema je da se odabere jedan broj apoena (npr. 1; 2; 5) i na manjem
broju sluµcajeva razradi koncept rješenja. Zadatak se moµze proširiti tako da se u obzir
uzimaju apoeni od 1, 2 i 5 NJ.
Taµcnost " se zadaje unaprijed. Metoda polovljenja intervala se sastoji u tome da se ispita
vrijednost funkcije u krajnjim taµckama intervala; ako su znaci funkcije u tim taµckama
razliµciti uzima se sredina intervala; rad se nastavlja na onoj polovini intervala za koju
vrijedi da su znaci funkcije u krajevima razliµciti.
Zad. 12.7 Dat je polinom Pn (x) stepena n. Generisati P 0 (x) i izraµcunati vrijednosti
P 0 (1), P 0 (2), P 0 (3).
Zad. 12.8 Dat je polinom Pn (x) stepena n. Generisati polinom P (x + 1) P (x). Koji
je stepen te razlike ?
Zad. 12.9 Dat je polinom P (x) stepena n. Na´ci izvod reda k ovog polinoma. Nuµzno je
teorijski razraditi izgled k-tog izvoda polinoma stepena n.
Zad. 12.10 Napraviti algoritam za generisanje niza fri g, i = 1; :::; n, sluµcajnih brojeva
na sljede´ci naµcin : zadaju se brojevi a, c, s0 i m od kojih je m najve´ci; generišu se nizovi
brojeva fsi g i fri g na sljede´ci naµcin :
Zad. 12.12 Dati su prirodan broj n i realni brojevi a, b, c, d i q (c < d). Neka je:
x0 = a; x k = q xk 1 + b; k = 1; 2; :::
Zad. 12.22 Data su 4 para brojeva (x1 ; y1 ), (x2 ; y2 ), (x3 ; y3 ), (x4 ; y4 ). Prva dva para
odre†uju gornje lijevo i donje desno tjeme prvog pravougaonika a druga dva para iste
elemente drugog pravougaonika. Dati odgovor na pitanje : Da li je jedan od pravougaonika
sadrµzan u drugome ? Ako jeste odrediti površinu izme†u dva pravougaonika. Ako se sijeku
odrediti površinu presjeka. Smatra se da su strane pravougaonika paralelne koordinatnim
osama.
Zad. 12.24 Izraµcunati, sa datim nivoom taµcnosti " > 0, beskonaµcnu sumu:
X
1
( 1)i+1
i=1
i (i + 1) (i + 2)
Zad. 12.25 Element matrice je ’sjedlasta taµcka’ ako je najve´ci u vrsti i najmanji u
koloni. Za datu matricu m n odrediti sve sjedlaste taµcke. Rezultat trebaju biti indeksi i
vrijednosti sjedlastih taµcaka. Ovaj postupak je vaµzan dio nekih metoda teorije igara.
Pn (x) = a0 + a1 x + ::: + an 1 xn 1
+ an x n
Zad. 12.27 Dati su brojevi fxk g, k = 1; 2; :::; 3n, n 2 N. Niz fxk g odre†uje n kvadrata
u ravni za koje su (x3k 2 ; x3k 1 ) koordinate središta a x3k duµzina stranice. Dati odgovor
na pitanje: da li postoje taµcke koje pripadaju svim kvadratima ?
Prvi od brojeva:
1 1 1
1; 1 + ; 1 + + ; :::
2 2 3
koji je ve´ci od a.
Najmanje n za koje vrijedi da je:
1 1 1
1+ + + ::: + > a
2 3 n
Zad. 12.29 Dat je prirodan broj n. Napraviti algoritam koji raµcuna sumu:
Xn
( 1)k(k 1)=2
S=
k=1
k!
Zad. 12.31 Dat je prirodan broj n. Ako je paran podijelimo ga sa 2; ako je neparan
pomnoµzimo ga sa 3 i dodamo 1. Postupak se zaustavlja ako se dobije 1. Provjeriti da
li se opisani postupak završava za m koraka, gdje je m unaprijed zadati prirodan broj.
Problem je poznat kao Collatz-ova konjuktura. Nije poznato da li se postupak završava za
proizvoljno n 2 N. U zadatku se traµzi odgovor na pitanje : da li je broj 1 dostignut nakon
m koraka ?
Zad. 12.32 Dati su realni brojevi a; b; " (a > b > 0, " > 0). Nizovi x1 ; x2 ; ::: i y1 ; y2 ; :::
su formirani po pravilu:
x1 = a; y1 = b
1 p
xk = (xk 1 + yk 1 ) ; yk = xk 1 yk 1
2
Na´ci prvo xn takvo da je jxn yn j < ".
Zad. 12.33 Dat je prirodni broj n i parovi realnih brojeva ( i ; li ), i = 1; :::; n, koji pred-
stavljaju ugao i duµzinu linija, pri µcemu je kraj linije lk ujedno poµcetak linije lk+1 . Na´ci
koordinate kraja izlomljene linije l1 ; :::; ln . Poµcetak linije moµze biti u: a) koordinatnom
poµcetku; b) odabanoj taµcki (x0 ; y0 )
Zad. 12.34 Za zadati prirodan broj n dati odgovor na pitanje : Da li se n! moµze napisati
kao proizvod 3 uzastopna broja ? Primjer takvog broja je 5! = 4 5 6. U ovom zadatku
je veoma vaµzno odrediti granice za pretraµzivanje u cilju smanjenja vremena rada. Osim
toga, potrebno je koristiti svojstva koja ima proizvod tri uzastopna broja. Algoritam bi
trebao dati kao izlaz brojeve koji zadovoljavaju ovaj uslov. S obzirom na brz rast funkcije
n! mogu´ce je postaviti najve´ci broj za koji se µzeli rezultat.
Zad. 12.35 U ravni je zadato n taµcaka pomo´cu matrice [xij ]n 2 tako da su xi1 i xi2
koordinate taµcke Ti . Taµcke su sastavljene duµzima. Napraviti algoritam koji nalazi duµzinu
najduµze duµzi. Potrebno je, primarno, saµciniti koncept pretraµzivanja kojim se osigurava
da su ispitane sve mogu´ce duµzi. Na svakom koraku na kojem se na†e duµz koja je duµza od
prethodno najduµze pamte se koordinate i dobijena duµzina.
Zadatak se posebno rješava za oba sluµcaja. Obratiti paµznju na "rubne" elemente matrice.
Zad. 12.37 Data je realna matrica reda 9. Izraµcunati sumu elemenata glavne dijagonale
i elemenata iznad nje koji su ve´ci od svih elemenata ispod dijagonale. Zadatak se moµze
generalizirati za matricu proizvoljnog reda n, a rješava se u dvije etape.
Zad. 12.38 Dati su prirodni brojevi m i n. Izraµcunati:
m! + n!
K=
(m + n)!
Algoritam treba biti primjenljiv za svaku od pretpostavki m < n, m = n ili m > n.
Zad. 12.39 Na´ci sumu kvadrata elemenata matrice A = [aij ]10 10 za koje vaµzi:
ai + ai;j
+ ai+1;j + ai;j+1
1;j 1
aij
4
Zadatak je mogu´ce generalizirati za matricu proizvoljnih dimenzija m n. Obratiti paµznju
na "rubove" matrice.
Zad. 12.40 Na´ci prirodni broj n (1 n 1000) sa najve´cim zbirom svojih djelilaca.
Primarni zadatak je napraviti postupak odre†ivanja svih djelilaca broja n. Potrebno je
odgovoriti na dodatno pitanje : da li i na koji naµcin izmjena gornje granice (1000) ima
ili moµze imati uticaj na duµzinu odnosno sloµzenost algoritma.
Zad. 12.41 Dat je prirodan broj n. Izraµcunati:
1 1 1
S= 1+ 1+ ::: 1 +
12 22 n2
r q
p
S = 2 + 2 + ::: + 2
| {z }
n korijena
cos 1 cos 1 + cos 2 cos 1 + cos 2 + cos 3 cos 1 + cos 2 + ::: + cos n
S= + + + ::: +
sin 1 sin 1 + sin 2 sin 1 + sin 2 + sin 3 sin 1 + sin 2 + ::: + sin n
v s
u r
u q p
t
S = 3 + 6 + 9 + ::: + 3 (n 1) + 3n
X
n
1 X
n
1 Xn
( 1)k+1
S= S= S=
k=1
k k=1
(1 + 2k)2 k=1
(k + 1) k
Xn
1 X
n
( 1)k Xn
( 1)k (k + 1)
S= S= S=
k=1
k5 k=1
(2k + 1) k k=1
k!
Zad. 12.45 Dati su pozitivni realni brojevi x; a; ". Na´ci prvi n za koji vrijedi nejednakost
yi2 yi2 1 < " u nizu y1 ; y2 ; ::: koji je formiran po pravilu:
1 x
y0 = a; yk = yi 1 +
2 yi 1
Zad. 12.46 Za dati realni broj a na´ci prvi µclan xn za koji vrijedi (5a=4) jxn+1 xn j <
10 6 . Za dobijenu vrijednost xn na´ci razliku a x5n ako je niz formiran na sljede´ci naµcin:
8
>
> min f2a; 0:95g a 1
< a 4 a
x0 = 1 < a < 25 ; x n = xn 1 + 4 ; n = 1; 2; :::
> 5
a 5 5xn 1
>
: inaµce
25
Zad. 12.47 Dati su prirodan broj n i realan broj a > 0. Na´ci prvu vrijednost xn za koju
je xkn a < 10 4 za niz x0 ; x1 ; x2 ; ::: koji je formiran po pravilu:
k 1 a
x0 = a; xk = xi 1 +
k xki 11
p
Niz fxi g, i 2 N, konvergira ka k
a.
5
Zad. 12.48 Na´ci prvi µclan xn za koji vrijedi jxn xn 1 j < 10 ako je:
2 x3k 1
x0 = 1; xk =
5
Zad. 12.49 Za dati realni broj " > 0 na´ci prvi µclan yn za kojeg vrijedi yn yn 1 < " ako
je:
yk 1 + 1
y0 = 0; yk =
yk 1 + 2
2 3
Zad. 12.50 Za dati realni broj x i prirodni broj n izraµcunati : a) xn =2n ; b) xn =3n .
Zad. 12.51 Izraµcunati beskonaµcne sume sa datim nivoom taµcnosti " > 0. Smatrati da
je potrebna taµcnost dostignuta ako se suma na nekom koraku razlikuje za manje od " od
prethodne sume.
X1
1 X1
( 1)i X
1
1
i=1
i2 i=1
i! i=1
4i + 5i+2
X
1
1 X1
( 2)i
i=1
i (i + 1) i=1
i!
n n! n n 1 n k+1
= = :::
k k! (n k)! 1 2 k
X
100 X
50
1 X
100 X
100
j i+1 X
n
kk
i=1 j=1
i + j2 i=1 j=1
i+j k=1
X
100 X
i
1 X
n
1
2j + i k=1
(k 2 )!
i=1 j=1
X
100 X
60
X
n X
n
sin (i3 + j 4 ) k (k + 1) :: k 2
( 1)k (2k 2 + 1)!
i=1 j=1 k=1 k=1
Zad. 12.55 Data je cjelobrojna matrica [aij ];j=1;;n . Izraµcunati b1 ; b2 ; :::; bn gdje je:
X
n X
n
bi = a2ij bi = jaji j
j=1 j=1
X
n
bi = ( 1)i+j aij Y
n
bi = aij , gdje je 1 < aji n
j=1
j=1
Y
n
bi = aij bi = max aij ; bi = min aji
j=1 1 j n 1 j n
a0 = 1; ak = kak 1 + 1=k; k = 1; 2; ; ;
v1 = v2 = 0; v3 = 1:5
i+1
vi = 2 vi 1 vi 2 vi 3
i +1
Zad. 12.58 Za date realne brojeve q; r; c; d; b i prirodni broj n izraµcunati xn ako je:
x0 = c; x1 = d
xk = q xk 1 + r xk 2 + b; k = 1; 2; ::
u1 = u2 = 0; v 1 = v2 = 1
ui 1 ui 2 vi 1 vi 2
ui =
1 + u2i 1 + vi2 1
ui 1 v i1
vi = ; i = 3; 4; :::
jui 2 + vi 1 j + 2
Zad. 12.60 Na´ci proizvod a0 a1 ::: a14 ako je:
a0 = a1 = 1
ai 1
ai = ai 2 + ; i = 2; 3; :::
2i 1
X
n
Zad. 12.61 Za dati prirodni broj n na´ci sumu ak bk ako je:
k=1
a1 = b 1 = 1
1 p 1p
ak = bk 1 + ak 1
2 2
bk = 2a2k 1 + bk 1 ; k = 2; 3; :::
X
n
xi
Zad. 12.62 Za dati prirodni broj n na´ci sumu ako je:
i=1
1 + jyi j
x1 = y1 = 1; xi = 0:3 xi 1
yi = xi 1 + yi 1 ; i = 2; 3; :::
X
n
2k
Zad. 12.63 Za dati prirodan broj n na´ci sumu ako je:
k=1
(1 + a2k + b2k ) k!
a1 = b1 = 1; ak = 3bk 1 + 2ak 1
bk = 2ak 1 + bk 1 ; k = 2; 3; :::
X
n
ak b k
Zad. 12.64 Za date realne brojeve u; v i prirodni broj n na´ci sumu ako je:
k=1
(k + 1)!
a1 = u; b1 = v; ak = 2bk 1 + ak 1
bk = 2a2k 1 + bk 1 ; k = 2; 3; :::
X
100
xi
Zad. 12.65 Na´ci sumu ako je:
i=1
2j
x1 = x2 = x3 = 1
xi = xi 1 + xi 3 ; i = 4; 5; :::
Zad. 12.66 Dat je cijeli broj m > 1. Na´ci najve´ci cijeli broj k za koji je 4k < m.
Zad. 12.67 Dat je prirodni broj n. Na´ci najmanji broj oblika 2r koji prelazi n.
1 2 + 2 3 4 + ::: + n (n + 1) ::: 2n
(2t)n [n=2]
Zad. 12.71 Za dati prirodni broj n i realni broj t izraµcunati .
n!! 2
Zad. 12.72 Niz Fibonaµcijevih brojeva u0 ; u1 ; u2 ; ::: se formira po pravilu:
u0 = 0; u1 = 1; Fn = Fn 1 + Fn 2
Zad. 12.73 Dati su pozitivni cijeli brojevi m; n. Izraµcunati A (n; m) gdje je:
82 3
< m+1 n=0
A (n; m) = 4 A (n 1; 1) n 6= 0; m = 05
:
A (n 1; A (n; m 1)) n > 0:m > 0
H0 (x) = 1; H1 (x) = x
Hk (x) = xHk 1 (x) (k 2) Hk 2 (x)
N ZD (n1 ; n2 ; :::; nm )
korištenjem relacije:
i algoritma Euklida.
Zad. 12.78 Za dati prirodni broj n 99 provjeriti da li je n2 jednak kubu sume svojih
cifara.
Zad. 12.79 Za dati prirodni broj n 1000 provjeriti koliko ima cifara u dekadnom
zapisu, kolika je suma cifara, koja je cifra posljednja.
Zad. 12.80 Satna kazaljka obrazuje ugao ' sa duµzi koja prolazi kroz centar i taµcku koja
oznaµcava 12 sati. Izraµcunati ugao koji obrazuje minutna kazaljka i vrijeme koje pokazuju
te kazaljke (sa cijelim brojem minuta).
Zad. 12.81 Dati su prirodni brojevi m i n. Na´ci sve prirodne brojeve manje od n za koje
je kvadrat sume njegovih cifara jednak m.
Zad. 12.82 Prona´ci sve sretne šestocifrene brojeve. Za broj se kaµze da je sretan ako je
suma njegove prve tri cifre jednaka sumi druge dvije cifre.
Zad. 12.83 Formirati kvadratnu matricu reda n µciji su elementi brojevi 1; 2; :::; n2 ras-
pore†eni spiralno, poµcev od elementa a11 : a) u smjeru kazaljke na satu; b) u smjeru
obratno kazaljci na satu.
Zad. 12.84 U datoj kvadratnoj matrici reda n na´ci sumu elemenata reda u kojoj je naj-
manji element (po apsolutnoj vrijednosti). Pretpostavka je da je takav element jedinstven.
Zad. 12.85 Data je matrica n m u kojoj postoje taµcno dva jednaka elementa. Na´ci
indekse tih elemenata.
Zad. 12.86 Dato je 15 trojki brojeva (xi ; yi ; ri ) u kojima je (xi ; yi ) centar a ri radijus
kruga. Dati odgovor na pitanje : da li postoje taµcke koje pripadaju svim krugovima ?
Zad. 12.87 Dat je prirodan broj n. Na´ci sve prirodne brojeve od 1 do n za koje zapis
odgovara posljednjim ciframa njihovih kvadrata.
Zad. 12.88 Data je realna kvadratna matrica reda n. Putem dopustivih transformacija
napraviti da element najve´ci po apsolutnoj vrijednosti bude u gornjem lijevom uglu (pozi-
cija a11 ). Dopustiva transformacija matrice je zamjena dvije kolone ili dva reda.
Zad. 12.89 Data je realna kvadratna matrica reda n. Formirati niz fak g, k = 1; ; n, po
sljede´cem pravilu:
ako je dijagonalni element i-tog reda negativan tada je ai jednak sumi elemenata
i-tog reda
ako je dijagonalni element i-tog reda nenegativan (pozitivan ili nula) ai je suma
posljednjih elemenata i-tog reda koji poµcinju nenegativnim elementom
i 1 (i 1)3
ai = + sin ; i = 1; 2; 3; :::
i+1 i+1
Za dati prirodni broj n na´ci sve pozitivne brojeve ai , i = 1; 2; :::, i najmanji od svih
pozitivnih.
Zad. 12.92 Prona´ci sve µcetvorocifrene brojeve u µcijem zapisu nema jednakih cifara.
Zad. 12.94 Na šahovskoj tabli su bijeli kralj, crni kralj, crni skakaµc i crni top. Odrediti
da li je pozicija mat, pat ili regularna pozicija.
Zad. 12.95 Dat je broj g koji oznaµcava godinu (µcetvorocifreni broj). Prona´ci koliko puta
u toku godine je petak 13.
n = ds (s + 1)! + ds 1 s! + ::: + d1 2! + d0
Zad. 12.99 Napraviti algoritam koji rijeµcima ispisuje zadati broj x 1:000:000.
Zad. 12.100 Dat je prirodan broj n kojim se iskazuje starost µcovjeka. Zavisno od vri-
jednosti, broju n dodati odgovaraju´ci tekst iz skupa f"godina"; "godine"g.
Zad. 12.101 Svako polje šahovske table odre†eno je parom prirodnih brojeva od kojih ni
jedan ne prelazi 8. Prvi od njih oznaµcava kolonu a drugi red. Dati su prirodni brojevi
k; l; m; n. Uraditi sljede´ce:
Utvrditi da li je jednim potezom topa mogu´ce sa polja (k; l) do´ci na polje (m; n)
Utvrditi da li je jednim potezom dame mogu´ce sa polja (k; l) do´ci na polje (m; n)
Utvrditi da li je jednim potezom lovca mogu´ce sa polja (k; l) do´ci na polje (m; n)
Ako nije mogu direktan prelazak na drugo polje pokazati kako se to moµze uµciniti u dva
koraka odnosno polja na koja se moµze napraviti prvi korak.
P = a1 a2 ::: an Y
k
Pk = am
aritmetiµcku sredinu brojeva fak g m=1
Zad. 12.103 Dat je prirodni broj n i realni brojevi x1 ; :::; xn . Odrediti sve brojeve xk za
koje vrijedi da je:
xk > x1 ; xk > x2 ; :::; xk > xk 1
Zad. 12.104 Grupe znakova koje ne sadrµze razmak i odvojene su razmacima zovemo
rijec.
Ispisati njegov naziv u obliku teksta. Naprimjer, broju 25 se dodjeljuje tekst "dvade-
setpet"
Prebrojati slova u tekstualnom prikazu broja a zatim generisati tekstualni prikaz tog
broja. Naprimjer, broju 30 se dodjeljuje tekst "trideset"; u tom tekstu ima osam
slova, što znaµci da se generiše broj 8; ovom broju se dodjeljuje tekst "osam" koji
ima µcetiri slova; broju 4 se dodjeljuje tekst "µcetiri",... Da li se ovaj postupak uvijek
završava ?
Zad. 12.106 Dati su realni brojevi a; b; c. Odrediti koji dan u sedmici odgovara datumu
koji je odre†en tom trojkom brojeva. Za rješenje se moµze koristiti sljede´ci koncept. Pret-
postavka je da je godina u intervalu 1582 do 4902; nedjelji se dodjeljuje broj 0, ponedjeljku
broj 1 itd. i to kao ostatak dijeljenja izraza:
gdje je d broj dana u mjesecu, m broj mjeseca u godini; numeracija poµcinje od marta
(Mart=1, April=2, ...,Decembar=10 a Januar i Februar dobijaju brojeve 11 i 12 jer se
smatraju mjesecima prethodne godine); y su dvije posljednje cifre koja oznaµcava godinu
(00; 01; :::; 99); c su dvije vode´ce cifre koja oznaµcava godinu (15; :::; 49); [x] oznaµcava cjelo-
brojni dio broja x. Za univerzalni kalendar je mogu´ce koristiti µcinjenicu da je 01:01:1900
godine bio ponedjeljak. Uvaµzavati razliku izme†u Gregorijanskog i Julijanskog kalendara.
Zad. 12.107 Dat je parni prirodni broj n > 2. Provjeriti hipotezu Goldbaha prema kojoj
se svaki parni prirodni broj moµze prikazati kao suma dva prosta broja.
Zad. 12.108 Uµcitava se niz realnih brojeva. Kraj uµcitavanja je oznaµcen simbolom #.
Izraµcunati prosjek (aritmetiµcku sredinu) uµcitanih brojeva ve´cih od datog broja a.
Zad. 12.109 Za dati broj n na´ci sve petorke brojeva x1 ; x2 ; x3 ; x4 ; x5 takve da je:
x1 x2 x3 x4 x5 ^ x1 + x2 + x3 + x4 + x5 = n
Zad. 12.110 Prirodni broj n predstaviti na naµcin da se svaka cifra predstavlja u bina-
rnom brojnom sistemu. Primjer: ako je n = 93 tada je zapis 10010011. Ovo se naziva
binarno kodirani zapis broja n, koji se široko koristio u programskim jezicima za obradu
poslovnih podataka.
Zad. 12.111 Iz dva izvora se uµcitavaju dva niza sortirana u rastu´cem redoslijedu. Naprav-
iti algoritam koji µcita oba izvora i formira novi niz, sastavljen od elemenata oba niza i
sortiran u rastu´cem redoslijedu. Taj novi niz se usmjerava u zasebnu datoteku. Broj
µclanova polaznih nizova nije unaprijed odre†en.
Zad. 12.112 Dat je prost broj p. Napraviti algoritam koji generiše niz cifara koji odgo-
varaju decimalnom dijelu inverzne vrijednosti tog broja.
Zad. 12.113 Neka je sa C (k) oznaµcen broj cifara broja k. Za odabrano n izraµcunati
sumu:
C (1) C (2) C (n)
S1 = 2
+ 2 + ::: +
1 2 n2
Zad. 12.114 Za dati prirodan broj n i realan broj x izraµcunati vrijednost izraza:
Zad. 12.116 Dat je niz fak g, k = 1; :::; 10, realnih brojeva i prirodni broj n. Niz fbm g
je formiran po pravilu:
Izraµcunati broj bm .
Zad. 12.117 Prirodni broj je palindrom ako se µcita jednako slijeva na desno kao i sdesna
ulijevo. Na´ci sve brojeve manje od 100 koji kvadriranjem postaju palindromi.
Zad. 12.118 Neka je dat prirodni broj n koji nije palindrom. Obrnemo redoslijed nje-
govih cifara i novi broj dodamo broju n. Ako je dobijen palindrom postupak završavamo.
Ako nije dobijen palindrom postupak ponavljamo za novo dobijeni broj. Pokazati da li se
postupak moµze završiti u m koraka. Napomena: do sada nije utvr†eno da li se postupak
uvijek završava palindromom.
13 Literatura
References
[1] Azali Saudi, Analysis of Algorithms, Lecture Notes, July 2008
[5] Don Colton, A Quick Guide to Big Oh, Brigham Young University Hawaii
[8] Marty Stepp, TCSS 342 Lecture Notes, Course Overview, Review of Math Concepts,
Algorithm Analysis and Big-Oh Notation, University of New York, 2005
[9] David Mount, Design and Analysis of Computer Algorithm, Department of Com-
puter Science, University of Maryland, Fall 2003
[10] www.wikipedia.com
[11] Alexander Shen, Algorithms and Programming, Problems and Solutions, Second
edition, Springer Undergraduate Texts in Mathematics and Technology, 2010