Professional Documents
Culture Documents
p2 Za Kriptografiju O-Notacija I NP
p2 Za Kriptografiju O-Notacija I NP
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
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
Vreme izvravanja programa moe biti procenjeno ili izmereno za neke konkretne ulazne vrednosti i
s
z
neko konkretno izvravanje.
s
3.1.1
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
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
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
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
Definicija 3.1.
= ()
i itamo je veliko ,o od .
c
= ()
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.
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 )
Definicija 3.2.
().
onda piemo
s
= ()
i itamo je veliko teta od .
c
Ako vai
z
Primer 3.2.
= (),
onda vai i
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 (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
(0) = .
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
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
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) + . . . + ( ),
za
Ako su reenja 1 , 2 , . . .,
s
= 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
za
(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
> 0)
() = 1 ( 1) + 2 ( 2) + . . . + ( ) + ,
() = (/) + .
( ) , ako je <
34
() = (/) + .
3.5
3.5.1
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 = ()
Fibonaijev niz
c
() = ( 1) + ( 2),
1 5
2
za
, pa je opte reenje oblika
s s
> 1.
(
)
)
1+ 5
1 5
+
.
2
2
(
)
)
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)
( 1) = () ( 1)
>1
vai:
z
( + 1) 4() + 2( 1) = 0
1 = 2 +
2 = 2
2,
za neke 1 , 2 R. Konstante
linearnih jednaina po 1 i 2 :
c
moemo odrediti
z
2) + 2 (2
2)
1 = (1) = 1 (2 + 2) + 2 (2 2)
3.6
(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
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 .
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.
Definicija 3.6.
Definicija 3.7.
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
Teorema 3.2.
Teorema 3.3.
-tekih
s
problema
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
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
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:
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
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
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
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.3.
Pitanje 3.4.
(a) 2 + 2 = (2 ).
(b) 2 + = (2 ).
(c) 2 + 3 = (2 );
(d) 3 + 22 = (2 ).
(e) 5 + 2 = (5 ).
Pitanje 3.5.
Pitanje 3.6.
()
d) (3 log())
( log )
(2 log )
( log2 )
(log )
Pitanje 3.7.
Pitanje 3.8.
()
Pitanje 3.9.
()
e) (2 log())
( + log )
d) (3 log())
(15)
e) (2 log())
( log )
(2 log )
( log2 )
(log )
(2 )
(6 )
(10 )
(1010 )
(6 + 2 )
( + log )
(15)
(2 + 1010 )
(108)
(2 1010 )
Pitanje 3.10.
Pitanje 3.11.
Pitanje 3.12.
41
Pitanje 3.13.
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 )
() = 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) + ().
i celobrojne konstante
( 1, 1) i i pozitivne konstante?
Pitanje 3.28.
(a)
(b)
(c)
(d)
(e)
() = ( 1) + , (0) = ?
() = 2 (/2) + ()
() = 2 (/2) +
() = 8 (/2) + 2
() = 4 (/2) + 2
Pitanje 3.29.
Pitanje 3.30.
42
Pitanje 3.33.
int f(int n) {
return n == 0 ? 1 : n*f(n-1);
}
Pitanje 3.35.
void f(int n)
{
if (n<1)
printf("*");
else
{
f(n-1);
printf("----\n");
f(n-1);
}
}
Pitanje 3.36.
void f(int n)
{
if (n<2)
printf("* ");
else
{
f(n-2);
f(n-1);
f(n-2);
}
}
Pitanje 3.37.
Pitanje 3.38.
Za koji problem kaemo da pripada klasi ? Za koji problem kaemo da pripada klasi
z
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.
problem ?
43
Pitanje 3.41.
Pitanje 3.44.
Pitanje 3.46.
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.
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