You are on page 1of 18

Glava 3

Efikasnost programa i sloenost


z
izraunavanja
c
Pored svojstva ispravnosti programa, veoma je vano i pitanje koliko program zahteva vremena (ili
z

izvrenih instrukcija) i memorije za svoje izvravanje. Cesto se algoritmi ne izvravaju isto niti zahtevaju
s
s
s
isto memorije za sve ulazne vrednosti, pa je potrebno nai nain za opisivanje i poredenje efikasnosti (ili
c c
sloenosti) razliitih algoritama. Obino se razmatraju:
z
c
c

vremenska sloenost algoritma;


z

prostorna (memorijska) sloenost algoritma.


z

u terminima konkretnog vremena/prostora utroenog za neku konkretnu ulaznu veliinu;


s
c

Vremenska i prostorna sloenosti mogu se razmatrati


z

u terminima asimptotskog ponaanja vremena/prostora kada ulazna veliina raste.


s
c

U nekim situacijama vremenska ili prostorna sloenost programa nisu mnogo vane (ako se zadatak
z
z
izvrava brzo, ne zahteva mnogo memorije, ima dovoljno raspoloivog vremena itd), ali u nekim je vredna
s
z
uteda svakog sekunda ili bajta. I u takvim situacijama dobro je najpre razviti najjednostavniji program
s
koji obavlja dati zadatak, a onda ga modifikovati ako je potrebno da se uklopi u zadata vremenska ili
prostorna ogranienja.
c
c
c
Vremenska sloenost algoritma odreduje i njegovu praktinu upotrebljivost tj. najveu dimenziju
z
ulaza za koju je mogue da e se algoritam izvriti u nekom razumnom vremenu. Analogno vai i za
c
c
s
z
prostornu sloenost.
z
U nastavku teksta najee e se govoriti o vremenskoj sloenosti algoritama, ali u veini situacija
c sc c
z
c
potpuno analogna razmatranja mogu se primeniti na prostornu sloenost.
z
3.1

Merenje i procenjivanje korienih resursa


sc

Vreme izvravanja programa moe biti procenjeno ili izmereno za neke konkretne ulazne vrednosti i
s
z
neko konkretno izvravanje.
s
3.1.1

Merenje utroenog vremena


s

Najjednostavnija mera vremenske efikasnosti programa (ili neke funkcije) je njegovo neposredno vreme
izvravanja za neke konkretne vrednosti. U standardnoj biblioteci raspoloiva je, kroz datoteku zaglavlja
s
z
time.h jednostavna podrka za merenje vremena. Struktura time_t slui za reprezentovanje vremena,
s
z
ali standard ne propisuje na koji nain se reprezentuje vreme. Obino se vreme reprezentuje kao broj
c
c
sekundi od poetka godine 1970-e. Funkcija time:
c
time_t time(time_t *time);

27

vraa vreme, izraeno u sekundama, proteklo od poetka epohe, obino od poetka godine 1970-e.
c
z
c
c
c
Funkcija difftime:
double difftime(time_t end, time_t start);

vraa razliku izmedu dva vremena, izraenu u sekundama. Ta razlika je obino celobrojna (ako je tip
c
z
c
celobrojan), ali je, zbog optosti, povratni tip ipak double.
s
Struktura clock_t slui za reprezentovanje vremena rada tekueg procesa, ali standard ne propisuje
z
c
na koji nain se reprezentuje. Funkcija clock:
c
time_t

clock_t clock();

vraa trenutno vreme, ali zbog razliitosti moguih implementacija, jedino ima smisla razmatrati razliku
c
c
c
dva vremena dobijena ovom funkcijom. Razlika predstavlja broj vremenskih tikova, specifinih za dati
c
z
sistem, pa se broj sekundi izmedu dva vremena moe dobiti kao razlika dve vrednosti tipa clock_t podeljena konstantom CLOCKS_PER_SEC. Vreme izmereno na ovaj nain je vreme koje je utroio sam program
c
s
(a ne i drugi programi koji se istovremeno izvravaju) i moe se razlikovati od proteklog apsolutnog
s
z
vremena (moe biti krae ako, na primer, ima vie programa koji rade istovremeno, ili due ako, na
z
c
s
z
primer, program koristi vie raspoloivih jezgara procesora).
s
z
Navedene funkcije mogu se koristiti za merenje vremena koje troi neka funkcija ili operacija. Pres
cizniji rezultati se dobijaju ako se meri izvravanje koje se ponavlja veliki broj puta. S druge strane,
s
umesto u sekundama, vreme koje troi neka funkcija ili operacija esto se pogodnije izraava u nanosekuns
c
z
dama kao u narednom primeru. U merenjima ovog tipa treba biti oprezan jer i naredbe petlje troe
s
nezanemariv udeo vremena. Dodatno, prilikom kompilacije treba iskljuiti sve optimizacije (na primer,
c
za kompilator gcc, to je opcija -O0) kako se ne bi merilo vreme za optimizovanu verziju programa.
Naredni program ilustruje merenje vremena koje troi funkcija f.
s

Program 3.1.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BROJ_ITERACIJA
#define NS_U_SEKUNDI

1000000000
1000000000 /* broj ns u sekundi */

int f(void) {
...
}
int main() {
int i;
double dt;
clock_t t = clock();
for(i=0; i<BROJ_ITERACIJA; i++)
f()

dt=((double)NS_U_SEKUNDI*(clock() - t))/CLOCKS_PER_SEC/BROJ_ITERACIJA;
printf("Utroseno vreme: %.2lf ns\n",dt);
return 0;

U zaglavlju time.h postoje i funkcije koje pruaju podrku za baratanje datumima, ali one nisu
z
s
relevantne za merenje vremena rada programa pa nee ovde biti opisivane.
c
28

3.1.2

Procenjivanje potrebnog vremena

3.1.3

Profajliranje

Vreme izvravanja pojedinih delova koda (na nekom konkretnom raunaru) moe da se proceni ukoliko
s
c
z
je raspoloiva procena vremena izvravanja pojedinih operacija. Na primer, na raunaru sa procesorom
z
s
c
Intel Core i7-2670QM 2.2GHz koji radi pod operativnim sistemom Linux, operacija sabiranja dve vrednosti tipa int troi oko treinu nanosekunde, a operacija mnoenja oko jedne nanosekunde (dakle, za
s
c
z
jednu sekundu se na tom raunaru moe izvriti milijardu mnoenja celih brojeva). Procena vremena
c
z
s
z
izvravanja pojedinih operacija i kontrolnih struktura na konkretnom raunaru moe se napraviti na
s
c
z
nain opisan u poglavlju 3.1.1.
c
Procene vremena izvravanja programa na osnovu procena vremena izvravanja pojedinanih instruks
s
c
cija treba uzimati sa velikom rezervom jer moda ne uzimaju u obzir sve procese koji se odigravaju tokom
z
izvravanja programa. Dodatno, treba imati na umu da vreme izmereno na jednom konkretnom raunaru
s
c
zavisi i od operativnog sistema pod kojim raunar radi, od jezika i od kompilatora kojim je napravljen
c
izvrni program za testiranje, itd.
s
Postoje mnogi alati za analizu i unapredenje performansi programa i najee se zovu profajleri
c sc
(engl. profiler). Njihova osnovna uloga je da prue podatke o tome koliko puta je koja funkcija pozvana
z
tokom (nekog konkretnog) izvravanja, koliko je utroila vremena i slino. Ukoliko se razvijeni program
s
s
c
ne izvrava eljeno brzo, potrebno je unaprediti neke njegove delove. Prvi kandidati za izmenu su delovi
s z
koji troe najvie vremena.
s
s
Za operativni sistem Linux, popularan je sistem valgrind koji objedinjuje mnotvo alata za dis
namiku analizu rada programa, ukljuujui profajler callgrind. Profajler callgrind se poziva na
c
c c
sledei nain:
c c
valgrind --tool=callgrind mojprogram argumenti

gde mojprogram oznaava izvrni program koji se analizira, a argumenti njegove argumente (komandne
c
s
linije). Program callgrind izvrava zadati program mojprogram sa argumentima argumenti i registruje
s
informacije o tome koja funkcija je pozivala koje funkcije (ukljuujui sistemske funkcije i funkcije iz stanc c
dardne biblioteke), koliko je koja funkcija utroila vremena itd. Detaljniji podaci se mogu dobiti ako je
s
program preveden u debag reimu (gcc kompilatorom, debag verzija se dobija korienjem opcije -g).
z
sc
Prikupljene informacije program callgrind uva u datoteci sa imenom, na primer, callgrind.out.4873.
c
Ove podatke moe da na pregledan nain prikae, na primer, program kcachegrind:
z
c
z
kcachegrind callgrind.out.4873

z
c
Slika 3.1 ilustruje rad programa kcachegrind. Uvidom u prikazane podatke, programer moe da uoi
funkcije koje troe najvie vremena i da pokua da ih unapredi i slino.
s
s
s
c
3.2

notacija i red sloenosti algoritma


z

Vreme izvravanja programa moe biti procenjeno ili izmereno za neke konkretne ulazne vrednosti i
s
z
neko konkretno izvravanje. No, vreme izvravanja programa moe biti opisano optije, u vidu funkcije
s
s
z
s
koja zavisi od ulaznih argumenata.

Cesto se algoritmi ne izvravaju isto za sve ulaze istih veliina, pa je potrebno nai nain za opisivanje i
s
c
c c
c
c
z
poredenje efikasnosti razliitih algoritama. Analiza najgoreg sluaja zasniva procenu sloenosti algoritma
na najgorem sluaju (na sluaju za koji se algoritam najdue izvrava u analizi vremenske sl oenosti,
c
c
z
s
z
ili na sluaju za koji algoritam koristi najvie memorije u analizi prostorne sloenosti). Ta procena
c
s
z
moe da bude varljiva, ali predstavlja dobar opti nain za poredenje efikasnosti algoritama. U nekim
z
s
c
situacijama mogue je izraunati proseno vreme izvravanja algoritma, ali i takva procena bi esto mogla
c
c
c
s
c
da bude varljiva. Analiziranje najboljeg sluaja, naravno, nema smisla. U nastavku e, ako nije reeno
c
c
c
drugaije, biti podrazumevana analiza najgoreg sluaja.
c
c
Neka je funkcija () jednaka broju instrukcija koje zadati algoritam izvri za ulaz veliine . Tabela
s
c
3.1 prikazuje potrebno vreme izvravanja algoritma ako se pretpostavi da jedna instrukcija traje jednu
s
nanosekundu, tj. 0.001 mikrosekundi ( ).
s
Vodei lan u funkciji () odreduje potrebno vreme izvravanja. Tako, na primer, ako je broj
c c
c
c
instrukcija 2 + 2, onda za ulaz dimenzije 1000000, lan 2 odnosi 16.7 minuta dok lan 2 odnosi
samo dodatne dve mikrosekunde. Vremenska (a i prostorna) sloenost je, dakle, skoro potpuno odredena
z
29

Slika 3.1: Ilustracija prikaza u programu kcachegrind podataka dobijenih profajliranjem


()
10
20
30
40
50
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000
1,000,000,000

log
0.003
0.004
0.005
0.005
0.006
0.007
0.010
0.013
0.017
0.020
0.023
0.027
0.030

0.01
0.02
0.03
0.04
0.05
0.1
1.0
10
0.10
1
0.01
0.10
1

log
0.033
0.086
0.147
0.213
0.282
0.644
9.966
130
1.67
19.93
0.23
2.66
29.9

2
0.1
0.4
0.9
1.6
2.5
10
1
100
10
16.7
1.16
115.7
31.7

2
1
1
1
18.3
13
4 1013

!
3.63
77.1
8.4 1015

Tabela 3.1: Ilustracija vremena izvravanja


s
vodeim (ili dominantnim) lanom u izrazu koji odreduje broj potrebnih instrukcija. Na upotrebljivost
c
c
algoritma ne utiu mnogo ni multiplikativni i aditivni konstantni faktori u broju potrebnih instrukcija,
c
koliko asimptotsko ponaanje broja instrukcija u zavisnosti od veliine ulaza. Ovakav pojam sloenosti
s
c
z
uvodi se sledeom definicijom.
c

Definicija 3.1.

Ako postoje pozitivna konstanta i prirodan broj takvi da za funkcije i nad


prirodnim brojevima vai
z

() () za sve vrednosti vee od


c
onda piemo
s

= ()
i itamo je veliko ,o od .
c

Naglasimo da ne oznaava neku konkretnu funkciju, ve klasu funkcija i uobiajeni zapis


c
c
c
zapravo znai ().
c
30

= ()

Lako se pokazuje da aditivne i multiplikativne konstante ne utiu na klasu kojoj funkcija pripada (na
c
z
primer, u izrazu 52 + 1, za konstantu 1 kaemo da je aditivna, a za konstantu 5 da je multiplikativna).
c
Zato se moe rei da je neki algoritam sloenosti (2 ), ali se obino ne govori da pripada, na primer,
z c
z
s
z
klasi (52 + 1), jer aditivna konstanta 1 i multiplikativna 5 nisu od sutinske vanosti. Zaista, ako
jedan algoritam zahteva 52 + 1 instrukcija, a drugi 2 , i ako se prvi algoritam izvrava na raunaru
s
c
koji je est puta bri od drugog, on e biti bre izvren za svaku veliinu ulaza. No, ako jedan algoritam
s
z
c
z
s
c
c
c
s
z
zahteva 2 instrukcija, a drugi , ne postoji raunar na kojem e prvi algoritam da se izvrava bre od
drugog za svaku veliinu ulaza.
c

Primer 3.1.

Moe se dokazati da vai:


z
z

2 = (2 )
2 + 10 = (2 )
10 2 + 10 = (2 )
10 2 + 8 + 10 = (2 )
2 = (3 )
2 = (2 )
2 + 10 = (2 )
10 2 + 10 = (2 )
2 + 2 = (2 )
3 + 2 = (3 )
2 + 2 = (2 )

Vae sledea svojstva:


z
c
ako vai 1 = (1 ) i 2 = (2 ), onda vai i 1 2 = (1 2 ).
z
z
z
ako vai 1 = (1 ) i 2 = (2 ), onda vai i 1 + 2 = (|1 | + |2 |).
z
ako vai = () i i su pozitivne konstante, onda vai i + =
z
z

Definicija 3.2.

().

Ako postoje pozitivne konstante 1 i 2 i prirodan broj takvi da za funkcije i nad


prirodnim brojevima vai
z
c
1 () () 2 () za sve vrednosti vee od

onda piemo
s

= ()
i itamo je veliko teta od .
c

Ako vai
z

Primer 3.2.

= (),

onda vai i
z

= ()

= ( ).

Moe se dokazati da vai:


z
z

10 2 + 10 = (2 )
2 + 2 = (2 )

Definicija 3.3.

Ako je () vreme izvravanja algoritma (iji ulaz karakterie prirodan broj ) i ako
s
c
s
vai = (), onda kaemo da je algoritam sloenosti ili reda () ili da algoritam pripada klasi
z
z
z
().

Analogno prethodnoj definiciji definie se kada algoritam pripada klasi (). Takva informacija
s
obezbeduje da algoritam koji zahteva, na primer, 5 koraka jeste reda (), ali ne i reda (2 ). S
druge strane, za taj algoritam moe da se smatra da je reda ali i reda (2 ) (mada ne i reda, na
z
primer, (log )). Informacija o sloenosti algoritma u terminima (koja daje i gornju i donju granicu)
z

je preciznija nego informacija u terminima (koja daje samo gornju granicu). Cesto je jednostavnije
sloenost algoritma iskazati u terminima nego u terminima . Obino se za sloenost algoritma koristi
z
c
z
notacija i onda kada se sloenost moe iskazati u terminima . Kada se kae da algoritam pripada
z
z
z
klasi () obino se podrazumeva da je najmanja takva klasa (ili makar najmanja za koju se to
c
moe dokazati). I i notacija se koriste i u analizi najgoreg sluaja i u analizi prosenog sluaja.
z
c
c
c
Priroda parametra klase sloenosti (na primer, u () ili u (2 + )) zavisi od samog algoritma.
z
Sloenost nekih algoritama zavisi od vrednosti argumenata, a nekih od broja argumenata. Na primer,
z
31

sloenost funkcije za izraunavanje faktorijela ulazne vrednosti zavisi od i jednaka je (za razumnu
z
c
implentaciju) (). Sloenost funkcije koja rauna prosek ulaznih brojeva ne zavisi od vrednosti tih
z
c
brojeva, ve samo od toga koliko ih ima i jednaka je (). Sloenost funkcije koja sabira dva broja
c
z
je konstantna tj. pripada klasi (1). Sloenost izraunavanja neke funkcije moe da zavisi i od vie
z
c
z
s
parametara. Na primer, algoritam koji za ulaznih taaka proverava da li pripadaju unutranjosti
c
s
ulaznih trouglova, oekivano ima sloenost ().
c
z
Za algoritme sloenosti () kaemo da imaju linarnu sloenost, za (2 ) kvadratnu, za (3 ) kubnu,
z
z
z
za ( ) za neko polinomijalnu, a za (log ) logaritamsku.
3.3

Izraunavanje sloenosti funkcija


c
z

Izraunavanje (vremenske i prostorne) sloenosti funkcija se zasniva na odredivanju tanog ili pric
z
c
blinog broja instrukcija koje se izvravaju i memorijskih jedinica koje se koriste. Tano odredivanje
z
s
c
tih vrednosti je najee veoma teko ili nemogue, te se obino koriste razna pojednostavljivanja. Na
c sc
s
c
c
primer, u ovom kontekstu pojam jedinina instrukcija se obino pojednostavljuje, te se moe smatrati
c
c
z
da, na primer, i poredjenje i sabiranje i mnoenje i druge pojedinane naredbe troe po jednu vremensku
z
c
s
jedinicu. Ono to je vano je da takva pojednostavljivanja ne utiu na klasu sloenosti kojoj algoritam
s
z
c
z
pripada (jer, kao to je reeno, multiplikativni faktori ne utiu na red algoritma).
s
c
c
Ukoliko se deo programa sastoji od nekoliko instrukcija bez grananja, onda se procenjuje da je njegovo
vreme izvravanja uvek isto, konstantno, te da pripada klasi (1). Ukoliko deo programa sadri petlju
s
z
koja se izvrava puta, a vreme izvravanja tela petlje je konstantno, onda ukupno vreme izvravanja
s
s
s
petlje pripada klasi (). Ukoliko deo programa sadri jednu petlju koja se izvrava puta i jednu
z
s
petlju koja se izvrava puta, a vremena izvravanja tela ovih petlji su konstantna, onda ukupno vreme
s
s
izvravanja petlje pripada klasi ( + ). Generalno, ukoliko program ima dva dela, sloenosti ( ) i
s
z
(), koji se izvravaju jedan za drugim, ukupna sloenost je ( + ). Ukoliko deo programa sadri
s
z
z
dvostruku petlju jednu koja se izvrava puta i, unutar nje, drugu koja se izvrava puta i ukoliko je
s
s
vreme izvravanja tela unutranje petlje konstantno, onda ukupno vreme izvravanja petlje pripada klasi
s
s
s
( ). Ukoliko deo programa sadri jedno grananje i ukoliko vreme izvravanja jedne grane pripada
z
s
klasi () a druge grane pripada klasi (), onda ukupno vreme izvravanja tog dela programa pripada
s
klasi ( + ).
Analogno se rauna sloenost za druge vrste kombinovanja linearnog koda, grananja i petlji. Za
c
z
izraanavanje sloenosti rekurzivnih funkcija potreban je matematiki aparat za reavanje rekurentnih
c
z
c
s
jednaina, opisan u narednom poglavlju.
c
3.4

Rekurentne jednaine
c

Kod rekurzivnih funkcija, vreme () potrebno za izraunavanje vrednosti funkcije za ulaz dimenzije
c
se moe izraziti kao zbir vremena izraunavanja za sve rekurzivne pozive za ulaze manje dimenzije i vrez
c

mena potrebnog za pripremu rekurzivnih poziva i objedinjavanje rezultata. Tako se, obino jednostavno,
c
moe napisati veza oblika
z
() = (1 ) + . . . + ( ) + ,

gde rekurzivna funkcija za ulaz dimenzije vri rekurzivnih poziva za ulaze (ne obavezno razliitih)
s
c
dimenzija 1 , . . . , , dok je vreme potrebno za pripremu poziva i objedinjavanje rezultata .
U nekim sluajevima iz ovakve linearne rekurentne relacije moe se eksplicitno izraunati nepoznati
c
z
c
niz (). U nekim sluajevima eksplicitno reavanje jednaine nije mogue, ali se moe izraunati
c
s
c
c
z
c
asimptotsko ponaanje niza ().
s

Homogena rekurentna jednaina prvog reda. Razmotrimo jednainu oblika


c
c
() = ( 1),

za > 0, pri emu je data vrednost


c
geometrijski niz () = .

(0) = .

Jednostavno se pokazuje da je reenje ove jednaine


s
c
32

Homogena rekurentna jednaina drugog reda. Razmotrimo jednainu oblika


c
c
() = ( 1) + ( 2),

> 1, pri emu su date vrednosti za (0) = 0 i (1) = 1 .


c
Ukoliko nisu navedeni poetni uslovi, jednaina ima vie reenja. Zaista, ukoliko nizovi 1 () i
c
c
s s
c
c
2 () zadovoljavaju jednainu, tada jednainu zadovoljava i njihova proizvoljna linearna kombinacija
() = 1 () + 2 ():

za

()

1 () + 2 ()

(1 ( 1) + 1 ( 2)) + (2 ( 1) + 2 ( 2))

=
=

(1 ( 1) + 2 ( 1)) + (1 ( 2) + 2 ( 2))
( 1) + ( 2) .

S obzirom na to da i nula niz (niz iji su svi elementi nule) trivijalno zadovoljava jednainu, skup reenja
c
c
s
ini vektorski prostor.
c
s
s
Razmotrimo funkcije oblika i pokuajmo da proverimo da li postoji broj takav da bude reenje
date jednaine. Za takvu vrednosti bi vailo:
c
z
odnosno, posle mnoenja sa
z

= 1 + 2 ,

i deljenja sa :

2 = + .

s
c
c
Dakle, da bi bilo reenje jednaine, potrebno je da bude koren navedene kvadratne jednaine, koja
se naziva karakteristina jednaina za homogenu rekurentnu jednainu drugog reda.
c
c
c
c
c
z
s s
z
z
Ako su 1 i 2 razliiti koreni ove jednaine, moe se dokazati da opte reenje () moe biti izraeno
kao linearna kombinacija baznih funkcija 1 i 2 , tj. da je oblika
() = 1 + 2 ,

tj. da ove dve funkcije ine bazu pomenutog vektorskog prostora reenja. Ako se eli pronai ono reenje
c
s
z
c
s
koje zadovoljava zadate poetne uslove (tj. zadovoljava date vrednosti (0) = 0 i (1) = 1 ), onda se
c
vrednosti koeficijenata i mogu dobiti reavanjem sistema dobijenog za = 0 i = 1, tj. reavanjem
s
s
sistema jednaina 0 = + , 1 = 1 + 2 .
c
U sluaju da je 1 dvostruko reenje karakteristine jednaine, moe se dokazati da opte reenje ()
c
s
c
c
z
s s
moe biti izraeno kao linearna kombinacija baznih funkcija 1 i 1 , tj. da je oblika
z
z
() = 1 + 1 .

s
c
Koeficijenti i koji odreduju partikularno reenje koje zadovoljava poetne uslove, takode se dobijaju
reavanjem sistema za = 0 i = 1.
s

Primer 3.3. Neka za vreme izvravanja


s

() algoritma (gde odredjuje ulaznu vrednost za algoritam)


vai ( + 2) = 4 ( + 1) 4 () (za 1) i (1) = 6, (2) = 20.
z
Sloenost algoritma moe se izraunati na sledei nain. Karakteristina jednaina za navedenu
z
z
c
c
c
c
c
homogenu rekurentntu vezu je
2 = 4 4

i njen dvostruki koren je 1 = 2. Opti lan niza () moe biti izraen u obliku
s c
z
z

() = 1 + 1 .
tj.
Iz (1) = 6, (2) = 20 dobija se sistem

() = 2 + 2 .
2+ 2=6

4 + 8 = 20

ije je reenje (, ) = (1, 2), pa je () = 2 + 2 2 , odakle sledi da je () = ( 2 ).


c
s

33

Homogena rekurentna jednaina reda . Homogena rekurentna jednaina reda (gde moe da
c
c
z
bude i vee od 2) je jednaina oblika:
c
c

() = 1 ( 1) + 2 ( 2) + . . . + ( ),

> 1, pri emu su date vrednosti za (0) = 0 , (1) = 1 , . . ., ( 1) = 1 .


c
Tehnike prikazane na homogenoj jednaini drugog reda, lako se uoptavaju na jednainu proizvoljnog
c
s
c
reda . Karakteristina jednaina navedene jednaine je:
c
c
c

za

Ako su reenja 1 , 2 , . . .,
s

= 1 1 + 2 2 + . . . + .

sva razliita, onda je opte reenje polazne jednaine oblika:


c
s s
c
() = 1 1 + 2 2 + . . . + ,

c
s s
pri emu se koeficijenti mogu dobiti iz poetnih uslova (kada se u navedeno opte reenje za uvrste
c
vrednosti 0, 1, . . ., 1).
Ukoliko je neko reenje 1 dvostruko, onda u optem reenju figuriu bazne funkcije 1 i 1 . Ukoliko
s
s
s
s
s
s
s
je neko reenje 1 trostruko, onda u optem reenju figuriu bazne funkcije 1 , 1 , 2 1 , itd.
s

Nehomogena rekurentna jednaina prvog reda. Razmotrimo jednainu oblika


c
c
() = ( 1) + ,

za

> 0, pri emu je data vrednost (0) = .


c
z
Definiimo niz () = (+1) () za 0. Za > 0 vai () = ( ()+)( (1)+) =
s
z
( 1). Za = 0 vai (0) = (1) (0) = + . Dakle, niz () zadovoljava homogenu
jednainu prvog reda ije je reenje () = (( + ) .
c
c
s
Za = 1 vai
z
()

(0) +

() = +

=0

=0

(( + )

1
1
=
+
+ ( + )
1
1

Drugi nain reavanja ovog tipa jednaina je svodenje na homogenu jednainu drugog reda. Iz (1) =
c s
c
c
(0)+, sledi da je (1) = +. Iz () = (1)+ i (+1) = ()+, sledi (+1) () =
( () + ) ( ( 1) + ) = () ( 1) i, dalje, ( + 1) = ( + 1) () ( 1), za
> 0. Reenje novodobijene homogene jednaine se moe dobiti na gore opisani nain (jer su poznate i
s
c
z
c
poetne vrednosti (0) = i (1) = + ).
c

Nehomogena rekurentna jednaina reda . Nehomogena rekurentna jednaina reda (


c
c
oblika:

> 0)

() = 1 ( 1) + 2 ( 2) + . . . + ( ) + ,

za > 1, pri emu su date vrednosti za (0) = 0 , (1) = 1 , . . ., ( 1) = 1 , moe se reiti


c
z
s
c
c
svodenjem na homogenu rekurentnu jednainu reda + 1, analogno gore opisanom sluaju za = 1.

Nehomogena rekurentna jednaina oblika


c

() = (/) + .

asimptotskom ponaanju reenja nehomogene rekurentne jednaine oblika


s
s
c
Teorema 3.1 (Master teorema). Reenje rekurentne relacije
s
() = (/) + ,

gde su i celobrojne konstante ( 1, 1) i i pozitivne konstante je

(log ) , ako je >


( log ) , ako je =
() =

( ) , ako je <

34

Naredna teorema govori o

() = (/) + .

3.5
3.5.1

Primeri izraunavanja sloenosti funkcija


c
z
Faktorijel

Izraunajmo vremensku sloenost naredne rekurzivne funkcije:


c
z

unsigned faktorijel(unsigned n) {
if (n == 0)
return 1;
else
return n*faktorijel(n-1);
}

Neka () oznaava broj instrukcija koje zahteva poziv funkcije faktorijel za ulaznu vrednost n.
c
z
Za = 0, vai () = 2 (jedno poredenje i jedna naredba return). Za > 0, vai () = 4 + ( 1)
z
z
(jedno poredenje, jedno mnoenje, jedno oduzimanje, broj instrukcija koje zahteva funkcija faktorijel
za argument n-1 i jedna naredba return). Dakle,
() = 4 + ( 1) = 4 + 4 + ( 2) = . . . = 4 + 4 + . . . + 4 + (0) = 4 + 2 = ()

Dakle, navedena funkcija ima linearnu vremensku sloenost.


z
Nehomogena jednaina () = 4 + ( 1) je mogla biti reena i svodenjem na homogenu jednainu.
c
s
c
Iz () = 4 + ( 1) i ( + 1) = 4 + () sledi ( + 1) () = () ( 1) i ( + 1) =
s
s s
2 () ( 1). Karakteristina jednaina 2 = 2 1 ima dvostruko reenje 1 = 1, pa je opte reenje
c
c
oblika () = 1 + 1 = + = ().
3.5.2

Fibonaijev niz
c

Za elemente Fibonaijevog niza vai (0) = 0, (1) = i


c
z
1
1+ 5
2
Karakteristina jednaina je = + 1 i njeni koreni su 2 i
c
c
() =

() = ( 1) + ( 2),

1 5
2

za
, pa je opte reenje oblika
s s

> 1.

(
)
)
1+ 5
1 5
+
.
2
2

Koristei poetne uslove, moe se izraunati opti lan niza:


c c
z
c
s c
1
() =
5

(
)
)
1
1+ 5
1 5

.
2
2
5

Funkcija za izraunavanje -tog elementa Fibonaijevog niza moe se definisati na sledei nain:
c
c
z
c c
int fib(int n) {
if(n <= 1)
return n;
else
return fib(n-1) + fib(n-2);
}

Neka () oznaava broj instrukcija koje zahteva poziv funkcije fib za ulaznu vrednost n. Za 1
c
z
vai () = 2 (jedno poredenje i jedna naredba return). Za > 1, vai () = ( 1) + ( 2) + 5
z
(jedno poredenje, dva oduzimanja, broj instrukcija koje zahtevaju pozivi funkcije za 1 i 2, jedno
sabiranje i jedna naredba return). Iz () = ( 1) + ( 2) + 5 i ( + 1) = () + ( 1) + 5,
sledi ( + 1) =2 () ( 2). Karakteristina jednaina ove jednaine je 3 = 22 1 i njeni koreni
c
c
c

1+ 5
1 5
s s
su 1, 2 i 2 , pa je opte reenje oblika
() = 1 +

odakle sledi da je

() = (

)
1+ 5
)
2

(
)
)
1+ 5
1 5
+
.
2
2

.
35

3.5.3

Uzajamna rekurzija

Sloenost algoritama u kojima se javlja uzajamna rekurzija moe se izraunati svodenjem na prikazane
z
z
c
tehnike. To e biti ilustrovano primerom.
c
Algoritam izvrava se za vrednost ( > 1) primenom istog algoritma za vrednost 1, pri emu
s
c
se za svodjenje problema koristi algoritam za vrednost 1. Algoritam izvrava se za vrednost
s
( > 1) trostrukom primenom istog algoritma za vrednost 1, pri emu se za svodjenje problema
c
koristi algoritam za vrednost 1. Algoritmi i se za = 1 izvravaju jednu vremensku jedinicu.
s
Izraunati vreme izvravanja algoritma za ulaznu vrednost .
c
s
Neka je () vreme izvravanja algoritma za ulaznu vrednost i neka je () vreme izvravanja
s
s
algoritma za ulaznu vrednost . Na osnovu uslova zadatka vai:
z
(1) = (1) = 1

(3.1)

() = ( 1) + ( 1) ( > 1)

(3.2)
(3.3)

() = 3( 1) + ( 1) ( > 1)

Iz jednakosti (2) imamo:

pa, uvrtavanjem u jednakost (3), za


s

( 1) = () ( 1)
>1

vai:
z

( + 1) 4() + 2( 1) = 0

Pomou ove rekurentne veze i poetnih uslova: (1) = 1 i


c
c
vrednost (). Karakteristina jednaina relacije (6) je:
c
c
Njeni koreni su

1 = 2 +

2 = 2

2,

za neke 1 , 2 R. Konstante
linearnih jednaina po 1 i 2 :
c

moemo odrediti
z

pa je opte reenje rekurentne jednaine (6) oblika:


s s
c

2) + 2 (2

2)

odredjujemo pomou poetnih uslova, reavajui sledei sistem


c
c
s
c
c

1 = (1) = 1 (2 + 2) + 2 (2 2)

2 = (2) = 1 (2 + 2)2 + 2 (2 2)2

1 = 1 (2 2), a 2 = 1 (2 + 2), pa je konano:


c
4
4
() =

3.6

(2) = (1) + (1) = 2,

(3.6)

2 4 + 2 = 0

() = 1 (2 +

Dobija se da je

(3.4)
(3.5)

() = ( + 1) ()

1
((2 + 2) 1 + (2 2) 1 )
2

Klase sloenosti P i NP
z

Neka od najvanijih otvorenih pitanja matematike i informatike vezana su za sloenost izraunavanja


z
z
c
i, takozvane, NP-kompletne probleme. Jedan takav problem bie opisan u nastavku teksta.
c

Sef protokola na jednom dvoru treba da organizuje bal za predstavnike ambasada. Kralj trai da na
z
bal bude pozvan Peru ili da ne bude pozvan Katar (Qatar). Kraljica zahteva da budu pozvani Katar ili
Rumunija (ili i Katar i Rumunija). Princ zahteva da ne bude pozvana Rumunija ili da ne bude pozvan
Peru (ili da ne budu pozvani ni Rumunija ni Peru). Da li je mogue organizovati bal i zadovoljiti zahteve
c
svih lanova kraljevske porodice?
c
Ako su , i bulovske (logike) promenljive (koje mogu imati vrednosti true ili false, tj. ili ),
c
navedeni problem moe biti formulisan na sledei nain: da li je zadovoljiv logiki iskaz
z
c c
c

( ) ( ) ( ) .

36

Zadovoljivost navedenog iskaza moe biti odredjena tako to bi bile ispitane sve mogue interpretacije
z
s
c
sve mogue dodele varijablama , i . Ako je u nekoj interpretaciji vrednost datog logikog iskaza
c
c
true, onda je dati iskaz zadovoljiv. Za izabranu, fiksiranu interpretaciju moe se u konstantnom vremenu
z
utvrditi da li je istinitosna vrednost true. Za tri promenljive ima 2 interpretacija, pa je red ovog algoritma za ispitivanje zadovoljivosti logikih iskaza reda (2 ) (algoritam je eksponencijalne sloenosti).
c
z
Pitanje je da li postoji algoritam koji navedeni problem reava u polinomijalnom vremenu.
s
Definicija 3.4. Za algoritam sa ulaznom vrednou kaemo da je polinomijalne sloenosti ako je
sc
z
z
njegovo vreme izvravanja ( ()) gde je () polinom po . Klasa polinomijalnih algoritama oznaava
s
c
se sa .

Definicija 3.5 (Pojednostavljena definicija klase NP).

Ako neki problem moe da se predstavi u vidu


z
najvie eksponencijalno mnogo instanci (u odnosu na duinu ulaza) i ako za bilo koju instancu moe da
s
z
z
bude reen u polinomijalnom vremenu, onda kaemo da problem pripada klasi .
s
z

z
Oigledno je da vai , ali se jo uvek ne zna1 da li vai = .
c
z
s
Ako bi se pokazalo da neki problem iz klase nema polinomijalno reenje, onda bi to znailo da
s
c
ne vai = . Ako neki problem iz klase ima polinomijalno reenje, onda to jo ne znai da vai
z
s
s
c
z
= . Za probleme iz posebne potklase klase (to je klasa -kompletnih problema) vai da ako
z
neki od njih ima polinomijalno reenje, onda vai = .
s
z

Primer 3.4.

Problem ispitivanja zadovoljivosti logikih iskaza ( ) pripada klasi , ali se ne zna


c
da li pripada klasi .

Definicija 3.6.

Za problem kaemo da je -teak problem ako je svaki problem polinomijalno


z
z

Definicija 3.7.

Za problem kaemo da je -kompletan problem ako pripada klasi i ako je


z

svodljiv na .

-teak.
z

Odnos problema iz klase i i -tekih problema ilustrovan je na slici 3.2. Skup -kompletnih
s
problema jeste pravi podskup od , a trenutno se ne zna da li je pravi podskup od .
klasa np

klasa p

np-teak problem
z

np-kompletni problemi

Slika 3.2: Ilustracija odnos problema iz klase

Teorema 3.2.
Teorema 3.3.

-tekih
s

problema

Ako bilo koji -teak problem pripada klasi , onda vai = .


z
z
Problem je -kompletan ako

pripada klasi
je polinomijalno svodljiv na , gde je neki -kompletan problem.
1 Matematiki institut Klej nudi nagradu od milion dolara za svaki od izabranih sedam najznaajnijih otvorenih
c
c
matematikih i informatikih problema. Problem da li su klase i jednake je prvi na toj listi.
c
c

37

Dakle, ako znamo da je neki problem -kompletan, onda na osnovu prethodne teoreme moemo
z
da pokaemo da su i svi -problemi na koje ga je mogue svesti takodje -kompletni. Dugo se
z
c
tragalo za pogodnim -kompletnim problemom za koji bi moglo da se pronadje polinomijalno reenje,
s
to bi znailo da vai = . Zato je bilo vano otkriti vie raznorodnih -kompletnih problema.
s
c
z
z
s
Postavljalo se pitanje da li uopte postoji ijedan -kompletan problem (korienjem prethodne teoreme
s
sc
moe da se utvrdi da je neki problem -kompletan samo ako se za neki drugi problem ve zna da je
z
c
-kompletan). Stiven Kuk je 1971. godine dokazao (neposredno, koristei formalizam Tjuringove
c
maine) da je problem SAT -kompletan. U godinama koje su sledile za mnoge probleme je utvrdjeno
s
da su takodje -kompletni (najee svodjenjem problema SAT na njih), ali ni za jedan od njih nije
c sc
pokazano da pripada klasi , pa se jo uvek ne zna da li vai = (mada veina istraivaa veruje
s
z
c
z c
da ne vai).
z
je klasa problema koji mogu biti reeni korienjem memorijskog prostora koji je polinomis
sc
jalna funkcija ulaza. Vai , ali se ne zna da li vai = (rasprostranjeno
z
z
je uverenje da ne vai).
z
Tokom poslednje decenije, pored napora da se dokae da ne vai = , radi se i na ispitivanju
z
z
raspodela najteih problema u pojedinim klasama -kompletnih problema. Dosta se radi i na primeni
z
novih pristupa u efikasnijem reavanju nekih instanci -kompletnih problema.
s
3.7

Popravljanje vremenske sloenosti


z

Ukoliko performanse programa nisu zadovoljavajue, treba razmotriti zamenu kljunih algoritama
c
c
algoritama koji dominantno utiu na sloenost. Ukoliko to ne uspeva tj. ukoliko se smatra da je
c
z
asimptotsko ponaanje najbolje mogue, preostaje da se efikasnost programa popravi na polju broja
s
c
pojedinanih izvrenih naredbi (koje ne utiu na asimptotsko ponaanje, ali utiu na ukupno utroeno
c
s
c
s
c
s

vreme). Cesto ovaj cilj zahteva specifina reenja, ali postoje i neke ideje koje su primenljive u velikom
c
s
broju sluajeva:
c

Koristiti optimizacije kompilatora. Moderni kompilatori i u podrazumevanom reimu rada generiu


z
s

veoma efikasan kod ali mogu da primene i dodatne tehnike optimizacije. Ipak, treba biti oprezan
sa optimizacijama jer izvrni kd ne odgovara direktno izvornom (na primer, mogue je da se u
s o
c
izvrnom programu ne predvida prostor za promenljive za koje je ustanovljeno da se ne koriste),
s
s
pa je mogue i da optimizacije izmene i oekivano ponaanje programa. Takode, zbog naruene
c
c
s
s
s
c
veze izmedu izvornog i izvrnog programa, teko je ili nemogue debagerom analizirati program.
Kompilacija sa intenzivnim optimizovanjem je obino i znatno sporija od osnovne kompilacije.
c
Zbog svega nabrojanog, preporuuje se da se optimizovanje programa primeni nakon intenzivnog
c
testiranja i otklanjanja svih otkrivenih greaka, ali i da se testiranje ponovi sa optimizovanom
s
verzijom izvrnog programa.
s
Optimizacijama koje prua kompilator, mogu se dobiti ubrzanja i od nekoliko desetina procenata,
z
ali mogue je i da optimizovani program bude sporiji nego neoptimizovani.
c
Kompilatori obino imaju mogunost da se eksplicitno izabere neka tehnika optimizacije ili nivo
c
c
optimizovanja (to ukljuuje ili ne ukljuuje vie pojedinanih tehnika). Optimizovanje obino
s
c
c
s
c
c
uveava vreme kompiliranja, pa se esto primenjuje samo u zavrnim fazama razvoja programa.
c
c
s
Na primer, za kompilator gcc nivo optimizacije se bira korienjem opcije -O iza koje moe biti
sc
z
navedena jedna od vrednosti:

0 za podrazumevani reim kompilacije, samo sa bazinim tehnikama optimizacije.


z
c
1 kompilator pokuava da smanji i veliinu izvrnog programa i vreme izvravanja, ali ne primenjuje
s
c
s
s

tehnike optimizacije koje mogu da bitno uveaju vreme kompiliranja.


c
2 kompilator primenjuje tehnike optimizacije koje ne zahtevaju dodatni memorijski prostor u zamenu za veu brzinu (u fazi izvravanja programa).
c
s
3 kompilator primenjuje i tehnike optimizacije koje zahtevaju dodatni memorijski prostor u zamenu
za veu brzinu (u fazi izvravanja programa).
c
s
s kompilator primenjuje tehnike optimizovanja koje smanjuju izvrni program, a ne njegovo vreme
s
izvravanja.
s
38

Ne optimizovati nebitne delove programa. Ukoliko je merenjem potvrdeno da neki deo programa
neznatno utie na njegovu efikasnost ne vredi unapredivati ga bolje je da on ostane u jednosc
tavnom i lako razumljivom obliku. Uvek se treba usredsrediti na delove programa koji troe najvei
s
c
udeo vremena.2

Cuvene su rei Donalda Knuta: Programeri troe enormne koliine vremena razmiljajui ili brinui
c
s
c
s c
c
o brzini nekritinih delova svojih programa, i to zapravo stvara jak negativan uticaj u fazama
c
debagovanja i odravanja. Treba da zaboravimo na male efikasnosti, recimo 97% vremena: prerana
z
optimizacija je koren svih zala. Ipak, ne treba da propustimo mogunosti u preostalih kritinih
c
c
3%.
Izdvojiti izraunavanja koja se ponavljaju. Identina skupa izraunavanja ne bi trebalo da se ponc
c
c
avljaju. U sledeem primeru:
c
x = x0*cos(0.01) - y0*sin(0.01);
y = x0*sin(0.01) + y0*cos(0.01);

vrednosti funkcije cos i sin se izraunavaju po dva puta za istu vrednost argumenta. Ove funkcije
c
su vremenski veoma zahtevne i bolje je u pomonim promenljivama sauvati njihove vrednosti pre
c
c
korienja. Dakle, umesto navedenog, daleko je bolji naredni kd:
sc
o
cs = cos(0.01);
sn = sin(0.01);
x = x0*cs - y0*sn;
y = x0*sn + y0*cs;

Izdvajanje koda izvan petlje. Ova preporuka je u istom duhu kao prethodna. Iz petlje je potrebno
izdvojiti izraunavanja koja su ista u svakom prolasku kroz petlju. Na primer, umesto:
c
for (i=0; i < strlen(s); i++)
if ( s[i] == c )
...

daleko je bolje:
len = strlen(s);
for (i=0; i < len; i++)
if ( s[i] == c )
...

U prvoj verziji koda, kroz petlju se prolazi puta, gde je duina niske s. Medutim, u svakom
z
prolasku kroz petlju se poziva funkcija strlen za argument s i u svakom tom pozivu se prolazi
kroz celu nisku s (do zavrne nule). Zbog toga je sloenost prve petlje (barem) (2 ). S druge
s
z
strane, u drugoj verziji koda, funkcija strlen se poziva samo jednom i sloenost tog poziva i petlje
z
koja sledi zajedno moe da bude ().
z
Slino, umesto:
c
2 Ilustrujmo ovaj savet jednim Lojdovim (Samuel Loyd (1841-1911) problemom: Ribolovac je sakupio 1kg crva.
Sakupljeni crvi imali su 1% suve materije i 99% vode. Sutra, nakon suenja, crvi su imali 95% vode u sebi. Kolika je tada
s
bila ukupna masa crva? Na poetku, suva materija inila je 1% od 1kg, tj. 10gr. Sutradan, vode je bilo 19 puta vie od
c
c
s
suve materije, tj. 190gr, pa je ukupna masa crva bila 200 gr.
Ako bi program inile funkcije i i ako bi pokrivala 99% a funkcija 1% vremena izvravanja, glavni kandidat za
c
s
optimizovanje bila bi naravno funkcija . Ukoliko bi njen udeo u konanom vremenu pao sa 99% na 95%, onda bi ukupno
c
vreme izvravanja programa bilo svedeno na 20% poetnog.
s
c

39

for (i=0; i < N; i++) {


x = x0*cos(0.01) - y0*sin(0.01);
y = x0*sin(0.01) + y0*cos(0.01);
...
x0 = x;
y0 = y;
}

daleko je bolji kd:


o
cs = cos(0.01);
sn = sin(0.01);
for (i=0; i < N; i++) {
x = x0*cs - y0*sn;
y = x0*sn + y0*cs;
...
x0 = x;
y0 = y;
}

Zameniti skupe operacije jeftinim. Uslov

2 2 + 2 2 je ekvivalentan uslovu
1 1 +1 1 > 2 2 +2 2 , ali je u programu daleko bolje umesto uslova sqrt(x_1*x_1+y_1*y_1) > sqrt(x_2*x_2+y
koristiti x_1*x_1+y_1*y_1 > x_2*x_2+y_2*y_2 jer se njime izbegava pozivanje veoma skupe funkcije
sqrt.
1 1 + 1 1 >

Slino, ukoliko je mogue dobro je izbegavati skupe trigonometrijske funkcije, umesto veih tipova
c
c
c
dobro je koristiti manje, poeljno celobrojne, itd.
z

Ne ostavljati za fazu izvravanja izraunavanja koja se mogu obaviti ranije. Ukoliko se tokom
s
c
izvravanja programa vie puta koriste vrednosti iz malog skupa, utedu moe da donese njihovo
s
s
s
z
izraunavanje unapred i ukljuivanje rezultata u izvorni kd programa. Na primer, ako se u nekom
c
c
o
programu koriste vrednosti kvadratnog korena od 1 do 100, te vrednosti se mogu izraunati unc
apred i njima se moe inicijalizovati konstantni niz. Ovaj pristup prihvatljiv je ako je kritini resurs
z
c
vreme a ne prostor.

Napisati kritine delove koda na asembleru. Savremeni kompilatori generiu veoma kvalitetan kd.
c
s
o
Ukoliko se koriste i rasploive optimizacije, kd takvog kvaliteta moe da napie retko koji proz
o
z
s
gramer. Ipak, u nekim situacijama, za neke vremenski kritine delove programa, opcija je pisanje
c
tih delova programa na asembleru.

3.8

Popravljanje prostorne sloenosti


z

Za razliku od nekadanjih raunara, na savremenim raunarima memorija obino nije kritini resurs.
s
c
c
c
c
Optimizacije se obino usredsreduju na tednju vremena, a ne prostora. Ipak, postoje situacije u kojima
c
s
je potrebno tedeti memoriju, na primer, onda kada program barata ogromnim koliinama podataka,
s
c
kada je sm program veliki i zauzima znaajan deo radne memorije ili kada se program izvrava na
a
c
s

s
c
s
nekom specifinom uredaju koji ima malo memorije. Cesto uteda memorije zahteva specifina reenja,
c
ali postoje i neke ideje koje su primenljive u velikom broju sluajeva:
c

Koristiti najmanje mogue tipove. Za celobrojne podatke, umesto tipa int esto je dovoljan tip
c
c

ili ak char. Za reprezentovanje realnih brojeva, ukoliko preciznost nije kritina, moe se,
c
c
z
umesto tipa double koristiti tip float. Za reprezentovanje logikih vrednosti dovoljan je jedan
c
bit a vie takvih vrednosti moe da se uva u jednom bajtu (i da im se pristupa koristei bitovske
s
z
c
c
operatore).
short

40

Ne uvati ono to moe da se lako izrauna. U prethodnom delu je, u sluaju da je kritina brzc
s
z
c
c
c

ina, a ne prostor, dobro da se vrednosti koje se esto koriste u programu izraunaju unapred i
c
c
ukljue u izvorni kod programa. Ukoliko je kritina memorija, treba uraditi upravo suprotno i ne
c
c
uvati nikakve vrednosti koje se mogu izraunati u fazi izvravanja.
c
c
s

Pitanja i zadaci za vebu


z

Pitanje 3.1. Svaka instrukcija na raunaru se izvrava za 1109 . Algoritam


c
s
3

1 zahteva 2 instrukcija,

a 2 zahteva instrukcija.
z
s
Sa obradom ulaza koje dimenzije algoritam 1 moe da zavri za jedan minut?
Sa obradom ulaza koje dimenzije algoritam 2 moe da zavri za jedan minut?
z
s

Pitanje 3.2. Svaka instrukcija na raunaru se izvrava za 2. Algoritam


c
s

1 za obradu ulaza dimenzije


zahteva 2 instrukcija, a 2 zahteva 3 instrukcija.
z
s
Sa obradom ulaza koje dimenzije algoritam 1 moe da zavri za jedan minut?
Sa obradom ulaza koje dimenzije algoritam 2 moe da zavri za jedan minut?
z
s

Pitanje 3.3.
Pitanje 3.4.

Kada se kae da vai () (())?


z
z
Dokazati da vai:
z

(a) 2 + 2 = (2 ).
(b) 2 + = (2 ).
(c) 2 + 3 = (2 );
(d) 3 + 22 = (2 ).
(e) 5 + 2 = (5 ).

Pitanje 3.5.

Da li funkcija 72 + 3 pripada klasi:


b) ()
c) (2 )
a) (3 + 1)
2

Pitanje 3.6.
()

d) (3 log())

Da li funkcija 3 log + 5 pripada klasi:

( log )

(2 log )

( log2 )

(log )

Pitanje 3.7.

Da li funkcija 72 + 3 log() pripada klasi:


a) (3 + 1)
b) ()
c) (2 )
2

Pitanje 3.8.
()

Pitanje 3.9.
()

e) (2 log())

( + log )
d) (3 log())

(15)
e) (2 log())

Da li funkcija 3 log + 5 + 100 pripada klasi:

( log )

(2 log )

( log2 )

(log )

Da li funkcija 6 + 2 + 1010 pripada klasi:

(2 )

(6 )

(10 )

(1010 )

(6 + 2 )

( + log )

(15)

(2 + 1010 )

(108)

(2 1010 )

Pitanje 3.10.

Ako () pripada klasi ( log ), a (2 ) pripada klasi (2 ), onda () + () pripada


klasi (izabrati sve ispravne odgovore):
(a) ( log );
(b) (2 );
(c) ( log + 2 );
(d) (2 log ).

Pitanje 3.11.

Ako () pripada klasi (2 ), a () pripada klasi (3 ), onda () + () pripada klasi


(izabrati sve ispravne odgovore):
(a) (2 );
(b) (3 );
(c) (5 );
(d) (6 ).

Pitanje 3.12.

Kada kazemo da je sloenost algoritma jednaka ( )?


z

41

Pitanje 3.13.

Ako je sloenost algoritma za ulaznu vrednost (3 ), a sloenost algoritma za


z
z
z
s
s
s
ulaznu vrednost (4 ), kolika je sloenost algoritma koji se izvrava tako to se izvrava prvo
algoritam , pa algoritam :
(a) (3 ); (b) (4 ); (c) (7 ); (d) (12 ).

Pitanje 3.14. Odrediti -ti lan niza () = ( 1), (0) = .


c
Pitanje 3.15. Kojoj klasi pripada reenje rekurentne relacije () = 2 (/2) + ?
s
Pitanje 3.16. Ako nizovi 1 i 2 zadovoljavaju rekurentnu jednainu () = ( 1) + ( 2),
c
dokazati da ovu jednainu zadovoljava i niz 1 + 2 .
c

Pitanje 3.17. Ako vai () = 4 ( 1) 4 ( 2), koju formu ima opti lan niza ?
z
s c
Pitanje 3.18. Nai opte reenje jednaine () = 3 ( 1) 2 ( 2).
c
s
s
c
Pitanje 3.19. Ako je (1) = 1, (2) = 7 i ( + 2) = ( + 1) + 2 (), koliko je (20)?
Pitanje 3.20. Odrediti -ti lan niza () za koji vai (1) = 0, (2) = 5, (+2) = 5 (+1)6 ().
c
z
Pitanje 3.21. Odrediti -ti lan niza:
c
(a)
(b)
(c)
(d)

() = 6 ( 1) 8 ( 2), (0) = 1
() = 8 ( 1) 15 ( 2), (0) = 1
() = 6 ( 1) 9 ( 2), (0) = 1
() = 10 ( 1) 25 ( 2), (0) = 1, (1) = 1,
Kojoj klasi sloenosti pripada ()?
z

Pitanje 3.22.
Pitanje 3.23.
Pitanje 3.24.
(a)
(b)
(c)
(d)
(e)
(f )

Reiti rekurentnu relaciju () = ( 1) + 3, (0) = 1?


s
Ako je ( + 1) = 2 () + 1, kojoj klasi pripada ?
Kojoj klasi sloenosti pripada () ako vai:
z
z

() = 5 ( 1) 4 ( 2)
() = 5 ( 1) 6 ( 2)
() = 8 ( 1) 15 ( 2)
() = 4 ( 1) 4 ( 2)
() = 6 ( 1) 9 ( 2)
() = 8 ( 1) 16 ( 2).

Pitanje 3.25.

Odrediti opti lan niza () za koji vai (1) = 0, (2) = 5, (3) = 14, ( + 3) =
s c
z

3 ( + 2) 3 ( + 1) + ().

Pitanje 3.26. Ako je () = (/) + i = , kog je reda ()?

Pitanje 3.27. Sta je reenje rekurentne relacije () = (/) + , gde su


s

i celobrojne konstante

( 1, 1) i i pozitivne konstante?

Pitanje 3.28.

(a)
(b)
(c)
(d)
(e)

Kojoj klasi sloenosti pripada () ako vai:


z
z

() = ( 1) + , (0) = ?
() = 2 (/2) + ()
() = 2 (/2) +
() = 8 (/2) + 2
() = 4 (/2) + 2

Pitanje 3.29.

Kolika je sloenost algoritma za pronalaenje minimuma niza? Kolika je sloenost algoz


z
z
ritma za pronalaenje drugog po veliini elementa niza?
z
c

Pitanje 3.30.

Ako za vreme izvravanja () algoritma (gde odreduje ulaznu vrednost za algoritam)


s
vai ( + 1) = () + 3 (za 1) i (1) = 2, odrediti sloenost algoritma .
z
z

42

Pitanje 3.31. Ako za vreme izvravanja


s

() algoritma (gde odreduje ulaznu vrednost za algoritam)


vai ( + 2) = 4 ( + 1) 3 () (za 1) i (1) = 1, (2) = 2, onda je sloenost algoritma :
z
z
(a) (); (b) (3 ); (c) (4 ); (d) (4 );

Pitanje 3.32. Ako za vreme izvravanja


s

() algoritma (gde odreduje ulaznu vrednost za algoritam)


vai ( + 2) = 3 ( + 1) + 2 () (za 1) i (1) = 1, (2) = 2, odrediti sloenost algoritma .
z
z

Pitanje 3.33.

Algoritam za ulaznu vrednost poziva sebe samog za ulaznu vrednost 1 i koristi


jo dodatnih operacija. Izraunati sloenost algoritma .
s
c
z

Pitanje 3.34. Koju vrednost za dato

izraunava naredna funkcija i koja je njena memorijska sloenost?


c
z

int f(int n) {
return n == 0 ? 1 : n*f(n-1);
}

Pitanje 3.35.

Odrediti sloenost izvravanja sledee funkcije:


z
s
c

void f(int n)
{
if (n<1)
printf("*");
else
{
f(n-1);
printf("----\n");
f(n-1);
}
}

Pitanje 3.36.

Odrediti sloenost sledee funkcije:


z
c

void f(int n)
{
if (n<2)
printf("* ");
else
{
f(n-2);
f(n-1);
f(n-2);
}
}

Pitanje 3.37.

Algoritam izvrava se za vrednost ( > 1) pozivanjem algoritma za vrednost


s
1, pri emu se za svodjenje problema troi jedna vremenska jedinica. Algoritam izvrava se za
c
s
s
vrednost ( > 1) pozivanjem algoritma za vrednost 1, pri emu se za svodjenje problema troe
c
s
dve vremenske jedinice. Za ulaznu vrednost = 1, algoritam troi jednu, a algoritam dve vremenske
s
jedinice. Izraunati vreme izvravanja algoritma za ulaznu vrednost .
c
s

Pitanje 3.38.

Za koji problem kaemo da pripada klasi ? Za koji problem kaemo da pripada klasi
z
z

? Za koji problem kaemo da je NP-kompletan?


z

Pitanje 3.39.

Kako se dokazuje da neki problem pripada klasi ? Kakvu bi posledicu imao dokaz da
neki -kompletan problem pripada klasi a kakvu dokaz da neki -kompletan problem ne pripada
klasi ?

Pitanje 3.40.

Ako je svaki problem svodljiv u polinomijalnom vremenu na problem , kakav je

problem ?

43

Pitanje 3.41.

Ako je neki kompletan problem svodljiv u polinomijalnom vremenu na problem ,


ta onda vai za problem ?
s
z

Pitanje 3.42. Ako neki -teak problem


z
Pitanje 3.43. Ako se zna da je algoritam

nije -kompletan, ta onda to znai?


s
c

-kompletan i da algoritam pripada klasi , kako


se moe dokazati da je algoritam -kompletan?
z

Pitanje 3.44.

Dokazano je da vai (izabrati sve ispravne odgovore):


z
(a) ; (b) ; (c) = ; (d) = ;

Pitanje 3.45. Navesti primer problema koji pripada klasi

. Navesti primer problema koji pripada klasi

. Navesti primer problema koji je -kompletan.

Pitanje 3.46.

SAT problem je:


(a) = ; (b) == ; (c) problem iskazne zadovoljivosti; (d) problem ispitivanja sloenosti
z
programa.

Pitanje 3.47. Sta je SAT? Da li je SAT NP-teak problem? Da li je SAT NP-kompletan problem?
z

Pitanje 3.48. Da li SAT pripada klasi P? Da li SAT pripada klasi NP? Sta je posledica tvrdenja

, a ta tvrdenja ?
s

Zadatak 3.8.1.

Ako za vreme izvravanja () algoritma (gde odredjuje ulaznu vrednost za algos


ritam) vai () = ( 1) + /2 i (1) = 1, odrediti sloenost algoritma .
z
z

Reenje:
s

2
1

= ( 2) +
+ = (1) + + . . . +
+ =
2
2
2
2
2
2
(
)
1
1 ( + 1)
2 + + 2
= (1) + (2 + . . . + ) = 1 +
1 =
,
2
2
2
4

() = ( 1) +

pa je algoritam

kvadratne sloenosti.
z

44

You might also like