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 nemogude predvideti, zato se za njegovu analizu razmatraju
samo glavne karakteristike, a zanemaruju neki manji faktori sa kojima demo se kasnije upoznati. Osnovni
metod koji se pri tome koristi je aproksimacija. Na ovaj nain se, iz skupa mogudih algoritama za
reavanje nekog konkretnog problema, moe izdvojiti najefikasniji (ili klasa efikasnih algoritama). U
ovom tekstu demo razmatrati vremensku sloenost algoritma memorijski zahtevi de biti pomenuti
samo ako nisu u nekim normalnim granicama.
Vedina uenika, neretko i studenata, nije upoznata sa ovim pojmom i njegovom vanodu. esto u toku
takmienja dobijamo pitanja vezana za ogranienja ulaznih podataka, jer vedina 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 posvedeno dovoljno panje. Neretko se ovaj pojam uvodi jako
formalno to predstavlja problem itaocu da razume njegovu sutinu. Akcenat u ovom dokumentu de
biti na razmatranju i analizi konkretnih problema. Razni primeri koje demo analizirati de vam pomodi da
uoite razlike izmeu algoritama koji reavaju isti problem.

Slika 1. Strip o sloenosti problema putujudeg trgovca


(preuzeto sa xkcd.com sajt posveden stripovima o ljubavi, sarkazmu, matematici i jeziku)
Ukoliko imate komentara ili dodatnih sugestija povodom teksta, nemojte oklevati da se obratite bilo
autoru bilo takmiarskoj komisiji. 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 nedemo iznositi.

Analiza algoritma

Andreja Ili

Sloenost algoritma
Na poetku sloenost algoritma definisademo 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 de svakako zavisiti od
samog ulaza. Iz tog razloga, kada se ispituje sloenost nekog algoritma treba razmatrati najgori mogudi
sluaj. U daljem delu demo 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 de zavisiti od ulaznih veliina
(ogranienja brojnih vrednosti, veliina matrica i nizova...), dok demo konstante koje su mnogo manje
od ulaznih ogranienja zanemariti. Naredni primeri de vam pribliiti ovu priu.
Posmatrajmo Algoritam 1 na kojem je prikazan deo funkcije za raunanje srednje vrednosti niza. Broj
operacija koji de da se izvri u toku ovog algoritma je
( puta demo povedati vrednost promenjive
[
];
; puta demo povedati 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 demo 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 demo izvriti
operaciju ili nede uticati za vede veliine niza (naravno

Algoritam brzog stepenovanja de biti izloen u problemu Vrednost polinoma.

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.


dva elementa da zamenimo (

. Taan broj operacija je

operacije su potrebne za zamenu;

, ukoliko bi morali svaka


i

biramo na

kojima

uporeujemo svaka dva elementa niza). Zanemarujudi konstante dobijamo da je broj operacija zapravo
. Kako je mnogo manje od
za vede 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 stedi dobru intuiciju o njoj. Poznavanje sloenosti nekih standardnijih
algoritama i programskih konstrukcija (pogledati Tabelu 1) nam u tome mogu dosta
pomodi.

Rb
01

Programska konstrukcija
Sekvenca naredbi :

Vremenska sloenost konstrukcije u zavisnosti od njenih delova

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
P;

gde je

broj interacija petlje u najgorem mogudem sluaju

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.

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
verovatnode 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
mogudim 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 de biti jo prie u delu o Quicksort-u.

Broj podnizova parne sume


Poedemo sa jednim naizgled jednostavnim primerom. Videdemo 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 nadi broj ureenih parova

, gde je

, za koje je

paran broj
Primera radi, niz

ima etiri uzastopna podniza parne sume -

Nakon itanja problema, vedina odmah nastupi sa oiglednom idejom: za svaku vrednost promenjivih i
, sumiradu 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 povedava za .
Primedujemo da se suma poveda 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
.

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
4
[ ]
uzimamo da je
. Ovaj podniz de imati parnu sumu jedino u sluaju da su vrednosti
[]i
[
] iste parnosti. Oznaimo sa
broj parnih elemenata niza
, raunajudi 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 mogudi 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.

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

Analiza algoritma

Andreja Ili

Slika 2. Iz vrede mogudih algoritama treba izabrati onaj najefikasniji

Intervali
Problem
Dat je niz , duine , celobrojnih intervala na realnoj pravoj. Koordinate intervala su iz
segmenta [
]. Nadi celobrojnu taku sa realne prave koja pripada najvedem broju intervala. Taka
pripada intervalu i kada se nalazi na njegovom rubu.
Ovo je jedan poznatiji primer. Ovde demo 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 prodi kroz svaku taku iz ovog
segmenta i ispitati koliko je intervala sadre. Algoritam moemo ubrzati ukoliko na poetku
izraunamo najmanju levu koordinatu intervala i najvedu desnu koordinatu i ispitivanje svedemo
samo na take iz ovog segmenta.
ak i kod ubrzane verzije segment koje treba ispitati moe biti upravo [
] (najgori mogudi
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). Pokazademo 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 nemogude). 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 naidi 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:

Primedujemo da kada naiemo na otvaranje nekog intervala, njegovu levu granicu, broj
pripadnosti intervalima se povedava 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 povedavamo broj preseka a tek kada
napustimo taku smanjujemo.
Kreirajmo dva nova niza
[
[

i
]
]

duine
i
i

i inicijalizujmo ih na slededi nain:


[
[

]
]

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 sledede
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 de biti maksimum
parcijalnih suma. Sloenost ovog algoritma je
.

Kao to vidimo za isti problem smo imali tri moguda 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
komplikovan, tako da demo kroz ovaj primer prodi samo u grubim crtama.
Problem
Dat je polinom
izraunati vrednost

stepena

preko niza koeficienata

. Problem nije

. Za konkretnu taku

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

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 nadi 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 ved
ga moemo nadograivati. U svakom koraku, nakon promene vrednosti stepen demo 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 de 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
elemente niza , ija je suma jednaka datom broju .

ispitati da li postoje dva

Navedeni primer se esto srede kao podproblem nekog vedeg 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 neopadajudi poretku. Definiimo sa
sumu
elemenata [ ] i [ ], pri emu je
. Kako je niz sortiran, [ ]
[
], imamo da vae
nejednakosti
i
Postavimo na poetku vrednost indeksa , levu granicu, na , a indeks , desnu granicu, na . Kada desnu
granicu smanjujemo, i sama suma
se smanjuje. Moguda 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 vradamo 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
, ved samo nastaviti
gde smo zadnji put imali da je suma bila veda:
. Drugim reima, promenjivu smanjujemo sve dok
ne dobijemo reenje ili ne dobijemo vrednost koja je manja od , kada povedavamo . 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 vedi 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 mogudi 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 naidi na dva reenja iste sloenosti. U
razmatranje njihove meusobne efikasnosti moemo ukljuiti konstante ili druge
sabirke koje smo zanemarili, ali to nede 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

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

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 de quicksort raditi u oekivanom vremenu, pre sortiranja niza treba napraviti
sluajnu permutaciju a zatim nju sortirati. Na taj nain moete izbedi 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
verovatnodom pojavljivanje istih vrednosti. Moe se pokazati da ukoliko vrednosti biramo na sluajan
nain iz segmenta [

], verovatnoda 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 nedemo izloiti ovde. Za one koji ele vie informacija, mogu
pogledati [1].
================================================================

01
02
03

for i = 1 to n do
j = random (i, n);
zameni (a [i], a [j]);

================================================================

Algoritam 9

Zanimljiva napomena je da ukoliko se indeks inicijalizuje kao


permutacija. Dokaz ove injenice ostavljamo itaocu.

ne dobija se sluajna

Priu o quicksort-u zavridemo 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 nadi donju granicu
sloenosti algoritma za konkretan problem. Ovo je nemogude odrediti za generalni sluaj, jer se dokaz
odnosi na sve mogude algoritme. Neohpodno je napre specificirati model koji odgovara porizvoljnom
algoritmu, a zatim dokazati da je vremenska sloenost proizvoljnog algoritma obuhvadenog tim
modelom veda ili jednaka od donje granice.
U daljem delu odeljka pokazademo da je optimalna sloenost algoritama za sortiranje niza upravo
. Model koji demo koristiti pri dokazivanju se zove stablo odluivanja. Stablo odluivanja
12

Analiza algoritma

Andreja Ili

modelira izraunavanje koje se najvedim 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 moguda odgovora, pri emu je svaki od njih pridruen grani koja izlazi iz
tog vora. Svakom listu je pridruen jedan od mogudih 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 pomodu 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

Teorema

Proizvoljno stablo odluivanja za sortiranje

duine

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 mogudi 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
. Koristedi 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 vedu ili jednaku od
. Sortiranje je mogude izvriti i koridenjem 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 demo 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 de 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
pomodi 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 redi da je dobar ukoliko se pri uporeivanju sa drugim postojedim 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 efikasnodu 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 nemogude
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, ved i oni koji jo nisu otkriveni, moraju se izvravati za vreme koje je vede ili jednako od neke
granice. Napomenimo i to da se kod takmarskih zadataka moe nadi 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 posveden 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 slededi
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 najvedi 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 obedao Draganetu
peticu za kraj kolske godine, ako dobije tano reenje pre kraja asa. Pomozite Draganetu da to bre
dobije taan rezultat. Duina niza nije veda od
, dok su elementi niza iz segmenta [
].
Ulaz:
4
3 -1 2 2

Izlaz:
11

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:
4
2 3 6 4

Izlaz:
2

Zadatak 011 [TopCoder, SRM 408] Mali Perica je dobio


svedica za roendan. Odluio je da
na slededi nain proslavi: prvog dana de upaliti jednu svedu da gori sat vremena; drugog dana de upaliti
dve svede u periodu od sat vremena; i tako dalje; -tog dana de upaliti sveda. Svakog dana upaljena
sveda se smanji tano za cm. Kada sveda dostigne visinu , ne moze se vie upotrebljavati. Odrediti
maksimalni broj dana tokom kojih Perica moe da slavi rodjandan.
Ulaz:
2 2 2

Izlaz:
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:
2

6 7
1 5 4 4 5 3

Zadatak 101
Ulaz:

Nadi broj brojeva iz segmenta [

] iji je zbir cifara paran.

Izlaz:
5

5 15

Zadatak 110 [Dravno takmienje, Srbija, 2007] Draganetu je dosadilo da ivi u gradu pa je reio da
sagradi sebi vikendicu, u kojoj de u miru i tiini modi da sprovodi svoje programerske ideje. Kako je
Dragane veoma vredan, reio je da sam napravi nacrte njegove kude iz snova. No, na poetku je trebalo
da odredi mesto na kome de 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 mogudih 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:
3
1
0
0

3
0
1
0

2 3
0
0
1

Izlaz:
7

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 ivkovid, Algoritmi, Matemtiki fakultet, Beograd, 2000.
[3] Donald E. Knuth, The Art of Computer Programming, Addison Wesley, Volume 1, 1980.
[4] Dejan ivkovid, Osnove dizajna i analize algoritama, Raunarski fakultet, Beograd, 2007.

19

You might also like