You are on page 1of 19

Analiza algoritma Andreja Ili

Analiza algoritma

Autor: Andreja Ili


e-mail: andrejko.ilic@gmail.com

Analiza algoritma1 predstavlja postupak kojim se predvia ponanje i vri procena potrebnih resursa
algoritma. Tano ponaanje algoritma je nemogue predvideti, zato se za njegovu analizu razmatraju
samo glavne karakteristike, a zanemaruju neki manji faktori sa kojima emo se kasnije upoznati. Osnovni
metod koji se pri tome koristi je aproksimacija. Na ovaj nain se, iz skupa moguih algoritama za
reavanje nekog konkretnog problema, moe izdvojiti najefikasniji (ili klasa efikasnih algoritama). U
ovom tekstu emo razmatrati vremensku sloenost algoritma memorijski zahtevi e biti pomenuti
samo ako nisu u nekim normalnim granicama.

Veina uenika, neretko i studenata, nije upoznata sa ovim pojmom i njegovom vanou. esto u toku
takmienja dobijamo pitanja vezana za ogranienja ulaznih podataka, jer veina takmiara ne razume
zato su ona bitna. Ideja ovog dokumenta je da takmiarima priblii ovaj pojam i njegovu znaajnost.

U mnogim knjigama ovoj prii nije posveeno dovoljno panje. Neretko se ovaj pojam uvodi jako
formalno to predstavlja problem itaocu da razume njegovu sutinu. Akcenat u ovom dokumentu e
biti na razmatranju i analizi konkretnih problema. Razni primeri koje emo analizirati e vam pomoi da
uoite razlike izmeu algoritama koji reavaju isti problem.

Slika 1. Strip o sloenosti problema putujueg trgovca


(preuzeto sa xkcd.com sajt posveen stripovima o ljubavi, sarkazmu, matematici i jeziku)

Ukoliko imate komentara ili dodatnih sugestija povodom teksta, nemojte oklevati da se obratite autoru.
Takoe ukoliko naiete na neku greku, kojih svakako ima, bili bi zahvalni kada bi ste obavestili autora o
istoj.

1
Pod algoritmom podrazumevamo konaan niz nedvosmisleno definisanih naredbi potrebnih za reavanje
konkretnog problema. Formalnu definiciju algoritma ovde neemo iznositi.

1
Analiza algoritma Andreja Ili

Sloenost algoritma

Na poetku sloenost algoritma definisaemo neformalno kao maksimalni broj operacija potrebnih za
izvravanje algoritma. Ovde smo prvo uveli pretpostavku da su sve (osnovne) operacije iste sloenosti, s
obzirom da nam je potreban samo njihov broj. Sa druge strane, broj operacija e svakako zavisiti od
samog ulaza. Iz tog razloga, kada se ispituje sloenost nekog algoritma treba razmatrati najgori mogui
sluaj. U daljem delu emo videti da nas zanima samo asimptotsko ponaanje vremenske sloenosti.

Osnovne operacije predstavljaju skup operacija ije se vreme izvravanja moe ograniiti nekom
konstantom koja zavisi samo od konkretne realizacije (raunara, programskog jezika, prevodioca).
Drugim reima, pretpostavljamo da se svaka osnovna operacija izvrava za jedinino vreme. Naravno
nisu sve operacije takve: primera radi stepenovanje ne moemo smatrati osnovnom operacijom2.
Tipine osnovne operacije su:

dodela vrednosti promenjivoj


poreenje dve promenjive
aritmetike i logike operacije
ulazno / izlazne operacije

Kako je i sama gornja definicija sloenosti jo uvek komplikovana, moramo ignorisati jo neke faktore. Iz
tog razloga uvodimo novo pravilo zanemarivanja konstanti. Sloenost e zavisiti od ulaznih veliina
(ogranienja brojnih vrednosti, veliina matrica i nizova...), dok emo konstante koje su mnogo manje
od ulaznih ogranienja zanemariti. Naredni primeri e vam pribliiti ovu priu.

Posmatrajmo Algoritam 1 na kojem je prikazan deo funkcije za raunanje srednje vrednosti niza. Broj
operacija koji e da se izvri u toku ovog algoritma je ( puta emo poveati vrednost promenjive
; puta emo poveati sumu za vrednost [ ]; jedna operacija za inicijalizaciju na ; jedna za
raunanje srednje vrednosti). Kako konstante zanemarujemo dobijamo da je sloenost ovog algoritma:
operacija. Ovu injenicu emo zapisivati kao itamo o od . U ovom sluaju kaemo da je
algoritam linearne sloenosti.

================================================================
01 suma = 0;
02 for i = 1 to n
03 suma = suma + a [i];
04 avg = suma / n;+
================================================================
Algoritam 1. Nalaenje srednje vrenosti niza

Konstante zanemarujemo iz razloga to su one obino dosta manje od uzlanih veliina. Primera radi za
gore opisani algoritam, da li emo izvriti operaciju ili nee uticati za vee veliine niza (naravno

2
Algoritam brzog stepenovanja e biti izloen u problemu Vrednost polinoma.

2
Analiza algoritma Andreja Ili

za manje veliine sloenost je svakako mala). Slino se i mnoilac moe zanemariti ukoliko je konstanta.
Sloenost algortima traimo kao funkciju od parametara veliine ulaza.

================================================================
01 for i = 1 to n - 1
02 for j = i + 1 to n
03 if a [i] < a [j] then
04 pom = a [i];
05 a [i] = a [j];
06 a [j] = tmp;
================================================================
Algoritam 2.

Sloenost Algoritma 23 je kvadratna tj. . Taan broj operacija je , ukoliko bi morali svaka
dva elementa da zamenimo ( operacije su potrebne za zamenu; i biramo na kojima
uporeujemo svaka dva elementa niza). Zanemarujui konstante dobijamo da je broj operacija zapravo
. Kako je mnogo manje od za vee vrednosti, moemo zanemariti linearni faktor (izmeu
ili operacije nema znaajnih razlika u vremenu).

Nije uvek jednostavno utvrditi sloenost algoritma. Naalost za ovaj problem ne


postoji univerzalni metod koji moemo primeniti. Meutim, vebom svakako
moemo stei dobru intuiciju o njoj. Poznavanje sloenosti nekih standardnijih
algoritama i programskih konstrukcija (pogledati Tabelu 1) nam u tome mogu dosta
pomoi.

Rb Programska konstrukcija Vremenska sloenost konstrukcije u zavisnosti od njenih delova


01 Sekvenca naredbi :
P;
Q;
02 Uslovna naredba :
if (uslov) then
P;
else
Q;
03 For petlja :
for i = 1 to n do
P;
04 While / Repeat petlja :
while (uslov) do gde je broj interacija petlje u najgorem moguem sluaju
P;
Tabela 1: Sloenosti osnovnih programskih konstrukcija.

Pored raunanja vremenske sloenosti kao broj operacija u najgorem sluaju, postoje i drugi pristupi za
merenje vremenske efikasnosti algoritma. Jedan od njih je probabilistiki metod srednjeg vremena.
Proseno vreme izvravanja tj. vremensku sloenost na ovaj nain definiemo kao oekivani broj

3
Algoritam 2 predstavlja algoritam za sortiranje nizova.

3
Analiza algoritma Andreja Ili

potrebnih operacija da bi se algoritam izvrio. Ovo je dosta realistiniji pristup u praksi, ali je svakako i
mnogo tee proceniti ga. Razlog za to je to bi njegova procena zahtevala poznavanje raspodele
verovatnoe ulaznih podataka. Sa druge strane, korpusi test primera kod takmiarskih problema
obuhvataju i specijalne sluajeve i najgore ulaze. Na ovaj nain se testira ponaanje algoritma u svim
moguim scenarijima. Naravno, za randomizirane algoritme, koji u toku izvravanja donose sluajne
odluke, procena vremenske sloenosti se mora zasnivati na oekivanom vremenu izvravanja koji smo
spomenuli. O ovome e biti jo prie u delu o Quicksort-u.

Broj podnizova parne sume

Poeemo sa jednim naizgled jednostavnim primerom. Videemo da se neka oigledna reenja mogu
dosta ubrzati.

Problem Dat je niz prirodnih brojeva duine . Koliko ima podnizova, sastavljenih od uzastopnih
elemenata, ija je suma paran broj?

Drugim reima, treba nai broj ureenih parova , gde je , za koje je

paran broj

Primera radi, niz ima etiri uzastopna podniza parne sume - i .

Nakon itanja problema, veina odmah nastupi sa oiglednom idejom: za svaku vrednost promenjivih i
, sumirau elemente sa indeksima izmeu njih i proveriti da li je to paran broj. Posmatrajmo kod za ovu
ideju prikazan u Algoritmu 3.

================================================================
01 brojParnih = 0;
02 for i = 1 to n
03 for j = i to n
04 suma = 0;
05 for k = i to j do
06 suma = suma + a [k];
07 if (suma mod 2 == 0) then
08 brojParnih = brojParnih + 1;
================================================================
Algoritam 3. Prvo reenje problema parnih podnizova

Sloenost Algoritma 3 je , meutim pokuajmo ovu implementaciju da ubrzamo. Linije koda 04


06 sumiraju vrednosti elemenata od do . Kada fiksiramo levu granicu tog segmenta po kome
sumiramo, promenjivu , posmatrajmo kako se menja suma kada se promenjiva poveava za .
Primeujemo da se suma povea za vrednost [ ]. Drugim reima, ne moramo uvek sumirati sve
elemente poev od indeksa . Implementacija ovde ideje je prikazana u Algoritmu 4. Sloenost novog
algoritma je .

4
Analiza algoritma Andreja Ili

================================================================
01 brojParnih = 0;
02 for i = 1 to n
03 suma = 0;
04 for j = i to n
05 suma = suma + a [j];
06 if (suma mod 2 == 0) then
07 brojParnih = brojParnih + 1;
================================================================
Algoritam 4

Iz gornjeg primera vidimo da istu ideju moemo implementirati na razliite naine.


Samom razmatranju implementacije treba posvetiti dosta vremena, nekada ak i vie
od ideje dizajna algoritma. Naravno najbolji recept je razmatrati ih parelelno. Sa
druge strane, od ideje ne treba odustati ukoliko niste dovoljno razmotrili
implementaciju.

Meutim, ovaj problem moemo reiti i u linearnom vremenu. Definiimo niz kao

[ ] [ ] [ ]

Sumu elemenata [ ] [ ] memo preko niza izraunati kao [] [ ], gde


uzimamo da je [ ] 4
. Ovaj podniz e imati parnu sumu jedino u sluaju da su vrednosti
[]i [ ] iste parnosti. Oznaimo sa broj parnih elemenata niza , raunajui i
element sa indeksom . Ukoliko posmatramo dva parna elementa, podniz koji oni definiu (za koji su oni
leva i desna granica) je parne sume. Analogno imamo i sa neparnim elementima. Kako je razlika dva
broja parna ako i samo ako su lanovi iste parnosti, ovo su jedini mogui sluajevi parnih podnizova.
Krajnji rezultat dobijamo kao

( ) ( )

Sloenost algoritma je linearna. Niz moemo da inicijalizujemo jednim prolaskom kroz niz vezom:

[ ]

[ ] [ ] [ ]

Nakon toga jednostavnim prebrojavanjem parnih odnosno neparnih elemenata niza, reenje dobijamo
gornjoj formulom.

4
Ovakva konstukcija je jako esta i moe se uoptiti za matrice.

5
Analiza algoritma Andreja Ili

Slika 2. Iz vree moguih algoritama treba izabrati onaj najefikasniji

Intervali
Problem Dat je niz , duine , celobrojnih intervala na realnoj pravoj. Koordinate intervala su iz
segmenta [ ]. Nai celobrojnu taku sa realne prave koja pripada najveem broju intervala. Taka
pripada intervalu i kada se nalazi na njegovom rubu.

Ovo je jedan poznatiji primer. Ovde emo izneti tri reenja i uporeivati njihove sloenosti.

Algoritam A: Traena taka je celobrojna i pripada intervalu [ ], jer za sve ostale take
sigurno znamo da ne pripadaju ni jednom intervalu. Zato moemo proi kroz svaku taku iz ovog
segmenta i ispitati koliko je intervala sadre. Algoritam moemo ubrzati ukoliko na poetku
izraunamo najmanju levu koordinatu intervala i najveu desnu koordinatu i ispitivanje svedemo
samo na take iz ovog segmenta.

ak i kod ubrzane verzije segment koje treba ispitati moe biti upravo [ ] (najgori mogui
sluaj). Za svaku taku iz ovog segmenta obilazimo ceo niz intervala duine . Dobijamo da je
ukupna sloenost ovog algoritma jednaka Kako moe biti veliki broj, vidimo da ovaj
pristup nije ba efikasan.

Algoritam B: Oznaimo sa traenu taku (ona ne mora biti jedinstvena). Pokazaemo da


postoji taka koja pripada istom broju interval (dakle i ona moe biti reenje) a koja je kraj
nekog od datih intervala, konkretno levog. Pretpostavimo suprotno, da taka nije levi kraj
intervala. Posmatrajmo taku . Ova taka pripada istom broju intervala, jer smo
pretpostavili da nije levi kraj (u suprotnom bi ona ispala iz nekog intervala a kako su oni
celobrojni to je nemogue). Ukoliko je leva granica nekog intervala, nju uzimamo za taku
. U suprotnom slino rezonovanje primenjujemo na taku . Kako su intervali iz konanog
segmenta u nekom trenutku moramo naii na kraj nekog od poetnih segmenata koji sadre .

6
Analiza algoritma Andreja Ili

Iz gornjeg razmatranja vidimo da ne moramo da obilazimo sve take iz segmenta u prvom


algoritmu. Pretragu moemo vriti samo po krajevima intervala. Krajeva ima ukupno , ime
dobijamo da je novi algoritam sloenosti .

Algoritam C: U prethodnom algoritmu smo videli da se isptivanje moe svesti na granice


ulaznih intervala. Meutim, pri ispitivanju pripadnosti neke take ispitujemo sve intervale. Da li
ovo moemo ubrzati?

Razmatrajmo primer skupa intervala sa slike:

[ ][ ][ ][ ][ ][ ]

Slika 3. Primer intervala

Skenirajmo po koordinatama granica redom sa leva na desno i zapisujmo broj intervala kojima
pripadaju:

Primeujemo da kada naiemo na otvaranje nekog intervala, njegovu levu granicu, broj
pripadnosti intervalima se poveava za . Slino kada naiemo na zatvaranje smanjuje se za .
Specijalan sluaj je kada se u nekoj koordinati i otvaraju i zatvaraju neki intervali, a kako smo
rekli da taka sa granica pripada intervalima, onda prvo poveavamo broj preseka a tek kada
napustimo taku smanjujemo.

Kreirajmo dva nova niza i duine i inicijalizujmo ih na sledei nain:

[ ] i [ ]
[ ] i [ ]

Dakle u niz smo poreali vrednosti granica intervala, a paralelno u drugom nizu postavljali
za levu granicu intervala i za desnu. Sortirajmo ove nizove po vrednostima niza , dok

7
Analiza algoritma Andreja Ili

paralelno menjamo i elemente u nizu vrednosti. Ukoliko su koordinate jednake manja je ona
kojom se segment otvara (dakle prednost imaju ). Nakon sortiranja imamo sledee
stanje:

Skeniranje po koordinatama i raunanje pripadnosti se sada svodi na jednostavno sabiranje


elemenata niza . Pravimo parcijalne sume niza .

Kako traimo maksimalni broj intervala koji sadri neku taku, rezultat e biti maksimum
parcijalnih suma. Sloenost ovog algoritma je .

Kao to vidimo za isti problem smo imali tri mogua reenja. Sva tri algoritma su korektna to se reenja
tie. Meutim njihove sloenosti se drastino razlikuju (bar za red veliine). Gledano sa takmiarske
strane, broj poena koji bi osvojili po gornjim algoritmima bi aproksimativno bio , 40 i , redom.

Vrednost polinoma

Izraunavanje vrednosti polinoma u datoj taki se sastoji u raunanju vrednosti . Problem nije
komplikovan, tako da emo kroz ovaj primer proi samo u grubim crtama.

Problem Dat je polinom stepena preko niza koeficienata . Za konkretnu taku


izraunati vrednost

Najjednostavniji pristup je simuliranje izraunavanja svakog sabirka pojedinano. Naivna implementacija


ove ideje dovodi do sloenosti (pretpostavljamo da se koeficinete polinoma nalaze u nizu ).

================================================================
01 value = 0;
02 for i = 0 to n do
03 power = 1;
04 for j = 1 to i do
05 power = power * a;
06
07 value = value + power * p [i];
================================================================
Algoritam 5

8
Analiza algoritma Andreja Ili

Redovi 03 05 u datom pseudo kodu algoritma stepenuju dati broj na stepen . Raunanje stepena
moe se implementirati i u logaritamskom vremenu stepena. Ideja je zasnovana na razlaganjima

Na ovaj nain moemo problem svesti na problem sa dvostuko manjim eksponentom. Funkcija
stepenovanja se najlake implementira rekurzivno. Malo detaljnije objaenjenje brzog stepenovanja
moete nai u [2].

================================================================
01 function Stepen (Integer a, Integer n)
02 if n = 0 then
03 return 1;
04 if n = 1 then
05 return a;
06
07 tmp = Stepen (a, n DIV 2);
08 if (n MOD 2 = 0) then
09 return tmp * tmp;
10 else
11 return tmp * tmp * a;
================================================================
Algoritam 6. Funckija brzog stepenovanja

Problem se moe reiti i u linearnom vremenu. Naime, stepen ne moramo uvek raunati od poetka ve
ga moemo nadograivati. U svakom koraku, nakon promene vrednosti stepen emo mnoiti sa .

================================================================
01 value = 0;
02 power = 1;
03 for i = 0 to n do
04 value = value + power * p [i];
05 power = power * a;
================================================================
Algoritam 7

Na kraju napomenimo da se problem moe implemenitrati i preko Hornerove eme. Sloenost e takoe
biti linearna, meutim ovim pristupom imamo minimalni broj operacija sabiranja i mnoenja.

Elementi sa datom sumom

Problem Dat je niz prirodnih brojeva duine . Za dati prirodni broj ispitati da li postoje dva
elemente niza , ija je suma jednaka datom broju .

Navedeni primer se esto sree kao podproblem nekog veeg problema i na jako lep nain ilustruje ideju
o sloenosti algoritma. Prva ideja, koja je svakako korektna ali ne i efikasna, jeste da se za svaka dva
elementa niza proveri da li u sumi daju broj . Ovaj pristup ima kvadratnu sloenost.

9
Analiza algoritma Andreja Ili

Mana ovog pristupa je to ispitujemo parove elemenata bez ikakvog poretka. Zbog toga nemamo
nikakvih pretpostavki o sumi novog para na osnovu prethodnih. Da bi mogli imati neku intuiciju o
ponaanju sume elemenata sortirajmo niz u neopadajui poretku. Definiimo sa sumu
elemenata [ ] i [ ], pri emu je . Kako je niz sortiran, [ ] [ ], imamo da vae
nejednakosti

Postavimo na poetku vrednost indeksa , levu granicu, na , a indeks , desnu granicu, na . Kada desnu
granicu smanjujemo, i sama suma se smanjuje. Mogua su tri sluaja:

1. Naili smo na element sa indeksom tako da je . U ovom sluaju smanjujemo


vrednost indeksa .
2. Naili smo na element sa indeksom tako da je . Tada prekidamo izvravanje
programa i kao reenje vraamo upravo ovaj par elemenata.
3. Naili smo na element sa indeksom tako da je . Sada nema potreba smanjivati
indeks i ispitivati sumu za istu vrednost indeksa , upravo zbog gornjih nejednakosti.

Kako smo smanjivanjem desne granice prekinuli u trenutku kada je prvi put dobijeno ,
imamo da je . Zato pretragu ne moramo ponovo poinjati od , ve samo nastaviti
gde smo zadnji put imali da je suma bila vea: . Drugim reima, promenjivu smanjujemo sve dok
ne dobijemo reenje ili ne dobijemo vrednost koja je manja od , kada poveavamo . Ako dobijemo da
je , prekidamo i prijavljujemo da reenje ne postoji. Pogledati Sliku 4 koja ilustruje ponaanje
pokazivaa na konkretnom primeru.

Slika 4. Primer pretrage para u nizu za .

10
Analiza algoritma Andreja Ili

Rastojanje izmeu indeksa i je na poetku jednako . U svakom koraku se njihovo rastojanje


smanjuje za . Kako smo gore napomenuli da ukoliko se preskoe reenje ne postoji, ukupan broj
koraka ne moe biti vei od poetnog rastojanja. Kako na poetku treba sortirati niz5 dobijamo da je
sloenost . Pseudo kod ovog algoritma je dat u Algoritmu 5.

================================================================
01 Sort(a);
02 i = 1;
03 j = n;
04 while (i <= j)
05 if (a [i] + a [j] = s) then
06 break;
07 if (a [i] + a [j] > s) then
08 j = j + 1;
09 else
10 j = j + 1;
11 i = i + 1;
12
13 if (i <= j) then
14 return true;
15 return false;
================================================================
Algoritam 8

Jo jedan mogui pristup nakon sortiranja niza je binarna pretraga: za svaki element [ ], ispitujemo da
li u nizu postoji njegova dopuna do sume tj. element ija je vrednost [ ]. Sloenost ovog
algoritma je takoe , meutim prvi pristup je za nijasnu efikasniji.

Pri analizi nekog problema moemo naii na dva reenja iste sloenosti. U
razmatranje njihove meusobne efikasnosti moemo ukljuiti konstante ili druge
sabirke koje smo zanemarili, ali to nee mnogo uticati na performanse. U
prethodnom primeru smo videli da samo imali algoritme ije su sloenosti bile
i . Efikasniji algoritam je svakako prvi.

itaocu preporuujemo da nakon ovog primera sam rei Zadatak 010.

Quicksort
Quicksort6 je jako zanimljiv algoritam za sortiranje niza. Verovatno ste svi do sada uli da je to najbri
algoritam za sortiranje niza. U prvom delu ovog dokumenta smo razmatrali sloenost jednoj od
najjednostavnijih algoritama za sortiranje. Sloenost quicksort-a, u najgorem sluaju, je ) gde je
broj elemenata niza. Iako je spor u najgorem sluaju, on predstavlja najbolji izbor za ovaj problem jer je

5
Algoritme sortiranje moete prouiti u bilo koji knjizi koja se bavi dizajnom i analizom algoritama.
6
Ovde neemo objanjavati kako sam algoritam radi. Opis algoritma moete nai skoro u bilo kojoj knjizi koja se
bavi programiranjem.

11
Analiza algoritma Andreja Ili

neverovatno brz u srednjem tj. oekivanom vremenu sortiranja: oekivano vreme sortiranje je
, dok je konstanta sakrivena iz ove sloenosti jako mala.

Sa druge strane, pored ovog algoritma postoji i sortiranje razdvajanje koje se zanisniva na metodi podeli
pa vladaj. Ovaj algoritam je u stranoj literaturi poznat kao merge sort. Sloenost je u
najgorem sluaju. Meutim, u oekivanom vremenu quicksort je dosta bri. Slian sluaj imamo i sa
radix sort-om.

Kako bi bili sigurni da e quicksort raditi u oekivanom vremenu, pre sortiranja niza treba napraviti
sluajnu permutaciju a zatim nju sortirati. Na taj nain moete izbei one najgore sluajeve i vreme
vratiti na oekivano.

Kako moemo kreirati sluajnu permutaciju? Oznaimo dati niz sa , njegovu duinu sa . Naintuitivniji
pristup je dodeliti svakom elementu niza sluajan broj [ ], a zatim sortirati niz ali po vrednostima
niza . Problem kod ovog metoda je kako obezbediti da su dodeljene vrednosti jedinstvene. Kako se i
sami sluajni brojevi generiu pseudo-sluajnim algoritmom ovde se moemo zadovoljiti i jako malom
verovatnoom pojavljivanje istih vrednosti. Moe se pokazati da ukoliko vrednosti biramo na sluajan
nain iz segmenta [ ], verovatnoa da su svi elementi razliiti jednaka je . Sloenost ovog
pristupa je jednak sloenosti sortiranje.

Najpraktiniji nain generisanja sluajne permutacijije prikazan je u Algoritmu 6. Sloenost algoritma je


linearna. Dokaz korektnosti algoritma neemo izloiti ovde. Za one koji ele vie informacija, mogu
pogledati [1].

================================================================
01 for i = 1 to n do
02 j = random (i, n);
03 zameni (a [i], a [j]);
================================================================
Algoritam 9

Zanimljiva napomena je da ukoliko se indeks inicijalizuje kao ne dobija se sluajna


permutacija. Dokaz ove injenice ostavljamo itaocu.

Priu o quicksort-u zavriemo dokazom njegove optimalnosti. Do sada samo uvek raunali sloenost
algoritama i pokazivali kako je neki pristup bolji od drugog. Meutim, nekada je potrebno postaviti
pitanje: da li postoji bri algoritam? Kako bi odgovorili na ovo pitanje potrebno je nai donju granicu
sloenosti algoritma za konkretan problem. Ovo je nemogue odrediti za generalni sluaj, jer se dokaz
odnosi na sve mogue algoritme. Neohpodno je napre specificirati model koji odgovara porizvoljnom
algoritmu, a zatim dokazati da je vremenska sloenost proizvoljnog algoritma obuhvaenog tim
modelom vea ili jednaka od donje granice.

U daljem delu odeljka pokazaemo da je optimalna sloenost algoritama za sortiranje niza upravo
. Model koji emo koristiti pri dokazivanju se zove stablo odluivanja. Stablo odluivanja

12
Analiza algoritma Andreja Ili

modelira izraunavanje koje se najveim delom zasniva na uporeivanju. Definie se kao potpuno
binarno stablo sa dve vrste vorova: unutranjim vorovima i listovima. Svakom unutranjem voru
odgovara jedno pitanje sa dva mogua odgovora, pri emu je svaki od njih pridruen grani koja izlazi iz
tog vora. Svakom listu je pridruen jedan od moguih izlaza algoritma. Izraunavanje poinje od korena
stabla. U svakom voru se postavlja pitanje u vezi sa ulazom i u zavisnosti od odgovora nastavlja levim ili
desnim potomkom. Kada se dostigne list, izlaz priduen njemu je izlaz izraunavanja. Kako bi ova pria
bila jasnija pogledati Sliku 4 na kojoj je prikazano sortiranje niza duine pomou stabla odluivanja.

Vremenska sloenost algoritma definisanog preko stabla odluivanja jednaka je njegovoj visini, odnosno
maksimalnom broju pitanja (operacija) koje je potrebno postaviti kako bi se reenje jednoznano
odredilo.

Slika 5. Primer stabla odluivanja za sortiranje niza duine

Teorema Proizvoljno stablo odluivanja za sortiranje elemenata niza ima visinu .

Dokaz: Ulaz u algoritam je niz duine . Izlaz je niz u sortiranom poretku, drugim reima
permutacija ulaza. Kako ulaz moe biti u porivoljnom poretku, svaka permutacija brojeva
treba da se pojavi kao mogui izlaz stabla odluivanja. Prema tome, za svaku permutaciju treba da
postoji bar jedan list. Permutacija ima , pa poto je stablo binarno, njegova visina je najmanje
. Koristei Stirlingovu formulu

( )

dobijamo da je .

13
Analiza algoritma Andreja Ili

Ovaj dokaz donje granice pokazuje da svaki algoritam za sortiranje zasnovan na uporeivanju ima
sloenost veu ili jednaku od . Sortiranje je mogue izvriti i korienjem nekih drugih osobina.
Primera radi ukoliko bi ogranienje brojeve bilo malo (malo u smislu da moemo definisati niz te
veliine), sortiranje razvrstanjem (eng. counting sort) bi vratilo rezultat u linearnom vremenu. Ovo ne
protivurei dokazu prethodne teoreme, jer se ovde koristi injenica da vrednosti brojeva mogu da se
efikasno koriste kao adrese. Takoe, ovaj algoritam nije generalni i ne moe se primeniti na proizvoljan
niz.

14
Analiza algoritma Andreja Ili

Rezime

Rezime prie emo izneti kroz esta pitanja koje je autor dobijao u toku priprema.

1. Zato nam je uopte potreban efikasan algoritam? Moe li kupovina breg raunara reiti ovaj
problem?

Naravno novac ne me sve kupiti. Pored toga to su intelektualno izazovniji, efikasniji algoritmi e se
sigurno izvravati bre i na sporijem raunaru od loih algoritama na super raunarima, za dovoljne
veliine ulaza. Boljim raunarom moete ubrzati sve algoritme, ali procenat tog ubrzanja ne moe
pomoi u sluaju eksponencionalnih algoritama. U prilog ovoga ide i Murov zakon koji predvia
razvijanje raunara snaga raunara se udvostruuje priblino na svakih 18 24 meseca.

2. Kada moemo rei da je neki algoritam dobar, a kada da je optimalan?

Za algoritam moemo rei da je dobar ukoliko se pri uporeivanju sa drugim postojeim algoritmima za
ovaj problem pokae kao efikasniji. Na takmienjima je tako lako zakljuiti. Naime, ogranienja su tu da
bi pomogla u odgovoru na ovo pitanje. Uporeivanjem sloenosti sa efikasnou raunara na kojem se
testira lako moete zakljuiti da li je va algoritam efikasan ili ne.

Drugi deo pitanje je iskomentarisan u prethodnom delu teksta. Na ovo pitanje je nekada nemogue
odgovoriti. Kod primera quicksort-a videli smo da odogovr zahteva poznavanje donje granice vremena
izvravanja svih algoritama za konkretan problem. To znai da za dati problem ne samo poznati
algoritmi, ve i oni koji jo nisu otkriveni, moraju se izvravati za vreme koje je vee ili jednako od neke
granice. Napomenimo i to da se kod takmarskih zadataka moe nai i algoritam efikasniji od datih
granica.

3. ta je potrebno od matematikog aparata za analizu sloenosti algoritma?

Teina analize kao pratioca procesa konstrukcije algoritma ne bi trebalo da bude izgovor za odsutajanje
od nje. Bitno je dobiti bar nekakvu prredstavu o efikasnosti algoritma. Za njeno raunanje obino je
dovoljno poznavanje osnovnih suma, zasnovanih na aritmetikoj i geometrijskoj progresiji, kao i
osnovnih principa kombinatorike. U neki sluajevima, naroito kada se koristi rekurzija, nailazi se na
diferencne jednaine. Obino su to neki elementarni sluajevi.

15
Analiza algoritma Andreja Ili

(preuzeto sa xkcd.com sajt posveen stripovima o ljubavi, sarkazmu, matematici i jeziku)

16
Analiza algoritma Andreja Ili

Razni zadaci

Zadatak 001 [Dravno takmienje, Srbija, 2008] Profesor matematike je postavio Draganetu sledei
zadatak. Na osnovu datog niza brojeva a1, a2, ..., an, Dragane treba da za svaku trojku indeksa (i, j, k),
gde je 1 i < j < k n, napie na tabli najvei od brojeva ai, aj i ak. Zatim treba da izrauna ostatak koji
daje zbir svih brojeva koji su napisani na tabli pri deljenju sa 10007. Profesor je obeao Draganetu
peticu za kraj kolske godine, ako dobije tano reenje pre kraja asa. Pomozite Draganetu da to bre
dobije taan rezultat. Duina niza nije vea od , dok su elementi niza iz segmenta [ ].

Ulaz: Izlaz:
4 11
3 -1 2 2

Zadatak 010 [Dravno takmienje, Srbija, 2003] Dat je skup od dui razliitih duina.
Napisati program koji odreuje koliko se nepodudardnih trouglova moe obrazovati od tih dui. Za
obrazovanje trougla se jedna du moe koristiti samo jednom.

Ulaz: Izlaz:
4 2
2 3 6 4

Zadatak 011 [TopCoder, SRM 408] Mali Perica je dobio sveica za roendan. Odluio je da
na sledei nain proslavi: prvog dana e upaliti jednu sveu da gori sat vremena; drugog dana e upaliti
dve svee u periodu od sat vremena; i tako dalje; -tog dana e upaliti svea. Svakog dana upaljena
svea se smanji tano za cm. Kada svea dostigne visinu , ne moze se vie upotrebljavati. Odrediti
maksimalni broj dana tokom kojih Perica moe da slavi rodjandan.

Ulaz: Izlaz:
2 2 2 3

Zadatak 100 [upanjsko takmienje, Hrvatska, 2007] Japanska buba uletela je u tunel pun prepreka:
stalagmita (stoje na pod) i stalaktita (vise sa plafona). Tunel je duine (gdje je paran broj) i visine .
Prva prepreka je stalagmit, a zatim se naizmenino smenjuju stalaktiti i stalagmiti. Japanskoj bubi se ne
da izbegavati prepreke, nego odabere jednu od visina i zaleti se s jednog kraja tunela na drugi, te
svojim kung-fu vetinama porui sve prepreke na putu.

17
Analiza algoritma Andreja Ili

Objanjenje datog primera

Zadane su dimenzije tunela i duine svih prepreka. Napiite program koji odreuje koliko najmanje
prepreka buba mora poruiti da bi prola na drugu stranu, te na koliko razliitih visina se postie ta
najmanja vrijednost.

Ulaz: Izlaz:
6 7 2
1 5 4 4 5 3

Zadatak 101 Nai broj brojeva iz segmenta [ ] iji je zbir cifara paran.

Ulaz: Izlaz:
5 15 5

Zadatak 110 [Dravno takmienje, Srbija, 2007] Draganetu je dosadilo da ivi u gradu pa je reio da
sagradi sebi vikendicu, u kojoj e u miru i tiini moi da sprovodi svoje programerske ideje. Kako je
Dragane veoma vredan, reio je da sam napravi nacrte njegove kue iz snova. No, na poetku je trebalo
da odredi mesto na kome e se graditi. Kako Dragane nije ba bogat (matematika i programiranje nije
bilo isplativo kako je on mislio), odredio je maksimalni budet koji moe da potroi za kupovinu placeva.
Naravno, eli da vikendica bude to lepa, pa je odredio i donju granicu budeta. Sad je u nedoumici gde
da je sagradi. Pomozite Draganetu da odredi broj moguih mesta za gradnju vikendice.

Mesta na kojima Dragane moe da gradi vikendicu data su u obliku pravougane matrice dimenzije
( , gde polja predstavljaju placeve. Za svaki plac je data njegova cena. Cene ne
prelaze . Vikendica je u obliku pravougaonika. Na pravougaoniku se moe sagraditi vikendica ukoliko
suma njenih parcela upada u granice budeta. Granice budeta su iz segmenta [ ].

Primer

Ulaz: Izlaz:
3 3 2 3 7
1 0 0
0 1 0
0 0 1

18
Analiza algoritma Andreja Ili

Literatura
[1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein, Introduction to
algorithms, The MIT Press, 2001.
[2] Miodrag ivkovi, Algoritmi, Matemtiki fakultet, Beograd, 2000.
[3] Donald E. Knuth, The Art of Computer Programming, Addison Wesley, Volume 1, 1980.
[4] Dejan ivkovi, Osnove dizajna i analize algoritama, Raunarski fakultet, Beograd, 2007.

19

You might also like