Você está na página 1de 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.

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

Algoritam brzog stepenovanja e 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 i

, ukoliko bi morali svaka biramo na kojima

operacije su potrebne za zamenu;

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 01 02

Programska konstrukcija Sekvenca naredbi :


P; Q;

Vremenska sloenost konstrukcije u zavisnosti od njenih delova

Uslovna naredba :
if (uslov) then P; else Q;

03 04

For petlja :
for i = 1 to n do P;

While / Repeat petlja :


while (uslov) do P;

gde je

broj interacija petlje u najgorem moguem 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 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 paran broj Primera radi, niz ima etiri uzastopna podniza parne sume i . , za koje je

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 .

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 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.

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

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 i i inicijalizujmo ih na sledei 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 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 komplikovan, tako da emo kroz ovaj primer proi 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 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 elemente niza , ija je suma jednaka datom broju . ispitati da li postoje dva

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 i 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 6

Algoritme sortiranje moete prouiti u bilo koji knjizi koja se bavi dizajnom i analizom algoritama. 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 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 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:
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 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:
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:
6 7 1 5 4 4 5 3

Izlaz: 2

Zadatak 101 Ulaz:


5 15

Nai broj brojeva iz segmenta [

] iji je zbir cifara paran.

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

Você também pode gostar