Sunteți pe pagina 1din 19

Capitolul 3

Analiza complexit
atii
algoritmilor
Analiza complexit
atii unui algoritm are ca scop estimarea volumului de resurse
de calcul necesare pentru executia algoritmului. Prin resurse se ntelege:
Spatiul de memorie necesar pentru stocarea datelor pe care le prelucreaza
algoritmul.
Timpul necesar pentru executia tuturor prelucr
arilor specicate n algoritm.
Aceasta analiza este util
a pentru a stabili dac
a un algoritm utilizeaz
a un
volum acceptabil de resurse pentru rezolvarea unei probleme. In caz contrar
algoritmul, chiar dac
a este corect, nu este considerat ecient si nu poate aplicat n practic
a. Analiza complexit
atii, numit
a si analiza ecientei algoritmilor,
este utilizata si n compararea algoritmilor cu scopul de a-l alege pe cel mai
ecient (cel care foloseste cele mai putine resurse de calcul).
In majoritatea algoritmilor volumul resurselor necesare depinde de dimensiunea problemei de rezolvat. Aceasta este determinata de regul
a de volumul
datelor de intrare. In cazul cel mai general acesta este dat de numarul bitilor
necesari reprezentarii datelor. Dac
a se prelucreaza o valoare numeric
a, n (de
exemplu, se veric
a daca n este numar prim) atunci ca dimensiune a problemei
se considera num
arul de biti utilizati n reprezentarea lui n, adic
a log2 n + 1.
Daca datele de prelucrat sunt organizate sub forma unor tablouri atunci dimensiunea problemei poate considerat
a ca ind num
arul de componente ale
tablourilor (de exemplu la determinarea minimului dintr-un tablou cu n elemente sau n calculul valorii unui polinom de gradul n se considera ca dimensiunea problemei este n). Sunt situatii n care volumul datelor de intrare este
specicat prin mai multe valori (de exemplu n prelucrarea unei matrici cu m

50

linii si n coloane). In aceste cazuri dimensiunea problemei este reprezentata de


toate valorile respective (de exemplu, (m, n)).
Uneori la stabilirea dimensiunii unei probleme trebuie s
a se tin
a cont si de
prelucrarile ce vor efectuate asupra datelor. De exemplu, daca prelucrarea
unui text se efectueaz
a la nivel de cuvinte atunci dimensiunea problemei va
determinata de num
arul cuvintelor, pe cand dac
a se efectueaza la nivel de
caractere atunci va determinat
a de num
arul de caractere.
Spatiul de memorare este inuentat de modul de reprezentare a datelor. De
exemplu, o matrice cu elemente ntregi av
and 100 de linii si 100 de coloane din
care doar 50 sunt nenule (matrice rar
a) poate reprezentata n una dintre variantele: (i) tablou bidimensional 100 100 (10000 de valori ntregi); (ii) tablou
unidimensional n care se retin doar cele 50 de valori nenule si indicii corespunz
atori (150 de valori ntregi). Alegerea unui mod ecient de reprezentare a
datelor poate inuenta complexitatea prelucr
arilor. De exemplu algoritmul de
adunare a dou
a matrici rare devine mai complicat n cazul n care acestea sunt
reprezentate prin tablouri unidimensionale. In general obtinerea unor algoritmi
ecienti din punct de vedere al timpului de executie necesita marirea spatiului
de memorie alocat datelor si reciproc.
Dintre cele dou
a resurse de calcul, spatiu si timp, cea critic
a este timpul de
executie. In continuare vom analiza doar dependenta dintre timpul de executie
(nteles de cele mai multe ori ca numar de repet
ari ale unor operatii) al unui
algoritm si dimensiunea problemei.

3.1

Timp de executie

In continuare vom nota cu T (n) timpul de executie al unui algoritm destinat


rezolvarii unei probleme de dimensiune n. Pentru a estima timpul de executie
trebuie stabilit un model de calcul si o unitate de m
asur
a. Vom considera un
model de calcul (numit si masina de calcul cu acces aleator) caracterizat prin:
Prelucrarile se efectueaza n mod secvential.
Operatiile elementare sunt efectuate n timp constant indiferent de valoarea operanzilor.
Timpul de acces la informatie nu depinde de pozitia acesteia (nu sunt
diferente ntre prelucrarea primului element al unui tablou si cea a oricarui
alt element).
A stabili o unitate de masur
a nseamna a stabili care sunt operatiile elementare si a considera ca unitate de masur
a timpul acestora de executie. In
acest fel timpul de executie va exprimat prin num
arul de operatii elementare
executate. Sunt considerate operatii elementare cele aritmetice (adunare, scadere,
nmultire, mp
artire), comparatiile si cele logice (negatie, conjunctie si disjunctie).

51

1:
2:
3:
4:
5:
6:
7:

S0
i0
while i < n do
ii+1
S S+i
end while
return S

Operatie
1
2
3
4
5

Cost
c1
c2
c3
c4
c5

Nr. repet
ari
1
1
n+1
n
n

Tabelul 3.1: Analiza costurilor n cazul algoritmului de calcul a sumei primelor


n numere naturale
Cum scopul calculului timpului de executie este de a permite compararea algoritmilor, uneori este sucient s
a se contorizeze doar anumite tipuri de operatii
elementare, numite operatii de baz
a (de exemplu n cazul unui algoritm de
cautare sau de sortare se pot contoriza doar operatiile de comparare) si/sau
sa se considere ca timpul de executie a acestora este unitar (desi operatiile de
nmmultire si mp
artire sunt mai costisitoare decat cele de adunare si scadere
n analiz
a se poate considera ca ele au acelasi cost).
Timpul de executie al ntregului algoritm se obtine nsumand timpii de
executie ai prelucr
arilor componente.

Exemplul 3.1 Consider
am problema calculului sumei ni=1 i. Dimensiunea
acestei probleme poate considerat
a n. Algoritmul si tabelul cu costurile
corespunz
atoare prelucr
arilor sunt prezentate n Tabelul 3.1. Insumand timpii
de executie ai prelucr
arilor elementare se obtine: T (n) = n(c3 + c4 + c5 ) + c1 +
c2 + c3 = k1 n + k2 , adic
a timpul de executie depinde liniar de dimensiunea
problemei. Costurile operatiilor elementare inuenteaza doar constantele ce
intervin n functia T (n).
Calculul sumei poate realizat si utiliz
and o prelucrare de tip for i 1, n
do S S + i endfor. Costul gestiunii contorului (initializare, testare si
arile
incrementare) ind c2 + (n + 1)c3 + nc4 . In cazul n care toate prelucr
au cost unitar se obtine 2(n + 1) pentru costul gestiunii contorului unui ciclu
for cu n iteratii. Ipoteza costului unitar nu este n ntregime corecta ntrucat
initializarea consta ntr-o simpl
a atribuire iar incrementarea ntr-o adunare si
o atribuire. Totusi pentru a simplica analiza o vom utiliza n continuare.
Exemplul 3.2 Consider
am problema determin
arii produsului a dou
a matrici:
A de dimensiune mn si B de dimensiune np. In acest caz dimensiunea problemei este determinata de trei valori: (m, n, p). Algoritmul si analiza costurilor
este prezentata n Tabelul 3.2.
Costul prelucr
arilor de pe liniile 1, 2 si 4 reprezint
a costul gestiunii contorului si
va tratat global. Presupun
and c
a toate operatiile aritmetice si de comparare
au cost unitar obtine timpul de executie T (m, n, p) = 4mnp + 5mp + 4m + 2.
52

1:
2:
3:
4:
5:
6:
7:
8:
9:

for i 1, m do
for j 1, p do
c[i, j] 0
for k 1, n do
c[i, j] c[i, j] + a[i, k] b[k, j]
end for
end for
end for
return c[1..m, 1..p]

Op.
1
2
3
4
5

Cost
2(m + 1)
2(p + 1)
1
2(n + 1)
2

Nr. repet.
1
m
mp
mp
mpn

Tabelul 3.2: Analiza costurilor n cazul produsului a dou


a matrici
1:
2:
3:
4:
5:
6:
7:

m x[1]
for i 2, n do
if m > x[i] then
m x[i]
end if
end for
return m

Operatie
1
2
3
4

Cost
1
2n
1
1

Nr. repet
ari
1
1
n1
(n)

Tabelul 3.3: Analiza costurilor n cazul algoritmului de determinare a minimului dintr-un tablou
In practic
a nu este necesara o analiz
a at
at de detaliata ci este sucient s
a se
identice operatia dominant
a si sa se estimeze numarul de repet
ari ale acesteia.
Prin operatie dominant
a se ntelege operatia care contribuie cel mai mult la
timpul de executie a algoritmului si de regula este operatia ce apare n ciclul
cel mai interior. In exemplul de mai sus ar putea considerata ca operatie
dominant
a, operatia de nmultire. In acest caz costul executiei algoritmului ar
T (m, n, p) = mnp.
Exemplul 3.3 Consider
am problema determin
arii valorii minime dintr-un tablou x[1..n]. Dimensiunea problemei este data de num
arul n de elemente ale
tabloului. Prelucr
arile algoritmului si costurile corespunz
atoare sunt prezentate
n Tabelul 3.3.
Spre deosebire de exemplele anterioare timpul de executie nu poate calculat
explicit ntrucat num
arul de repet
ari ale prelucr
arii numerotate cu 4 depinde
de valorile aate n tablou. Dac
a cea mai mica valoare din tablou se a
a chiar
pe prima pozitie atunci prelucrarea 4 nu se efectueaz
a nici o dat
a iar (n) = 0.
Acesta este considerat cazul cel mai favorabil.
Daca, n schimb, elementele tabloului sunt n ordine strict descrescatoare atunci
prelucrarea 4 se efectueaza la ecare iteratie adica (n) = n 1. Acesta este
cazul cel mai defavorabil.
53

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

gasit false
i1
while (gasit =false) and i n do
if v = x[i] then
gasit true
else
ii+1
end if
end while
return gasit

Operatie
1
2
3
4
5
6

Cost
1
1
3
1
1
1

Nr. repet
ari
1
1
1 (n) + 1
1 (n)
2 (n)
3 (n)

Tabelul 3.4: Analiza costurilor n cazul caut


arii secventiale
Timpul de executie poate astfel ncadrat ntre dou
a limite: 3n T (n)
4n 1. In acest caz este usor de observat ca se poate considera ca operatie
dominant
a cea a compar
arii dintre valoarea variabilei m si elementele tabloului.
In acest caz costul algoritmului ar T (n) = n1. In ambele situatii dependenta
timpului de executie de dimensiunea problemei este liniar
a.
Exemplul 3.4 Consider
am problema caut
arii unei valori v ntr-un tablou x[1..n].
Dimensiunea problemei este din nou n iar o prim
a variant
a a algoritmului este
si costurile corespunz
atoare algoritmului este prezentata n Tabelul 3.4.
In cazul n care valoarea v se aa n sir not
am cu k prima pozitie pe care se
a
a. Se obtine:

k valoarea se aa n sir
deci 1 1 (n) n.
1 (n) =
n valoarea nu se aa n sir

2 (n) =

3 (n) =

k1
n

1
0

valoarea se aa n sir
.
valoarea nu se aa n sir

valoarea se aa n sir
valoarea nu se aa n sir

deci 0 3 (n) n.

Cazul cel mai favorabil este cel n care valoarea se aa pe prima pozitie n
tablou, caz n care T (n) = 3(1 (n) + 1) + 1 (n) + 2 (n) + 3 (n) + 2 = 6 + 1 +
1 + 0 + 2 = 10.
Cazul cel mai defavorabil este cel n care valoarea nu se aa n tablou: T (n) =
3(n + 1) + n + 0 + n + 2 = 5(n + 1).
O alt
a variant
a a algoritmului de c
autare este descrisa n Tabelul 3.5. Dac
a
exista k astfel nc
at x[k] = v atunci (n) = k 1. In acest caz num
arul total
de operatii este 4k + 2. In cazul cel mai favorabil numarul de operatii este 6
iar n cazul cel mai defavorabil numarul de operatii este 4n + 2.
54

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

i1
while (x[i] = v) and (i < n) do
ii+1
end while
if x[i] = v then
gasit true
else
gasit false
end if
return gasit

Operatie
1
3
4
5-8

Cost
1
3
1
2

Nr. repet
ari
1
(n) + 1
(n)
1

Tabelul 3.5: Analiza costurilor n cazul caut


arii secventiale

3.1.1

Analiza cazurilor extreme

Asa cum rezult


a din analiza algoritmului de c
autare prezentat n Exemplul
3.4. num
arul de operatii executate depinde uneori nu doar de dimensiunea
problemei ci si de propriet
atile datelor de intrare. Astfel pentru instante diferite
ale problemei se executa un num
ar diferit de prelucr
ari. In astfel de situatii
num
arul de operatii executate nu poate calculat exact, astfel ca se calculeaza
margini ale acestuia analizand cele dou
a cazuri extreme: cazul cel mai favorabil
si cazul cel mai defavorabil.
Cazul favorabil corespunde acelor instante ale problemei pentru care num
arul de operatii efectuate este cel mai mic. Analiza n cazul cel mai favorabil
permite identicarea unei limite inferioare a timpului de executie. Aceasta
analiz
a este util
a pentru a identica algoritmi inecienti (daca un algoritm are
un cost mare n cel mai favorabil caz, atunci el nu poate considerat o variant
a acceptabila). Sunt situatii n care frecventa instantelor corespunzatoare
celui mai favorabil caz sau apropiate acestuia este mare. In astfel de situatii estim
arile obtinute n cel mai favorabil caz sunt furnizeaza informatii utile despre
algoritm. De exemplu algoritmul de sortare prin insertie, analizat n Capitolul
4, se comporta bine n cazul n care tabloul este deja sortat, iar aceasta comportare r
amane valabil
a si pentru tablouri aproape sortate.
Cazul cel mai defavorabil corespunde instantelor pentru care num
arul de
operatii efectuate este maxim. Analiza acestui caz furnizeaz
a o limit
a superioar
a a timpului de executie . In aprecierea si compararea algoritmilor intereseaza n special cel mai defavorabil caz deoarece furnizeaza cel mai mare timp
a parte
de executie relativ la orice date de intrare de dimensiune data. Pe de alt
pentru anumiti algoritmi cazul cel mai defavorabil este relativ frecvent.

3.1.2

Analiza cazului mediu

Uneori, cazurile extreme (cel mai defavorabil si cel mai favorabil) se nt


alnesc
rar, astfel ca analiza acestor cazuri nu furnizeaza sucienta informatie despre

55

algoritm.
In aceste situatii este util
a o alt
a masur
a a complexit
atii algoritmilor si
anume timpul mediu de executie. Acesta reprezinta o valoare medie a timpilor
de executie calculata n raport cu distributia de probabilitate corespunz
atoare
spatiului datelor de intrare. Stabilirea acestei distributii de probabilitate presupune mp
artirea multimii instantelor posibile ale problemei n clase astfel
nc
at pentru instantele din aceeasi clasa num
arul de operatii efectuate sa e
acelasi.
Daca (n) reprezint
a num
arul cazurilor posibile (clase de instante pentru
care algoritmul efectueaza acelasi num
ar de operatii), Pk este probabilitatea de
aparitie a cazului k iar Tk (n) este timpul de executie corespunzator cazului k
atunci timpul mediu este dat de relatia:


(n)

Tm (n) =

Tk (n)Pk .

k=1

Daca toate cazurile sunt echiprobabile (Pk = 1/(n)) se obtine Tm (n) =


(n)
k=1 Tk (n)/(n).
Exemplu. Consider
am din nou problema c
aut
arii unei valori v ntr-un tablou
x[1..n] (exemplul 3.4). Pentru a simplica analiza vom considera c
a elementele
tabloului sunt distincte. Pentru a calcula timpul mediu de executie trebuie sa
facem ipoteze asupra distributiei datelor de intrare.
Dicultatea principal
a n stabilirea timpului mediu const
a n stabilirea distributiei corespunz
atoare spatiului datelor de intrare. Pentru exemplul n
discutie s-ar putea lua n considerare si ipoteza ca probabilitatea ca valoarea v
sa se ae n tablou este P (v se aa n tablou) = p, iar probabilitatea ca valoarea
sa nu se ae n tablou este P (v nu se a
a n tablou) = 1p. In plus consider
am
ca n cazul n care se aa n tablou elementul c
autat se gaseste cu aceeasi probabilitate pe oricare dintre cele n pozitii: P (v se aa pe pozitia k) = 1/n. In
acest caz timpul mediu este:
p
(10 5p)n + (5p + 10)
5(k + 1) + 5(1 p)(n + 1) =
n
2
n

Tm (n) =

k=1

Daca sansa ca elementul s


a se ae n sir coincide cu cea ca el sa nu se ae
atunci se obtine Tm (n) = (15n + 25)/4.
O alt
a ipotez
a asupra distributiei de probabilitate corespunz
atoare diferitelor
instante ale problemei este sa consider
am ca valoarea v se poate aa pe oricare
dintre pozitiile din tablou sau n afara acestuia cu aceeasi probabilitate. Cum
num
arul cazurilor posibile este (n) = n + 1 (n cazuri n care valoarea se aa n
cadrul tabloului si unul n care v nu se a
a n tablou) rezult
a ca probabilitatea
ec
arui caz este 1/(n + 1). Cum timpul corespunz
ator cazului n care v se aa
ator cazului n care valoarea
pe pozitia k este Tk = 5(k + 1) iar cel corespunz
56

nu se a
a n tablou este Tn+1 = 5(n + 1) rezult
a ca timpul mediu de executie
este:
n
1 
5(n2 + 5n + 2)
(
5(k + 1) + 5(n + 1)) =
Tm (n) =
n+1
2(n + 1)
k=1

Aceasta ipotez
a este natural
a n cazul n care se analizeaza o variant
a a
algoritmului caracterizat
a prin faptul c
a se adauga la tablou un element care
coincide cu valoarea cautat
a. Aceasta variant
a se bazeaza pe tehnica fanionului
si este descrisa n algoritmul 3.1. Algoritmul returneaz
a pozitia pe care se aa
valoarea cautat
a. Dac
a pozitia returnat
a este n+1 atunci nseamna ca valoarea
cautat
a nu se a
a n tabloul initial.
Algoritmul 3.1 Cautare secventiala folosind tehnica fanionului
1: x[n + 1] v
2: i 1
3: while x[i] = v do
4:
ii+1
5: end while
6: return i
Pentru cazul n care valoarea cautat
a se aa pe pozitia k (k {1, . . . , n+1})
num
arul de
operat

ii
efectuate
este
T
(n)
= 2k + 1. Astfel timpul mediu este
k


n+1
(2k
+
1)
/(n
+
1)
=
n
+
3.
Tm (n) =
k=1
Timpul mediu de executie depinde de ipotezele facute asupra distributiei
datelor de intrare si n general nu este o simpla medie aritmetic
a a timpilor
corespunz
atori cazurilor extreme (cel mai favorabil respectiv cel mai defavorabil).
Datorit
a dicult
atilor ce pot interveni n estimarea timpului mediu si datorit
a faptului c
a n multe situatii acesta difer
a de timpul n cazul cel mai
defavorabil doar prin valori ale constantelor implicate, de regul
a analiza se
refer
a la estimarea timpului n cazul cel mai defavorabil. Timpul mediu are
semnicatie atunci cand pentru problema n studiu cazul cel mai defavorabil
apare rar.

3.2

Ordin de crestere

Pentru a aprecia ecienta unui algoritm nu este necesara cunoasterea expresiei


detaliate a timpului de executie. Mai degraba intereseaza modul n care timpul
de executie creste o dat
a cu cresterea dimensiunii problemei. O m
asur
a util
a
n acest sens este ordinul de crestere. Acesta este determinat de termenul
dominant din expresia timpului de executie. Cand dimensiunea problemei este
mare valoarea termenului dominant dep
aseste semnicativ valorile celorlalti
termeni astfel ca acestia din urm
a pot neglijati. Pentru a stabili ordinul de
57

crestere al timpului de executie al unui algoritm este sucient s


a se contorizeze
operatia dominant
a (cea mai costisitoare si mai frecvent executata).
Exemple. Daca T (n) = an + b (a > 0) cand dimensiunea problemei creste de
k ori si termenul dominant din timpul de executie creste de acelasi num
ar de
ori c
aci T (kn) = k (an) + b. In acest caz este vorba despre un ordin liniar de
crestere. Daca T (n) = an2 +bn+c (a > 0) atunci T (kn) = k 2 (an2 )+k(bn)+c,
a este un
deci termenul dominant creste de k 2 ori, motiv pentru care spunem c
ordin p
atratic de crestere.
Daca T (n) = algn atunci T (kn) = algn + algk, adic
a termenul dominant
nu se modic
a, timpul de executie crescand cu o constanta (n raport cu n).
In relatiile anterioare si in toate cele ce vor urma prin lg not
am logaritmul n
baza 2 (ntrucat trecerea de la o baza la alta este echivalenta cu nmultirea
cu o constant
a ce depinde doar de bazele implicate, iar n stabilirea ordinului
de crestere se ignora constantele, n analiza ecientei baza logaritmilor nu este
relevant
a). Un ordin logaritmic de crestere reprezinta o comportare bun
a.
a ordinul de crestere
Daca n schimb T (n) = a2n atunci T (kn) = a(2n )k adic
este exponential.
Intrucat problema ecientei devine critic
a pentru probleme de dimensiuni
mari analiza ecientei se efectueaza pentru valori mari ale lui n (teoretic se
consider
a ca n ), n felul acesta luandu-se n considerare doar comportarea
termenului dominant. Acest tip de analiz
a se numeste analiz
a asimptotic
a. In
cadrul analizei asimptotice se consider
a ca un algoritm este mai ecient dec
at
altul dac
a ordinul de crestere al timpului de executie al primului este mai mic
dec
at cel al celui de-al doilea.
Relatia ntre ordinele de crestere are semnicatie doar pentru dimensiuni
mari ale problemei. Daca consider
am timpii T1 (n) = 10n + 10 si T2 (n) = n2
atunci se observ
a cu usurint
a ca T1 (n) > T2 (n) pentru n 10, desi ordinul de
at cel al lui T2 (Figura 3.1).
crestere al lui T1 este evident mai mic dec
Prin urmare un algoritm asimptotic mai ecient dec
at altul reprezint
a varianta cea mai bun
a doar n cazul problemelor de dimensiuni mari.

3.3

Notatii asimptotice

Pentru a usura analiza asimptotic


a si pentru a permite gruparea algoritmilor n
clase n functie de ordinul de crestere a timpului de executie (f
acand abstractie
de eventualele constante ce intervin n expresiile detaliate ale timpilor de executie)
s-au introdus niste clase de functii si notatii asociate.

58

Tn

800

600
T2 n  n2
400

200

T1 n10n10

10

15

20

25

30

Figura 3.1: Ordin liniar si ordin p


atratic de crestere

3.3.1

Notatia .

Definitia 3.1 Pentru o functie g : N R+ , (g(n)) reprezint


a multimea de
functii:
(g(n))

at
= {f : N R+ ; c1 , c2 R+ , n0 N astfel nc
(3.1)
c1 g(n) f (n) c2 g(n), n n0 }

Despre timpul de executie al unui algoritm, T (n), se spune ca este de ordinul (g(n)) dac
a T (n) (g(n)). Prin abuz de notatie n algoritmica se
obisnuieste sa se scrie T (n) = (g(n)). Din punct de vedere intuitiv faptul c
a
f (n) (g(n)) nseamna ca f (n) si g(n) sunt asimptotic echivalente, adic
a au
acelasi ordin de crestere. Altfel spus limn f (n)/g(n) = k, k ind o valoare
nita strict pozitiva.
In gura 3.2 este ilustrata aceasta idee folosind reprezentarile grace ale
functiilor f (n) = n2 + 5nlgn + 10 si g(n) = ci n2 , ci {1, 2}, pentru diverse
domenii de variatie ale lui n (n {1, . . . , 5}, n {1, . . . , 50} respectiv n
{1, . . . , 500}) si valorile c1 = 1 si c2 = 4. Pentru aceste valori ale constantelor
a este sucient s
a consider
am n0 = 3 pentru
c1 si c2 se observa din grac c
a ar
ata ca f (g(n)). Constanta c2 = 4 conduce la o margine superioar
a
relaxat
a. In realitate orice valoarea supraunitar
a poate considerat
a, ns
a cu
at n0 va mai mare.
cat c2 este mai mica cu at
Exemplu. Pentru Exemplul 3.1 (calcul sum
a) s-a obtinut T (n) = k1 n + k2
(k1 > 0, k2 > 0) prin urmare pentru c1 = k1 , c2 = k1 + 1 si n0 > k2 se obtine
ca c1 n T (n) c2 n pentru n n0 , adic
a T (n) (n).
59

Tn

Tn

100

10 000

n0  3

4n2

80

8000

60

4n2

6000

40

n2  5nlgn  10

20

2000

n2
2

n2  5nlgn  10

4000

n2
5

10

20

30

40

50

Tn
600 000
500 000

4n2

400 000
300 000

n2  5nlgn  10

200 000

n2

100 000

100

200

300

400

500

Figura 3.2: Gracele functiilor f (linie continu


a), c1 g,c2 g (linie punctata)
Pentru Exemplul 3.3 (determinare minim) s-a obtinut c
a 3n T (n) 4n1
prin urmare T (n) (n) (este sucient sa se considere c1 = 3, c2 = 4 si
n0 = 1).
Propozitia 3.1 Notatia are urm
atoarele propriet
ati:
(i) Dac
a T (n) = ak nk +ak1 nk1 +. . .+a1 n+a0 , ak > 0 atunci T (n) (nk ).
(ii) (loga (n)) = (logb (n)) pentru orice valori reale pozitive a si b (diferite
de 1).
(iii) f (n) (f (n)) (reflexivitate).
(iv) Dac
a f (n) (g(n)) atunci g(n) (f (n)) (simetrie).
(v) Dac
a f (n) (g(n)) si g(n) (h(n)) atunci f (n) (h(n)) (tranzitivitate).
(vi) (f (n) + g(n)) = (max{f (n), g(n)}).
Demonstratie. (i) Intr-adev
ar, din limn T (n)/nk = ak rezulta ca pentru
orice > 0 exista n0 () cu proprietatea ca |T (n)/nk ak | pentru orice
n n0 (). Deci
ak

T (n)
ak + ,
nk
60

n n0 ()

adic
a pentru c1 = ak , c2 = ak + si n0 = n0 () se obtin inegalit
atile din
(3.1).
(ii) Proprietatea rezult
a din denitie si din faptul c
a loga (n) = logb (n)/ logb (a).
(iii)-(vi) Toate proprietatile rezulta simplu din denitie.

Proprietatea (ii) sugereaz
a faptul c
a n analiza ecientei nu are importanta
baza logaritmului, motiv pentru care n continuare logaritmul va specicat
generic prin lg f
ar
a a se face referire la baza lui (implicit se consider
a baza
2). Propriet
atile (iii)-(v) sugereaz
a ca notatia permite denirea unei clase
de echivalenta (f (n) si g(n) sunt echivalente dac
a f (n) (g(n))). Clasele de
echivalenta corespunzatoare sunt numite clase de complexitate.
Notatia se foloseste atunci cand se poate determina explicit expresia
timpului de executie sau timpii de executie corespunzatori cazurilor extreme
au acelasi ordin de crestere.
In cazul Exemplului 3.4 (problema c
aut
arii) s-a obtinut c
a 10 T (n)
5(n + 1) ceea ce sugereaza ca exista cazuri (de exemplu, valoarea este gasita pe
prima pozitie) n care num
arul de operatii efectuate nu depinde de dimensiunea
asit un c1
problemei. In aceasta situatie T (n)  (n) deoarece nu poate g
si un n0 astfel nc
at c1 n 10 pentru orice n n0 . In astfel de situatii se
analizeaza comportarea asimptotica a timpului n cazul cel mai defavorabil. In
situatia n care pentru toate datele de intrare timpul de executie nu depinde
de volumul acestora (de exemplu n cazul algoritmului de determinare a valorii
minime dintr-un sir ordonat cresc
ator) atunci se noteaza T (n) (1) (timp de
executie constant).

3.3.2

Notatia O.

Definitia 3.2 Pentru o functie g : N R+ , O(g(n)) reprezint


a multimea de
functii:
O(g(n))

at
= {f : N R+ ; c R+ , n0 N astfel nc
(3.2)
0 f (n) cg(n), n n0 }

Aceasta clasa de functii permite descrierea comportarii unui algoritm n


cazul cel mai defavorabil far
a a se face referire la celelalte situatii. Intrucat de
regul
a intereseaza comportarea algoritmului pentru date arbitrare de intrare
este sucient sa specic
am o margine superioara pentru timpul de executie.
Intuitiv, faptul c
a f (n) O(g(n)) nseamna ca f (n) creste asimptotic cel mult
la fel de repede ca g(n). Altfel spus limn f (n)/g(n) = k, k ind o valoare
pozitiv
a, dar nu neap
arat nenul
a.
Folosind denitia se pot demonstra urmatoarele proprietati ale notatiei O.
Propozitia 3.2 Notatia O are urm
atoarele propriet
ati:

61

(i) Dac
a T (n) = ak nk +ak1 nk1 +. . .+a1 n+a0 , ak > 0 atunci T (n) O(np )
pentru orice p k.
(ii) f (n) O(f (n)) (reflexivitate).
(iii) Dac
a f (n) O(g(n)) si g(n) O(h(n)) atunci f (n) O(h(n)) (tranzitivitate).
(iv) O(f (n) + g(n)) = O(max{f (n), g(n)}).
(v) (g(n)) O(g(n)).
Dup
a cum ilustreaza Exemplul 3.4, incluziunea de la proprietatea (v), adic
a
(g(n)) O(g(n)), este stricta.
Folosind denitia lui O se veric
a usor ca dac
a g1 (n) < g2 (n) pentru n n0
iar f (n) O(g1 (n)) atunci f (n) O(g2 (n)). Prin urmare dac
a T (n) O(n)
atunci T (n) O(nd ) pentru orice d 1. Evident la analiza unui algoritm este
util s
a se pun
a n evidenta cea mai mica margine superioara. Astfel pentru
algoritmul din Exemplul 3.4 vom spune ca are ordinul de complexitate O(n) si
a armatia ar corecta din punctul de vedere al denitiei).
nu O(n2 ) (chiar dac
Notatia o. Daca n Denitia 3.2 n locul inegalit
atii f (n) cg(n) se specica inegalitatea stricta f (n) < cg(n) care are loc pentru orice constanta
pozitiv
a c atunci se obtine clasa o(g(n)). Aceasta este echivalent cu faptul ca
a notatie putem scrie ca 3n 1 o(n2 ) dar
limn f (n)/g(n) = 0. Cu aceast
n2 + 3n 1  o(n2 ) (desi n2 + 3n 1 O(n2 )). Aceasta notatie este mai putin
frecvent folosit
a n practic
a decat O.

3.3.3

Notatia .

Definitia 3.3 Pentru o functie g : N R+ , (g(n)) reprezint


a multimea de
functii:
(g(n)) =

{f : N R+ ; c R+ , n0 N astfel nc
at
(3.3)
cg(n) f (n), n n0 }

Notatia se foloseste pentru a exprima ecienta algoritmului pornind de


la timpul de executie corespunzator celui mai favorabil caz. Intuitiv, faptul c
a
f (n) (g(n)) nseamna ca f (n) creste asimptotic cel putin la fel de repede
ca g(n), adica limn f (n)/g(n) k, k ind o valoare strict pozitiv
a dar nu
neap
arat nit
a (limita poate chiar innit
a).
Propozitia 3.3 Notatia are urm
atoarele propriet
ati:
(i) Dac
a T (n) = ak nk +ak1 nk1 +. . .+a1 n+a0 , ak > 0 atunci T (n) O(np )
pentru orice p k.
62

(ii) f (n) (f (n)) (reflexivitate).


(iii) Dac
a f (n) (g(n)) si g(n) (h(n)) atunci f (n) (h(n)) (tranzitivitate).
(iv) (f (n) + g(n)) = (max{f (n), g(n)}).
(v) (g(n)) (g(n)).
(vi) Dac
a f (n) O(g(n)) atunci g(n) (f (n)) si reciproc.
Asa cum rezult
a din Exemplul 3.4 incluziunea (g(n)) (g(n)) este
stricta: T (n) (1) - corespunde cazului n care valoarea se gaseste pe prima
pozitie - ns
a T (n)  (1) ntrucat n cazul cel mai defavorabil timpul de
executie depinde de n. Din propriet
atile (v) din Propozitiile 3.2 si 3.3 rezult
a
ca (g(n)) = O(g(n)) (g(n)).
Notatia . Daca n Denitia 3.3 n locul inegalit
atii cg(n) f (n) se specica inegalitatea stricta cg(n) < f (n) care are loc pentru orice constanta
pozitiv
a c atunci se obtine clasa (g(n)). Aceasta este echivalent cu faptul ca
limn f (n)/g(n) = . Cu aceasta notatie putem scrie ca 3n2 1 (n) dar
3n 1  (n) (desi 3n 1 (n)).

3.3.4

Analiza asimptotic
a a principalelor structuri de prelucrare

Consider
am problema determin
arii ordinului de complexitate n cazul cel mai
defavorabil pentru structurile algoritmice: secvential
a, alternativ
a si repetitiv
a.
Presupunem c
a structura secventiala este constituit
a din prelucr
arile A1 ,
. . ., Ak si ecare dintre acestea are ordinul de complexitate O(gi (n)). Atunci
structura va avea ordinul de complexitate O(g1 (n) + . . . + gk (n)) =
O(max{g1 (n), . . . , gk (n)}).
Daca evaluarea conditiei unei structuri alternative are cost constant iar
prelucrarile corespunz
atoare celor dou
a variante au ordinele de complexitate
O(g1 (n)) respectiv O(g2 (n)) atunci costul structurii alternative va
O(max{g1 (n), g2 (n)}).
In cazul unei structuri repetitive pentru a determina ordinul de complexitate
n cazul cel mai defavorabil se consider
a num
arul maxim de iteratii. Daca acesta
este n, iar dac
a n corpul ciclului prelucr
arile sunt de cost constant, atunci se
obtine ordinul O(n). In cazul unui ciclu dublu, dac
a at
at pentru ciclul interior
cat si pentru cel exterior limitele variaz
a ntre 1 si n atunci se obtine de regul
a
o complexitate p
atratica, O(n2 ). Dac
a ns
a limitele ciclului interior se modic
a
este posibil sa se obtin
a un alt ordin. S
a consideram urm
atoarea prelucrare:

63

m1
for i 1, n do
m3m
for j 1, m do
prelucrare de ordin (1)
end for
end for

//prelucrare de cost constant

i
Cum pentru ecare valoarea a lui
ni se iobtine m = n3 rezulta ca timpul de
executie este de forma T (n) = 1 + i=1 (3 + 1) (3 ).

3.3.5

Clase de complexitate

Majoritatea algoritmilor nt
alniti n practic
a se ncadreaza n una dintre clasele
mentionate n Tabelul 3.6. Ordinele de complexitate mentionate n tabel corespund celui mai defavorabil caz.
Complexitate
logaritmica
liniar
a
p
atratica
cubic
a

Ordin
O(lgn)
O(n)
O(nlgn)
O(n2 )
O(n3 )

exponential
a

O(2n )

factorial
a

O(n!)

Exemplu
cautare binar
a
cautare secventiala
sortare prin interclasare
sortare prin insertie
produsul a dou
a matrici
p
atratice de ordin n
prelucrarea tuturor submultimilor
unei multimi cu n elemente
prelucrarea tuturor permut
arilor
unei multimi cu n elemente

Tabelul 3.6: Clase de complexitate si exemple de algoritmi reprezentativi


In ierarhizarea algoritmilor dup
a ordinul de complexitate sunt utile relatiile
(3.4) cunoscute din matematic
a.
(lgn)b
= 0,
n nk
lim

nk
= 0,
n an
lim

an
= 0,
n nn
lim

an
=0
n n!
lim

(a > 1)

(3.4)
Algoritmii aplicabili pentru probleme de dimensiune mare sunt doar cei din
clasa O(nk ) (k  n constant
a) cunoscuti sub numele de algoritmi polinomiali.
Algoritmii de complexitate exponential
a sunt aplicabili doar pentru probleme
de dimensiune mica.
Pentru stabilirea clasei (ordinului) de complexitate a unui algoritm se parcurg urm
atoarele etape:
64

1. Se stabileste dimensiunea problemei.


2. Se identic
a operatia de baza (operatia dominant
a).
3. Se verica daca num
arul de executii ale operatiei de baza depinde doar
de dimensiunea problemei. Daca da, se determin
a acest numar. Dac
a nu,
se analizeaza cazul cel mai favorabil, cazul cel mai defavorabil si (daca
este posibil) cazul mediu.
4. Se stabileste clasa de complexitate caruia i apartine algoritmul.

3.4

Analiza empiric
a

Motivatie. Analiza teoretic


a a ecientei algoritmilor poate dicil
a n cazul
unor algoritmi care nu sunt simpli, mai ales dac
a este vorba de analiza cazului mediu. O alternativ
a la analiza teoretic
a a ecientei o reprezinta analiza
empiric
a.
Aceasta poate utila pentru: (i) a obtine informatii preliminare privind
clasa de complexitate a unui algoritm; (ii) pentru a compara ecienta a doi
(sau mai multi) algoritmi destinati rezolvarii aceleiasi probleme; (iii) pentru a
compara ecienta mai multor implementari ale aceluiasi algoritm; (iv) pentru
a obtine informatii privind ecienta implementarii unui algoritm pe o anumit
a
masina de calcul; (v) pentru a identica portiunile cele mai costisitoare din
cadrul programului (profilare).
Etapele analizei empirice. In analiza empiric
a a unui algoritm se parcurg
de regul
a urm
atoarele etape:
1. Se stabileste scopul analizei.
2. Se alege metrica de ecienta ce va utilizat
a (num
arul de executii ale
unei/unor operatii sau timpul de executie a ntregului algoritm sau a unei
portiuni din algoritm).
3. Se stabilesc propriet
atile datelor de intrare n raport cu care se face analiza (dimensiunea datelor sau propriet
ati specice).
4. Se implementeaz
a algoritmul ntr-un limbaj de programare.
5. Se genereaz
a mai multe seturi de date de intrare.
6. Se executa programul pentru ecare set de date de intrare.
7. Se analizeaz
a datele obtinute.

65

Alegerea masurii de ecienta depinde de scopul analizei. Daca, de exemplu, se urm


areste obtinerea unor informatii privind clasa de complexitate sau
chiar vericarea acuratetei unei estimari teoretice atunci este adecvata utilizarea num
arului de operatii efectuate. Daca ns
a scopul este evaluarea comport
arii implement
arii unui algoritm atunci este potrivit timpul de executie.
Pentru a efectua o analiz
a empirica nu este sucient un singur set de date
de intrare ci mai multe, care sa pun
a n evidenta diferitele caracteristici ale
algoritmului. In general este bine sa se aleaga date de diferite dimensiuni astfel
nc
at sa e acoperit
a o plaj
a cat mai larg
a de dimensiuni. Pe de alt
a parte are
importanta si analiza diferitelor valori sau conguratii ale datelor de intrare.
Daca se analizeaza un algoritm care verica daca un num
ar este prim sau nu si
testarea se face doar pentru numere ce nu sunt prime sau doar pentru numere
care sunt prime atunci nu se va obtine un rezultat relevant. Acelasi lucru
se poate nt
ampla pentru un algoritm a carui comportare depinde de gradul
de sortare a unui tablou (dac
a se aleg e doar tablouri aproape sortate dupa
criteriul dorit e tablouri ordonate n sens invers analiza nu va relevanta).
In vederea analizei empirice la implementarea algoritmului ntr-un limbaj
de programare vor trebui introduse secvente al caror scop este monitorizarea
executiei. Daca metrica de ecienta este numarul de executii ale unei operatii
atunci se utilizeaz
a un contor care se incrementeaza dup
a ecare executie a
operatiei respective. Daca metrica este timpul de executie atunci trebuie
a si momentul iesirii. Manregistrat momentul intr
arii n secventa analizat
joritatea limbajelor de programare ofer
a functii de masurare a timpului scurs
ntre dou
a momente. Este important, n special n cazul n care pe calculator
sunt active mai multe taskuri, sa se contorizeze doar timpul afectat executiei
programului analizat. In special dac
a este vorba de masurarea timpului este indicat s
a se ruleze programul de test de mai multe ori si sa se calculeze valoarea
medie a timpilor.
La generarea seturilor de date de intrare scopul urm
arit este sa se obtin
a
date tipice rul
arilor uzuale (sa nu e doar exceptii). In acest scop adesea
datele se genereaza n manier
a aleatoare. In realitate este vorba de o pseudoaleatoritate ntrucat este simulata prin tehnici cu caracter determinist.
Dup
a executia programului pentru datele de test se nregistreaz
a rezultatele, iar n scopul analizei e se calculeaza marimi sintetice (media, abaterea
standard etc.), e se reprezinta grac perechi de puncte de forma (dimensiune
problema, masur
a de ecienta).

3.5

Analiza amortizat
a

S
a consideram problema num
ar
arii n baza 2 de la 0 p
an
a la n = 2k 1
consider
and valoarea binar
a curent
a stocata ntr-un tablou b[0..k 1] (b[0]
reprezint
a bitul cel mai putin semnicativ iar b[n] reprezint
a bitul cel mai semnicativ). Algoritmul determin
arii valorii n prin num
arare consta n aplicarea

66

repetat
a a unui algoritm de incrementare n baza 2 (Algoritmul 4).
Algoritmul 3.2 Incrementare binar
a
increm(integer b[0..k 1])
integer i
1: i 0
2: while i < k and b[i] = 1 do
3:
b[i] 0
4:
ii+1
5: end while
6: b[i] 1
7: return b[0..k 1]

num
arare(integer n, k)
integer b[0..k 1],j
1: b[0..k 1] 0; write b[0..k 1]
2: for j 1, n do
3:
b[0..k 1] increm(b[0..k 1])
4:
write b[0..k 1]
5: end for

Se pune problema determin


arii ordinului de complexitate n cazul cel mai
defavorabil. Dimensiunea problemei este determinata de valorile k si n iar
operatia dominant
a este cea de schimbare a valorii unei cifre binare: b[i] se
transforma din 1 n 0 (linia 3 a algoritmului increm) sau din 0 n 1 (linia
6 a algoritmului increm). Dac
a se analizeaza ecienta algoritmului increm
independent de contextul general al problemei atunci se observ
a usor ca n
cazul cel mai defavorabil numarul de modicari ale unei cifre binare este k.
Deci algoritmul increm apartine lui O(k). Cum algoritmul num
arare apeleaz
a
algoritmul increm de exact n ori rezult
a ca n cazul cel mai defavorabil se
efectueaza kn operatii pentru a se num
ara de la 1 la n.
j
0
1
2
3
4
5
6
7

b3
0
0
0
0
0
0
0
0

b[0..k 1]
b2 b1
0
0
0
0
0
1
0
1
1
0
1
0
1
1
1
1

b0
0
1
0
1
0
1
0
1

Nr.
operatii
0
1
3
4
7
8
10
11

j
b3
1
1
1
1
1
1
1
1

8
9
10
11
12
13
14
15

b[0..k 1]
b2 b1
0 0
0
0
0
1
0
1
1 0
1
0
1
1
1
1

b0
0
1
0
1
0
1
0
1

Nr.
operatii
15
16
18
19
22
23
25
26

Tabelul 3.7: Num


arul de operatii de transformare a unei cifre binare n cazul
num
ar
arii de la 0 la 15. Cifrele marcate sunt modicate la iteratia j n cadrul
algoritmului num
arare
Daca ns
a se urmareste numarul de operatii efectuate pentru k = 4 si n = 15
(Tabelul 3.7) se observ
a ca num
arul de operatii nu dep
aseste 2n. Aceasta
nseamna ca marginea superioar
a obtinut
a aplic
and analiza clasica este prea
larg
a. Se observ
a ca cifra de pe pozitia 0 se modic
a la ecare iteratie, cifra de
pe pozitia 1 din n dou
a iteratii, cea de pe pozitia 2 din patru n patru iteratii
67

s.a.m.d. Prin urmare num


arul de operatii efectuate este
k1


i=0


1
n


n
= 2n
i
2i
2
i=0

Deci la ecare dintre cele n iteratii din algoritmul num


arare se efectueaza
n cazul cel mai defavorabil un numar mediu de 2 modicai ale cifrelor binare.
Aceasta nseamna ca n contextul utiliz
arii n algoritmul num
arare, algoritmul
de incrementare (care luat independent este de complexitate O(k)) poate
considerat de complexitate O(n)/n ceea ce nseamna ca se poate considera ca
apartine lui O(1). Un cost astfel determinat este numit cost amortizat iar
analiza bazat
a pe astfel de costuri se numeste analiza amortizat
a. Metoda
folosit
a mai sus este cunoscut
a sub numele de analiza bazat
a pe agregare. In
aceasta metoda costul amortizat este considerat acelasi pentru toate operatiile
(setarea unei cifre binare pe 1 respectiv setarea pe 0 au acelasi cost). O alta
variant
a este cea care acorda costuri diferite pentru aceste operatii. Intrucat
num
arul de operatii este mai mare cu c
at sunt mai multe cifre de 1 pe primele
pozitii se asigneaza un cost mai mare set
arii unei cifre pe 1 dec
at set
arii unei
cifre pe 0. De exemplu se considera ca setarea unei cifre pe 1 este cotata cu
costul 2. La setarea efectiva a unei cifre pe 1 se contorizeaz
a costul efectiv
scazand 1 din valoarea cotat
a, 2. Restul joaca rolul unui credit care este folosit
la setarea unei cifre pe 0. In felul acesta costul unui apel al functiei increm
poate considerat egal cu costul setarii unei cifre pe 1 adic
a 2. Ideea este
inspirat
a de amortizarea costurilor n sistemele economice, de unde provine si
denumirea.
Analiza amortizata se bazeaza, ca si analiza cazului mediu, tot pe notiunea
de cost mediu, dar nu n sens statistic, neind astfel necesara stabilirea unei
distributii de probabilitate pentru diferitele clase de instante ale problemei.
Pentru detalii suplimentare privind analiza amortizata pot consultate [3], [6],
[11].

68

S-ar putea să vă placă și