Sloˇ zenost algoritama

4.2 Sloˇ zenost algoritama

U proˇslom smo poglavlju vidjeli da se za isti problem mogu dati razliˇciti algoritmi. Ako su dana dva ili viˇse algoritma, koja rjeˇsavaju isti masovni problem, prirodno se postavlja pitanje koji od njih izabrati i koristiti. Zbog toga je potrebno odrediti mjeru kakvo´ce algoritma, kako bismo pri izboru mogli izabrati onaj algoritam koji je bolji. U ovom ´cemo se poglavlju baviti upravo mjerenjem kakvo´ce algoritama.

Kako mjeriti kakvo´cu pojedinog algoritma, odnosno ˇsto treba mjeriti

da bi se dobila kakvo´ca algoritma? Ono ˇsto se mjeri jest koliˇcina resursa koje algoritam treba da bi rijeˇsio problem. Dvije mjere koje se najˇceˇs´ce koriste za odredivanje kakvo´ce algoritma jesu vrijeme potrebno za izvrˇsenje algoritma i prostor potreban za pohranjivanje ulaznih i izlaznih rezultata, kao i medurezultata. Prva od ovih dviju mjera zove se vremenska sloˇzenost algoritma, a druga se zove prostorna sloˇzenost algoritma. U ovom ´cemo se poglavlju, medutim, baviti samo vremenskom sloˇzenoˇs´cu algoritama, jer je ona mjera koja se najˇceˇs´ce koristi za ocjenjivanje kakvo´ce algoritama.

POGLAVLJE 4. ALGORITMI 131

Prostorna se sloˇzenost koristi mnogo rijede. Za to postoje razlozi u koje sada ne´cemo ulaziti.

Prvi problem koji se javlja kod odredivanja vremenske sloˇzenosti algo- ritma jest kako na´ci mjeru koja ne´ce ovisiti o brzini raˇcunala na kojem se algoritam izvodi, ve´c samo o samom algoritmu. Vrijeme potrebno algoritmu

da izraˇcuna rjeˇsenje znatno ´ce ovisiti o brzini raˇcunala na kojem se algoritam izvodi. Tako, uzmemo li vrijeme trajanja dvaju algoritama, takva ´ce mjera vrijediti jedino ako se oba algoritma izvode na istom raˇcunalu. Medutim, takva mjera ne bi op´cenito mnogo znaˇcila. Mjera koju ˇzelimo izvesti jest takva da ona ne ovisi o raˇcunalu, ve´c samo o algoritmu. Na taj bismo naˇcin dobili mjeru koja bi imala apsolutno znaˇcenje.

Stoga se vremenska sloˇzenost ne izraˇzava vremenom potrebnim da algo- ritam izraˇcuna rezultat, ve´c brojem elementarnih operacija koje algoritam mora izvesti da bi izraˇcunao rjeˇsenje. Brˇza raˇcunala izvode elementarne operacije brˇze od sporijih. No, radi li se o raˇcunalima koja imaju procesore iste arhitekture, koji se tek razlikuju u brzini internog sata, onda ´ce broj operacija koje algoritam mora izvesti biti isti. Naravno, radi li se o razliˇcitim procesorima, i broj ´ce se elementarnih operacija razlikovati. No, ove ´ce raz- like biti neznatne: broj elementarnih operacija razlikovat ´ce se najviˇse za neku multiplikativnu konstantu.

složenost

f max

f avg

f min

n 0 Duljina ulaza

Slika 4.3

Sljede´ci problem je ˇsto broj operacija koje izvodi algoritam nije fiksan, ve´c ovisi o veliˇcini ulaza. Dakle, instance problema razliˇcitih dimenzija za-

4.2. SLO ˇ ZENOST ALGORITAMA htjevat ´ce razliˇcit broj elementarnih operacija za obradu. Medutim, masovni

problem moˇze imati i razliˇcite instance iste duljine, ˇcija vremenska sloˇzenost ne mora biti jednaka. Dakle, sloˇzenost algoritma nije funkcija veliˇcine ulaza (vidi sliku 4.3.)

Stoga se ocjena sloˇzenosti vezuje uz odredenu instancu problema. Naj- ˇceˇs´ce se koristi ocjena sloˇzenosti najgoreg sluˇcaja. Pri tome se ocjenjuje sloˇzenost one instance problema odredene duljine za ˇciju obradu algoritam treba najviˇse vremena. Druga mogu´cnost, koja nije tako znaˇcajna jest ocje- na sloˇzenosti najboljeg sluˇcaja. Tre´ca, najbolja, ali i najsloˇzenija za izra-

ˇcunavanje, jest ocjena sloˇzenosti prosjeˇcnog sluˇcaja. Ova sloˇzenost nam opisuje kako ´ce se u prosjeku algoritam ponaˇsati. Dok se prve dvije sloˇzenosti vezuju za jednu instancu problema, u posljednjoj je potrebno u obzir uzeti sve instance problema odredene duljine ulaza, te svakoj od njih pridruˇziti vjerojatnost pojavljivanja. Odabirom jedne od ove tri mogu´ce sloˇzenosti, dobijamo funkciju sloˇzenosti algoritma u ovisnosti o duljini ulaza.

No, sama sloˇzenost, bez obzira radi li se o maksimalnoj, minimalnoj ili prosjeˇcnoj, moˇze biti funkcija koja nije analitiˇcka, a ako i jest analitiˇcka, moˇze zahtjevati vrlo sloˇzenu formulu za prikaz. Podsjetimo se: analitiˇcka je ona funkcija koja se moˇze prikazati formulom izgradenom pomo´cu arit- metiˇckih operacija i transcedentnih funkcija. S druge strane, ˇzelimo aproksi- mativno izraziti sloˇzenost, a ne toˇcno. Naime, toˇcan broj operacija je vrlo teˇsko izraˇcunati, a i taj raˇcun ne bi dao neki znaˇcajan rezultat. Osim toga, sama brzina rada algoritma, kao ˇsto smo ve´c rekli ovisit ´ce o raˇcunalu na kojem se algoritam izvodi. Sve su to razlozi zbog kojih se toˇcan raˇcun sloˇzenosti ne isplati. Ono ˇsto se isplati, i ˇsto ´ce znaˇcajno razlikovati al- goritme, jest ˇcinjenica koliko brzo ´ce sloˇzenost algoritma rasti u ovisnosti porasta veliˇcine ulaza. Zbog toga ´cemo funkciju sloˇzenosti aproksimirati jednostavnijom funkcijom, koja ´ce dobro opisivati rast funkcije sloˇzenosti pove´canjem nezavisne varijable (vidi sliku 4.3). Zato je prikladno uvesti notaciju koja ´ce jednostavno opisivati brzinu rasta funkcije sloˇzenosti al- goritma. Uvodi se asimptotska ocjena rasta funkcije. Najˇceˇs´ce, kada se izraˇcunava sloˇzenost, aproksimacija se vrˇsi tako da aproksimativna funkcija koja je jednostavnija od same funkcije sloˇzenosti, dobro asimptotski opisuje rast funkcije sloˇzenost. No, dozvoljava se da za male n-ove ova aproksimacija ne vrijedi (vidi sliku 4.3). Naime, pretpostavlja se da ´ce svi algoritmi, bez obzira na njihovu sloˇzenost raditi zadovoljavaju´ce za male n-ove, a da ´ce ve´ci problemi nastati kad veliˇcina ulaza poraste. Stoga se kod definicije asim- ptotskih ocjena funkcija dozvoljava da ocjena ne ocjenjuje funkciju dobro za

n<n 0 . Na gornjem je grafu funkcija kojom se ocjenjuje sloˇzenost nacrtana tako da omeduje odozgo sloˇzenost u najgorem sluˇcaju. To, medutim, nije nuˇzno. Naime, ako je funkcija f (n) ocjena sloˇzenosti nekog algoritma, onda

´ce i funkcija f (n) + c takoder biti funkcija koja ocjenjuje sloˇzenost tog al- goritma. Radi se o tome da nas ne zanima stvarni iznos funkcije sloˇzenosti, ve´c samo koliko brzo ta funkcija raste. Ovime smo zavrˇsili opis ocjene kakvu

POGLAVLJE 4. ALGORITMI 133

ˇzelimo napraviti, pa nam samo joˇs preostaje da definiramo asimptotske ocje- ne funkcija sloˇzenosti algoritama.

Definicija 4.1 Zadane su funkcije f, g : R → R.

1. Kaˇzemo da je f = O(g) ako postoji n

0 ∈Nic∈R takvi da za svaki n ≥n 0 vrijedi |f(n)| ≤ c · |g(n)|. Druga oznaka: f(n) ¹ g(n).

2. Kaˇzemo da je f = Ω(g) ako postoji n 0 ∈Nic∈R + takvi da za svaki n ≥n 0 vrijedi |f(n)| ≥ c · |g(n)|. Druga oznaka: f(n) º g(n).

3. Kaˇzemo da je f = o(g) ako postoji n

0 ∈Nic∈R takvi da za svaki n ≥n 0 vrijedi |f(n)| < c · |g(n)|. Druga oznaka: f(n) ≺ g(n).

4. Kaˇzemo da je f = ω(g) ako postoji n 0 ∈Nic∈R + takvi da za svaki n ≥n 0 vrijedi |f(n)| > c · |g(n)|. Druga oznaka: f(n) ≻ g(n).

2 ∈R takvi da za svaki n ≥n 0 vrijedi c 1 · |g(n)| ≤ |f(n)| ≤ c 2 · |g(n)|. Druga oznaka:

5. Kaˇzemo da je f = Θ(g) ako postoji n 0 ∈Nic 1 ,c

f (n) ∼ g(n). Iako ova definicija vrijedi za realne funkcije realne varijable, funkcije

sloˇzenosti su uvijek funkcije sa N u N. Mi ´cemo, medutim, u ovom poglavlju funkcije s kojima ´cemo raditi definirati neˇsto ˇsire, kao funkcije sa N u R. Razlog tome je ˇsto se kod ocjene sloˇzenosti ˇcesto javljaju funkcije koje nisu

√ funkcije sa skupa prirodnih brojeva u skup prirodnih brojeva. lg n, ni

sl. U biti, kada se jave ove funkcije, sloˇzenost je funkcija sa skupa prirod- nih brojeva u skup prirodnih brojeva, ali se njihova brzina rasta ocjenjuje analitiˇckom funkcijom kojoj kodomena nije skup N.

Definirane ocjene formaliziraju intuitivni pojam brzine rasta funkcije. Tako moˇzemo kazati da ako vrijedi f (n) = O(g(n)) onda funkcija f ne raste brˇze od g. Ako je pak f (n) = o(g(n)), onda kaˇzemo da funkcija f raste sporije od g. Ako su O i o ocjene koje ocjenjuju funkciju ograniˇcavaju´ci je odozgo, onda su Ω i ω ocjene koje to rade odozdo. Dakle, ako je f (n) = Ω(g(n)), onda kaˇzemo da funkcija f ne raste sporije od g, a ako je f (n) = ω(g(n)), onda kaˇzemo da funkcija f raste brˇze od g. Na kraju imamo ocjenu Θ, koja u sebi objedinjuje ocjene O i Ω. Ako je f (n) = Θ(g(n)), onda kaˇzemo da funkcije f i g rastu jednako brzo.

Iz definicije izravno slijede neki odnosi izmedu ovih notacija: Korolar 4.1

• f(n) = Θ(g(n)) ako i samo ako je f(n) = O(g(n)) i f(n) = Ω(g(n)). • Ako je f(n) = o(g(n)) onda je f(n) = O(g(n)). Obrat ne vrijedi.

4.2. SLO ˇ ZENOST ALGORITAMA

• Ako je f(n) = ω(g(n)) onda je f(n) = Ω(g(n)). Obrat ne vrijedi. • f(n) = O(g(n)) ako i samo ako je g(n) = Ω(f(n)). • f(n) = o(g(n)) ako i samo ako je g(n) = ω(f(n))

Dokaz. Dokaz izvedite sami. Posljednje dvije toˇcke u prethodnom korolaru nazivaju se transpozitna

simetriˇcnost. Propozicija 4.2 m Neka je P (n) = a

0 +a 1 n+...+a m n polinom m-tog stupnja. Onda je P (n) = Θ(n m ).

Dokaz. Primjenom nejednakosti trokuta na | P (n) | imamo: |P (n)| = |a m

0 +a 1 n+...+a m n |

0 |n + |a 1 |n +...+ |a m |n

0 | + |a 1 | + . . . + |a m |)n =c ·n Pokaˇzimo i obratno. Treba pokazati da je n m = O(P (n)). Napiˇsimo polinom

=( m |a

P (n) u sljede´cem obliku:

P (n) = n (a 0 · m +a 1 ·

+...+a m ).

n m −1

a Za dovoljno veliki n m |a m | ≥n

0 vrijedi da je n m i ≤ 2m , a isto tako je |a | − 2m ≤

=n ( |a m |−m·

Time je dokazano da vrijedi P (n) = Ω(n m ), ˇsto zajedno s prije do- kazanom tvrdnjom P (n) = O(n), a prema korolaru 4.1 daje tvrdnju ove propozicije.

Iz prethodne propozicije proizlazi sljede´ci korolar: Korolar 4.2 Za proizvoljni a ∈ R je a = Θ(1).

Sljede´ci teorem daje karakterizaciju asimptotskih notacija.

POGLAVLJE 4. ALGORITMI 135

Teorem 4.1

f 1. Ako je lim (n) n →∞ g (n) = 0, onda je f (n) = o(g(n))

f 2. Ako je lim (n)

= C, onda je f (n) = O(g(n))

→∞ g (n)

g 3. Ako je lim (n)

f (n) n = 0, onda je f (n) = ω(g(n)) →∞

g 4. Ako je lim (n) n →∞ f (n) = C, onda je f (n) = Ω(g(n))

g 5. Ako je lim (n) n →∞ f (n) = C, C 6= 0, onda je f(n) = Θ(g(n)) Dokaz. Sve tvrdnje se dokazuju sliˇcno. Dokazat ´cemo, na primjer, prvu

tvrdnju. Neka je

→∞ g(n)

Onda je i

|f(n)| = 0. →∞ |g(n)|

n lim

Prema definiciji limesa to znaˇci da za svaki ε > 0 postoji n 0 ∈ N takav da vrijedi da je

¯ ¯ f (n) ¯ ¯

¯ < ε. ¯ g(n) ¯

No, sada imamo

¯ ¯ f (n) ¯ ¯

¯ = |f(n)| < ε. ¯ g(n) ¯ |g(n)|

Pomnoˇzimo li gornju jednadˇzbu s |g(x)| > 0 dobit ´cemo

|f(n)| < ε|g(n)|,

odakle slijedi da je f (n) = o(g(n)). Ostale tvrdnje dokaˇzite sami. Sada ´cemo dati joˇs neke odnose medu funkcijama koje se ˇcesto javljaju

kod analize sloˇzenosti algoritama.

Propozicija 4.3 Ako je a < b, onda je n a ≺n b .

4.2. SLO ˇ ZENOST ALGORITAMA Dokaz. Vrijedi da je

n a 1 n lim →∞ n b = lim n →∞ n b −a

No, kako je b − a > 1, onda je

→∞ n b n →∞ n b −a Sada prema teoremu 4.1 slijedi da je n a ≺n b .

Sljede´ce propozicije se odnose na logaritme i njihove odnose s potenci- jama.

Propozicija 4.4 Za svaka dva broja a, b ∈ N\{1} vrijedi da je log a n ∼ log b n.

Dokaz. Poznato je da za logaritme po razliˇcitim bazama a, b ∈ N\{1} vrijedi

log b n log a n= log b a

Stavimo li c = 1 log b a , imamo log a n=c · log b n, odnosno c · log b n ≤ log a n ≤ c · log b n ˇsto daje traˇzenu tvrdnju. Ova propozicija nam govori da logaritmi po svim bazama asimptotski jednako brzo rastu. Stoga se ˇcesto, pri ocjeni sloˇzenosti algoritma, baza logaritma zanemaruje i piˇse se lg n, ˇsto znaˇci ”logaritam od n po proizvoljnoj bazi”.

a a b Propozicija 4.5 a Neka je a ∈N 0 . Tada vrijedi da je n ≺n · lg n +1 ≺n Dokaz. Jasno je da vrijedi

Primijenimo li L’Hospitalovo pravilo na posljednji limes dobit ´cemo

pri ˇcemu konstanta c ovisi o bazi logaritama. Nakon b primjena L’Hospitalovog pravila dobija se

n a · lg b n

c b · b!

n lim

= lim

n a +1

n →∞

Dakle,

POGLAVLJE 4. ALGORITMI 137

odakle slijedi n a a · lg n ≺ n +1 . Druga se tvrdnja pokazuje sliˇcno. Dokaz provedite sami. Iz gornje propozicije izlazi sljede´ci korolar:

Korolar 4.3 lg n = o(n). Uoˇcimo iz gornjeg korolara da logaritmi asimptotski rastu sporije od

linearne funkcije. Na kraju ´cemo dati propoziciju, koja u ovaj kontekst stavlja eksponen- cijalne funkcije.

a Propozicija 4.6 n Neka su a ∈ N i neka je b ∈ N\{1}. Tada je n ≺b Dokaz. Primijenimo li na limes

b n n lim →∞ n a

a puta L’Hospitalovo pravilo, dobivamo

Iz ˇcega, prema teoremu 4.1, slijedi tvrdnja propozicije. Ova propozicija je vrlo vaˇzna i u svom iskazu daje jednu vrlo ˇcesto spo- minjanu tvrdnju, kako u teoriji algoritama, tako i u drugim matematiˇckim disciplinama: tvrdnju da eksponencijalna funkcija raste brˇze od bilo koje polinomne funkcije.

Propozicija 4.7 Neka su a, b

∈ N\{1}, pri ˇcemu je a < b. Tada je a n ≺b . Dokaz. a Kako je 0 <

b < 1, slijedi da je

pa po teoremu 4.1 vrijedi a n = o(b ).

I na kraju, dolazi teorem koji opisuje joˇs neka vaˇzna svojstva uvedenih asimptotskih ocjena funkcija

Teorem 4.2 Za opisane ocjene sloˇzenosti rasta funkcije vrijede sljede´ca svojstva:

1. Tranzitivnost: (a) Ako je f (n) = O(g(n)) i g(n) = O(h(n)) onda je i f (n) =

O(h(n)).

4.2. SLO ˇ ZENOST ALGORITAMA (b) Ako je f (n) = o(g(n)) i g(n) = o(h(n)) onda je i f (n) = o(h(n)).

(c) Ako je f (n) = Ω(g(n)) i g(n) = Ω(h(n)) onda je i f (n) = Ω(h(n)). (d) Ako je f (n) = ω(g(n)) i g(n) = ω(h(n)) onda je i f (n) = ω(h(n)).

(e) Ako je f (n) = Θ(g(n)) i g(n) = Θ(h(n)) onda je i f (n) = Θ(h(n)).

2. Refleksivnost: (a) f (n) = O(f (n))

(b) f (n) = Ω(f (n)) (c) f (n) = Θ(f (n))

3. Simetriˇ cnost: (a) Ako je f (n) = Θ(g(n)) onda je i g(n) = Θ(f (n)). Dokaz. Dokaz izvedite sami.

Zadatak 4.2 Pokaˇzite da

1. je Θ relacija ekvivalencije na skupu funkcija f R → R.

2. su O i Ω relacije totalnog uredaja na skupu funkcija f : R → R. Zadatak 4.3 Dokaˇzite sljede´ce tvrdnje:

1. max {f(n), g(n)} = Θ(f(n) + g(n)).

b ∈ R, b ∈ R b vrijedi (n + a) = Θ(n ). Sada kad smo razvili aparat za ocjenjivanje sloˇzenosti algoritama, pri-

2. Za a

mijenimo taj aparat na Euklidov algoritam, koji je opisan u prethodnom poglavlju.

Primjer 4.1 Izraˇcunajmo sloˇzenost Euklidovog algoritma u najgorem slu- ˇcaju.

Za brojeve a i b izraˇcuna se ostatak od dijeljenja a mod b te se algoritam ponavlja za brojeve b u a mod b sve dok ne bude b = 0. Jasno je da je a mod b < b, ali da je a mod b ≥ 0.

Koraci od 2 do 4 Euklidovog algoritma ˇcine petlju. Ve´c smo ranije uoˇcili

da se ta petlja moˇze izvesti najviˇse b-puta. Pogledajmo ˇsto se dogada u jednom koraku te petlje. Izraˇcunava se a mod b i upisuje u r. Vrijednost varijable b se upisuje u a, a vrijednost varijable r u b. Na kraju se provjerava je li b = 0, te ako nije, vra´ca se na korak 2. Sve to, ˇsto smo opisali moˇze

se izvesti u konstantnom vremenu c 1 . Posljednji se korak algoritma izvodi toˇcno jednom, a njegova je sloˇzenost konstantna, recimo c 2 . Ako duljinu ulaza definiramo kao duljinu manjeg od dvaju ulaznih brojeva, imat ´cemo:

POGLAVLJE 4. ALGORITMI 139

T Euklid

max

(n) = q c ·n+c 2 ,

odnosno

T Euklid

max

(n) = Θ(n).