Sunteți pe pagina 1din 19

Capitolul 3

Analiza complexit at ii
algoritmilor
Analiza complexit at ii unui algoritm are ca scop estimarea volumului de resurse
de calcul necesare pentru execut ia algoritmului. Prin resurse se nt elege:
Spat iul de memorie necesar pentru stocarea datelor pe care le prelucreaza
algoritmul.
Timpul necesar pentru execut ia tuturor prelucr arilor specicate n algo-
ritm.
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 apli-
cat n practic a. Analiza complexit at ii, numit a si analiza ecient ei algoritmilor,
este utilizata si n compararea algoritmilor cu scopul de a-l alege pe cel mai
ecient (cel care foloseste cele mai put ine resurse de calcul).

In majoritatea algoritmilor volumul resurselor necesare depinde de dimen-


siunea problemei de rezolvat. Aceasta este determinata de regul a de volumul
datelor de intrare.

In cazul cel mai general acesta este dat de numarul bit ilor
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 bit i utilizat i n reprezentarea lui n, adic a log
2
n| +1.
Daca datele de prelucrat sunt organizate sub forma unor tablouri atunci di-
mensiunea problemei poate considerat a ca ind num arul de componente ale
tablourilor (de exemplu la determinarea minimului dintr-un tablou cu n ele-
mente sau n calculul valorii unui polinom de gradul n se considera ca dimen-
siunea problemei este n). Sunt situat ii 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 t in 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.
Spat iul de memorare este inuent at 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 vari-
antele: (i) tablou bidimensional 100 100 (10000 de valori ntregi); (ii) tablou
unidimensional n care se ret in doar cele 50 de valori nenule si indicii core-
spunz atori (150 de valori ntregi). Alegerea unui mod ecient de reprezentare a
datelor poate inuent a 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 obt inerea unor algoritmi
ecient i din punct de vedere al timpului de execut ie necesita marirea spat iului
de memorie alocat datelor si reciproc.
Dintre cele dou a resurse de calcul, spat iu si timp, cea critic a este timpul de
execut ie.

In continuare vom analiza doar dependent a dintre timpul de execut ie
(nt eles de cele mai multe ori ca numar de repet ari ale unor operat ii) al unui
algoritm si dimensiunea problemei.
3.1 Timp de execut ie

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


rezolvarii unei probleme de dimensiune n. Pentru a estima timpul de execut ie
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 secvent ial.
Operat iile elementare sunt efectuate n timp constant indiferent de va-
loarea operanzilor.
Timpul de acces la informat ie nu depinde de pozit ia acesteia (nu sunt
diferent entre prelucrarea primului element al unui tablou si cea a oricarui
alt element).
A stabili o unitate de masur a nseamna a stabili care sunt operat iile ele-
mentare si a considera ca unitate de masur a timpul acestora de execut ie.

In
acest fel timpul de execut ie va exprimat prin num arul de operat ii elementare
executate. Sunt considerate operat ii elementare cele aritmetice (adunare, scadere,
nmult ire, mp art ire), comparat iile si cele logice (negat ie, conjunct ie si disjunct ie).
51
1: S 0
2: i 0
3: while i < n do
4: i i + 1
5: S S + i
6: end while
7: return S
Operat ie Cost Nr. repet ari
1 c
1
1
2 c
2
1
3 c
3
n + 1
4 c
4
n
5 c
5
n
Tabelul 3.1: Analiza costurilor n cazul algoritmului de calcul a sumei primelor
n numere naturale
Cum scopul calculului timpului de execut ie este de a permite compararea algo-
ritmilor, uneori este sucient s a se contorizeze doar anumite tipuri de operat ii
elementare, numite operat ii de baz a (de exemplu n cazul unui algoritm de
cautare sau de sortare se pot contoriza doar operat iile de comparare) si/sau
sa se considere ca timpul de execut ie a acestora este unitar (desi operat iile de
nmmult ire si mp art ire sunt mai costisitoare decat cele de adunare si scadere
n analiz a se poate considera ca ele au acelasi cost).
Timpul de execut ie al ntregului algoritm se obt ine nsumand timpii de
execut ie ai prelucr arilor componente.
Exemplul 3.1 Consider am problema calculului sumei

n
i=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 execut ie ai prelucr arilor elementare se obt ine: T(n) = n(c
3
+c
4
+c
5
) +c
1
+
c
2
+ c
3
= k
1
n + k
2
, adic a timpul de execut ie depinde liniar de dimensiunea
problemei. Costurile operat iilor elementare inuent eaza doar constantele ce
intervin n funct ia 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 (init ializare, testare si
incrementare) ind c
2
+ (n + 1)c
3
+ nc
4
.

In cazul n care toate prelucr arile
au cost unitar se obt ine 2(n + 1) pentru costul gestiunii contorului unui ciclu
for cu n iterat ii. Ipoteza costului unitar nu este n ntregime corecta ntrucat
init ializarea 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 prob-
lemei 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 operat iile aritmetice si de comparare
au cost unitar obt ine timpul de execut ie T(m, n, p) = 4mnp + 5mp + 4m + 2.
52
1: for i 1, m do
2: for j 1, p do
3: c[i, j] 0
4: for k 1, n do
5: c[i, j] c[i, j] + a[i, k] b[k, j]
6: end for
7: end for
8: end for
9: return c[1..m, 1..p]
Op. Cost Nr. repet.
1 2(m + 1) 1
2 2(p + 1) m
3 1 m p
4 2(n + 1) m p
5 2 m p n
Tabelul 3.2: Analiza costurilor n cazul produsului a dou a matrici
1: m x[1]
2: for i 2, n do
3: if m > x[i] then
4: m x[i]
5: end if
6: end for
7: return m
Operat ie Cost Nr. repet ari
1 1 1
2 2n 1
3 1 n 1
4 1 (n)
Tabelul 3.3: Analiza costurilor n cazul algoritmului de determinare a minimu-
lui dintr-un tablou

In practic a nu este necesara o analiz a at at de detaliata ci este sucient s a se


identice operat ia dominanta si sa se estimeze numarul de repet ari ale acesteia.
Prin operat ie dominant a se nt elege operat ia care contribuie cel mai mult la
timpul de execut ie a algoritmului si de regula este operat ia ce apare n ciclul
cel mai interior.

In exemplul de mai sus ar putea considerata ca operat ie
dominant a, operat ia de nmult ire.

In acest caz costul execut iei algoritmului ar
T(m, n, p) = mnp.
Exemplul 3.3 Consider am problema determin arii valorii minime dintr-un ta-
blou 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 execut ie 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 pozit ie 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 iterat ie adica (n) = n 1. Acesta este
cazul cel mai defavorabil.
53
1: gasit false
2: i 1
3: while (gasit =false) and i n do
4: if v = x[i] then
5: gasit true
6: else
7: i i + 1
8: end if
9: end while
10: return gasit
Operat ie Cost Nr. repet ari
1 1 1
2 1 1
3 3
1
(n) + 1
4 1
1
(n)
5 1
2
(n)
6 1
3
(n)
Tabelul 3.4: Analiza costurilor n cazul caut arii secvent iale
Timpul de execut ie poate astfel ncadrat ntre dou a limite: 3n T(n)
4n 1.

In acest caz este usor de observat ca se poate considera ca operat ie
dominant a cea a compar arii dintre valoarea variabilei m si elementele tabloului.

In acest caz costul algoritmului ar T(n) = n1. In ambele situat ii dependent a


timpului de execut ie de dimensiunea problemei este liniar a.
Exemplul 3.4 Consider am problema caut arii unei valori vntr-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 pozit ie pe care se


a a. Se obt ine:

1
(n) =

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

2
(n) =

1 valoarea se aa n sir
0 valoarea nu se aa n sir
.

3
(n) =

k 1 valoarea se aa n sir
n valoarea nu se aa n sir
deci 0
3
(n) n.
Cazul cel mai favorabil este cel n care valoarea se aa pe prima pozit ie 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 operat ii este 4k + 2.

In cazul cel mai favorabil numarul de operat ii este 6
iar n cazul cel mai defavorabil numarul de operat ii este 4n + 2.
54
1: i 1
2: while (x[i] ,= v) and (i < n) do
3: i i + 1
4: end while
5: if x[i] = v then
6: gasit true
7: else
8: gasit false
9: end if
10: return gasit
Operat ie Cost Nr. repet ari
1 1 1
3 3 (n) + 1
4 1 (n)
5-8 2 1
Tabelul 3.5: Analiza costurilor n cazul caut arii secvent iale
3.1.1 Analiza cazurilor extreme
Asa cum rezult a din analiza algoritmului de c autare prezentat n Exemplul
3.4. num arul de operat ii executate depinde uneori nu doar de dimensiunea
problemei ci si de propriet at ile datelor de intrare. Astfel pentru instant e diferite
ale problemei se executa un num ar diferit de prelucr ari.

In astfel de situat ii
num arul de operat ii 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 instant e ale problemei pentru care num a-
rul de operat ii efectuate este cel mai mic. Analiza n cazul cel mai favorabil
permite identicarea unei limite inferioare a timpului de execut ie. Aceasta
analiz a este util a pentru a identica algoritmi inecient i (daca un algoritm are
un cost mare n cel mai favorabil caz, atunci el nu poate considerat o vari-
ant a acceptabila). Sunt situat ii n care frecvent a instant elor corespunzatoare
celui mai favorabil caz sau apropiate acestuia este mare. In astfel de situatii es-
tim arile obt inute n cel mai favorabil caz sunt furnizeaza informat ii utile despre
algoritm. De exemplu algoritmul de sortare prin insert ie, analizat n Capitolul
4, se comporta bine n cazul n care tabloul este deja sortat, iar aceasta com-
portare r amane valabil a si pentru tablouri aproape sortate.
Cazul cel mai defavorabil corespunde instant elor pentru care num arul de
operat ii efectuate este maxim. Analiza acestui caz furnizeaz a o limit a supe-
rioar a a timpului de execut ie .

In aprecierea si compararea algoritmilor intere-
seaza n special cel mai defavorabil caz deoarece furnizeaza cel mai mare timp
de execut ie relativ la orice date de intrare de dimensiune data. Pe de alt a parte
pentru anumit i 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 informat ie despre
55
algoritm.

In aceste situat ii este util a o alt a masur a a complexit at ii algoritmilor si


anume timpul mediu de execut ie. Acesta reprezinta o valoare medie a timpilor
de execut ie calculata n raport cu distribut ia de probabilitate corespunz atoare
spat iului datelor de intrare. Stabilirea acestei distribut ii de probabilitate pre-
supune mp art irea mult imii instant elor posibile ale problemei n clase astfel
nc at pentru instant ele din aceeasi clasa num arul de operat ii efectuate sa e
acelasi.
Daca (n) reprezint a num arul cazurilor posibile (clase de instant e pentru
care algoritmul efectueaza acelasi num ar de operat ii), P
k
este probabilitatea de
aparit ie a cazului k iar T
k
(n) este timpul de execut ie corespunzator cazului k
atunci timpul mediu este dat de relat ia:
T
m
(n) =
(n)

k=1
T
k
(n)P
k
.
Daca toate cazurile sunt echiprobabile (P
k
= 1/(n)) se obt ine T
m
(n) =

(n)
k=1
T
k
(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 execut ie trebuie sa
facem ipoteze asupra distribut iei datelor de intrare.
Dicultatea principal a n stabilirea timpului mediu const a n stabilirea dis-
tribut iei corespunz atoare spat iului datelor de intrare. Pentru exemplul n
discut ie s-ar putea lua n considerare si ipoteza ca probabilitatea ca valoarea v
sa se aen 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 prob-
abilitate pe oricare dintre cele n pozit ii: P(v se aa pe pozit ia k) = 1/n.

In
acest caz timpul mediu este:
T
m
(n) =
p
n
n

k=1
5(k + 1) + 5(1 p)(n + 1) =
(10 5p)n + (5p + 10)
2
Daca sansa ca elementul s a se ae n sir coincide cu cea ca el sa nu se ae
atunci se obt ine T
m
(n) = (15n + 25)/4.
O alt a ipotez a asupra distribut iei de probabilitate corespunz atoare diferitelor
instant e ale problemei este sa consider am ca valoarea v se poate aa pe oricare
dintre pozit iile 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
pe pozit ia k este T
k
= 5(k + 1) iar cel corespunz ator cazului n care valoarea
56
nu se a a n tablou este T
n+1
= 5(n + 1) rezult a ca timpul mediu de execut ie
este:
T
m
(n) =
1
n + 1
(
n

k=1
5(k + 1) + 5(n + 1)) =
5(n
2
+ 5n + 2)
2(n + 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 pozit ia pe care se aa
valoarea cautat a. Dac a pozit ia returnat a este n+1 atunci nseamna ca valoarea
cautat a nu se a a n tabloul init ial.
Algoritmul 3.1 Cautare secvent iala folosind tehnica fanionului
1: x[n + 1] v
2: i 1
3: while x[i] ,= v do
4: i i + 1
5: end while
6: return i
Pentru cazul n care valoarea cautat a se aa pe pozit ia k (k 1, . . . , n+1)
num arul de operat ii efectuate este T
k
(n) = 2k + 1. Astfel timpul mediu este
T
m
(n) =

n+1
k=1
(2k + 1)

/(n + 1) = n + 3.
Timpul mediu de execut ie depinde de ipotezele facute asupra distribut iei
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 defavora-
bil).
Datorit a dicult at ilor ce pot interveni n estimarea timpului mediu si da-
torit a faptului c a n multe situat ii 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
semnicat ie atunci cand pentru problema n studiu cazul cel mai defavorabil
apare rar.
3.2 Ordin de crestere
Pentru a aprecia ecient a unui algoritm nu este necesara cunoasterea expresiei
detaliate a timpului de execut ie. Mai degraba intereseaza modul n care timpul
de execut ie 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 execut ie. Cand dimensiunea problemei este
mare valoarea termenului dominant dep aseste semnicativ valorile celorlalt i
termeni astfel ca acestia din urm a pot neglijat i. Pentru a stabili ordinul de
57
crestere al timpului de execut ie al unui algoritm este sucient s a se contorizeze
operat ia 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 execut ie 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) = an
2
+bn+c (a > 0) atunci T(kn) = k
2
(an
2
)+k(bn)+c,
deci termenul dominant creste de k
2
ori, motiv pentru care spunem c a este un
ordin p atratic de crestere.
Daca T(n) = algn atunci T(kn) = algn + algk, adic a termenul dominant
nu se modic a, timpul de execut ie crescand cu o constanta (n raport cu n).

In relat iile 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 nmult irea
cu o constant a ce depinde doar de bazele implicate, iar n stabilirea ordinului
de crestere se ignora constantele, n analiza ecient ei baza logaritmilor nu este
relevant a). Un ordin logaritmic de crestere reprezinta o comportare bun a.
Daca n schimb T(n) = a2
n
atunci T(kn) = a(2
n
)
k
adic a ordinul de crestere
este exponent ial.

Intrucat problema ecient ei devine critic a pentru probleme de dimensiuni


mari analiza ecient ei 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 analiza 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 execut ie al primului este mai mic
dec at cel al celui de-al doilea.
Relat ia ntre ordinele de crestere are semnicat ie doar pentru dimensiuni
mari ale problemei. Daca consider am timpii T
1
(n) = 10n + 10 si T
2
(n) = n
2
atunci se observ a cu usurint a ca T
1
(n) > T
2
(n) pentru n 10, desi ordinul de
crestere al lui T
1
este evident mai mic dec at cel al lui T
2
(Figura 3.1).
Prin urmare un algoritm asimptotic mai ecient dec at altul reprezint a vari-
anta cea mai bun a doar n cazul problemelor de dimensiuni mari.
3.3 Notat ii asimptotice
Pentru a usura analiza asimptotic a si pentru a permite gruparea algoritmilor n
clase n funct ie de ordinul de crestere a timpului de execut ie (f acand abstract ie
de eventualele constante ce intervinn expresiile detaliate ale timpilor de execut ie)
s-au introdus niste clase de funct ii si notat ii asociate.
58
T
1
n10n10
T
2
n n
2
5 10 15 20 25 30
n
200
400
600
800
Tn
Figura 3.1: Ordin liniar si ordin p atratic de crestere
3.3.1 Notat ia .
Denit ia 3.1 Pentru o funct ie g : N R
+
, (g(n)) reprezint a mult imea de
funct ii:
(g(n)) = f : N R
+
; c
1
, c
2
R

+
, n
0
N astfel nc at
c
1
g(n) f(n) c
2
g(n), n n
0

(3.1)
Despre timpul de execut ie al unui algoritm, T(n), se spune ca este de or-
dinul (g(n)) dac a T(n) (g(n)). Prin abuz de notat ie 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 lim
n
f(n)/g(n) = k, k ind o valoare
nita strict pozitiva.

In gura 3.2 este ilustrata aceasta idee folosind reprezentarile grace ale
funct iilor f(n) = n
2
+ 5nlgn + 10 si g(n) = c
i
n
2
, c
i
1, 2, pentru diverse
domenii de variat ie ale lui n (n 1, . . . , 5, n 1, . . . , 50 respectiv n
1, . . . , 500) si valorile c
1
= 1 si c
2
= 4. Pentru aceste valori ale constantelor
c
1
si c
2
se observa din grac c a este sucient s a consider am n
0
= 3 pentru
a ar ata ca f (g(n)). Constanta c
2
= 4 conduce la o margine superioar a
relaxat a.

In realitate orice valoarea supraunitar a poate considerat a, ns a cu
cat c
2
este mai mica cu at at n
0
va mai mare.
Exemplu. Pentru Exemplul 3.1 (calcul sum a) s-a obt inut T(n) = k
1
n + k
2
(k
1
> 0, k
2
> 0) prin urmare pentru c
1
= k
1
, c
2
= k
1
+ 1 si n
0
> k
2
se obt ine
ca c
1
n T(n) c
2
n pentru n n
0
, adic a T(n) (n).
59
n
0
3
4n
2
n
2
n
2
5nlgn10
2 3 4 5
n
20
40
60
80
100
Tn
n
2
5nlgn10
4n
2
n
2
0 10 20 30 40 50
n
2000
4000
6000
8000
10000
Tn
n
2
5nlgn10
4n
2
n
2
100 200 300 400 500
n
100000
200000
300000
400000
500000
600000
Tn
Figura 3.2: Gracele funct iilor f (linie continu a), c
1
g,c
2
g (linie punctata)
Pentru Exemplul 3.3 (determinare minim) s-a obt inut c a 3n T(n) 4n1
prin urmare T(n) (n) (este sucient sa se considere c
1
= 3, c
2
= 4 si
n
0
= 1).
Propozit ia 3.1 Notat ia are urm atoarele propriet at i:
(i) Dac a T(n) = a
k
n
k
+a
k1
n
k1
+. . .+a
1
n+a
0
, a
k
> 0 atunci T(n) (n
k
).
(ii) (log
a
(n)) = (log
b
(n)) pentru orice valori reale pozitive a si b (diferite
de 1).
(iii) f(n) (f(n)) (reexivitate).
(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)) (tranzitiv-
itate).
(vi) (f(n) + g(n)) = (maxf(n), g(n)).
Demonstrat ie. (i)

Intr-adev ar, din lim
n
T(n)/n
k
= a
k
rezulta ca pentru
orice > 0 exista n
0
() cu proprietatea ca [T(n)/n
k
a
k
[ pentru orice
n n
0
(). Deci
a
k

T(n)
n
k
a
k
+ , n n
0
()
60
adic a pentru c
1
= a
k
, c
2
= a
k
+ si n
0
= n
0
() se obt in inegalit at ile din
(3.1).
(ii) Proprietatea rezult a din denit ie si din faptul c a log
a
(n) = log
b
(n)/ log
b
(a).
(iii)-(vi) Toate proprietat ile rezulta simplu din denit ie.

Proprietatea (ii) sugereaz a faptul c a n analiza ecient ei nu are important a


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 at ile (iii)-(v) sugereaz a ca notat ia permite denirea unei clase
de echivalent a (f(n) si g(n) sunt echivalente dac a f(n) (g(n))). Clasele de
echivalent a corespunzatoare sunt numite clase de complexitate.
Notat ia se foloseste atunci cand se poate determina explicit expresia
timpului de execut ie sau timpii de execut ie corespunzatori cazurilor extreme
au acelasi ordin de crestere.

In cazul Exemplului 3.4 (problema c aut arii) s-a obt inut c a 10 T(n)
5(n+1) ceea ce sugereaza ca exista cazuri (de exemplu, valoarea este gasita pe
prima pozit ie) n care num arul de operat ii efectuate nu depinde de dimensiunea
problemei.

In aceasta situat ie T(n) , (n) deoarece nu poate g asit un c
1
si un n
0
astfel nc at c
1
n 10 pentru orice n n
0
.

In astfel de situat ii se
analizeaza comportarea asimptotica a timpului n cazul cel mai defavorabil.

In
situat ia n care pentru toate datele de intrare timpul de execut ie 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
execut ie constant).
3.3.2 Notat ia O.
Denit ia 3.2 Pentru o funct ie g : N R
+
, O(g(n)) reprezint a mult imea de
funct ii:
O(g(n)) = f : N R
+
; c R

+
, n
0
N astfel nc at
0 f(n) cg(n), n n
0

(3.2)
Aceasta clasa de funct ii permite descrierea comportarii unui algoritm n
cazul cel mai defavorabil far a a se face referire la celelalte situat ii.

Intrucat de
regul a intereseaza comportarea algoritmului pentru date arbitrare de intrare
este sucient sa specic am o margine superioara pentru timpul de execut ie.
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 lim
n
f(n)/g(n) = k, k ind o valoare
pozitiv a, dar nu neap arat nenul a.
Folosind denit ia se pot demonstra urmatoarele proprietat i ale notatiei O.
Propozit ia 3.2 Notat ia O are urm atoarele propriet at i:
61
(i) Dac a T(n) = a
k
n
k
+a
k1
n
k1
+. . .+a
1
n+a
0
, a
k
> 0 atunci T(n) O(n
p
)
pentru orice p k.
(ii) f(n) O(f(n)) (reexivitate).
(iii) Dac a f(n) O(g(n)) si g(n) O(h(n)) atunci f(n) O(h(n)) (tranzi-
tivitate).
(iv) O(f(n) + g(n)) = O(maxf(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 denit ia lui O se veric a usor ca dac a g
1
(n) < g
2
(n) pentru n n
0
iar f(n) O(g
1
(n)) atunci f(n) O(g
2
(n)). Prin urmare dac a T(n) O(n)
atunci T(n) O(n
d
) pentru orice d 1. Evident la analiza unui algoritm este
util s a se pun a n evident a cea mai mica margine superioara. Astfel pentru
algoritmul din Exemplul 3.4 vom spune ca are ordinul de complexitate O(n) si
nu O(n
2
) (chiar dac a armat ia ar corecta din punctul de vedere al denit iei).
Notat ia o. Daca n Denit ia 3.2 n locul inegalit at ii f(n) cg(n) se spe-
cica inegalitatea stricta f(n) < cg(n) care are loc pentru orice constanta
pozitiv a c atunci se obt ine clasa o(g(n)). Aceasta este echivalent cu faptul ca
lim
n
f(n)/g(n) = 0. Cu aceast a notat ie putem scrie ca 3n 1 o(n
2
) dar
n
2
+3n1 , o(n
2
) (desi n
2
+3n1 O(n
2
)). Aceasta notat ie este mai put in
frecvent folosit a n practic a decat O.
3.3.3 Notat ia .
Denit ia 3.3 Pentru o funct ie g : N R
+
, (g(n)) reprezint a mult imea de
funct ii:
(g(n)) = f : N R
+
; c R

+
, n
0
N astfel nc at
cg(n) f(n), n n
0

(3.3)
Notat ia se foloseste pentru a exprima ecient a algoritmului pornind de
la timpul de execut ie corespunzator celui mai favorabil caz. Intuitiv, faptul c a
f(n) (g(n)) nseamna ca f(n) creste asimptotic cel put in la fel de repede
ca g(n), adica lim
n
f(n)/g(n) k, k ind o valoare strict pozitiv a dar nu
neap arat nit a (limita poate chiar innit a).
Propozit ia 3.3 Notat ia are urm atoarele propriet at i:
(i) Dac a T(n) = a
k
n
k
+a
k1
n
k1
+. . .+a
1
n+a
0
, a
k
> 0 atunci T(n) O(n
p
)
pentru orice p k.
62
(ii) f(n) (f(n)) (reexivitate).
(iii) Dac a f(n) (g(n)) si g(n) (h(n)) atunci f(n) (h(n)) (tranzi-
tivitate).
(iv) (f(n) + g(n)) = (maxf(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
pozit ie - ns a T(n) , (1) ntrucat n cazul cel mai defavorabil timpul de
execut ie depinde de n. Din propriet at ile (v) din Propozit iile 3.2 si 3.3 rezult a
ca (g(n)) = O(g(n)) (g(n)).
Notat ia . Daca n Denit ia 3.3 n locul inegalit at ii cg(n) f(n) se spe-
cica inegalitatea stricta cg(n) < f(n) care are loc pentru orice constanta
pozitiv a c atunci se obt ine clasa (g(n)). Aceasta este echivalent cu faptul ca
lim
n
f(n)/g(n) = . Cu aceasta notat ie putem scrie ca 3n
2
1 (n) dar
3n 1 , (n) (desi 3n 1 (n)).
3.3.4 Analiza asimptotica a principalelor structuri de pre-
lucrare
Consider am problema determin arii ordinului de complexitate n cazul cel mai
defavorabil pentru structurile algoritmice: secvent ial a, alternativa si repetitiv a.
Presupunem c a structura secvent iala este constituit a din prelucr arile A
1
,
. . ., A
k
si ecare dintre acestea are ordinul de complexitate O(g
i
(n)). Atunci
structura va avea ordinul de complexitate O(g
1
(n) + . . . + g
k
(n)) =
O(maxg
1
(n), . . . , g
k
(n)).
Daca evaluarea condit iei unei structuri alternative are cost constant iar
prelucrarile corespunz atoare celor dou a variante au ordinele de complexitate
O(g
1
(n)) respectiv O(g
2
(n)) atunci costul structurii alternative va
O(maxg
1
(n), g
2
(n)).

In cazul unei structuri repetitive pentru a determina ordinul de complexitate


n cazul cel mai defavorabil se consider a num arul maxim de iterat ii. Daca acesta
este n, iar dac a n corpul ciclului prelucr arile sunt de cost constant, atunci se
obt ine 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 obt ine de regul a
o complexitate p atratica, O(n
2
). Dac a ns a limitele ciclului interior se modic a
este posibil sa se obt in a un alt ordin. S a consideram urm atoarea prelucrare:
63
m 1
for i 1, n do
m 3 m
for j 1, m do
prelucrare de ordin (1) //prelucrare de cost constant
end for
end for
Cum pentru ecare valoarea a lui i se obt ine m = 3
i
rezulta ca timpul de
execut ie este de forma T(n) = 1 +

n
i=1
(3
i
+ 1) (3
n
).
3.3.5 Clase de complexitate
Majoritatea algoritmilor nt alnit i n practic a se ncadreazan una dintre clasele
ment ionate n Tabelul 3.6. Ordinele de complexitate ment ionate n tabel core-
spund celui mai defavorabil caz.
Complexitate Ordin Exemplu
logaritmica O(lgn) cautare binar a
liniar a O(n) cautare secvent iala
O(nlgn) sortare prin interclasare
p atratica O(n
2
) sortare prin insert ie
cubic a O(n
3
) produsul a dou a matrici
p atratice de ordin n
exponent ial a O(2
n
) prelucrarea tuturor submult imilor
unei mult imi cu n elemente
factorial a O(n!) prelucrarea tuturor permut arilor
unei mult imi cu n elemente
Tabelul 3.6: Clase de complexitate si exemple de algoritmi reprezentativi

In ierarhizarea algoritmilor dup a ordinul de complexitate sunt utile relat iile


(3.4) cunoscute din matematic a.
lim
n
(lgn)
b
n
k
= 0, lim
n
n
k
a
n
= 0, lim
n
a
n
n
n
= 0, lim
n
a
n
n!
= 0 (a > 1)
(3.4)
Algoritmii aplicabili pentru probleme de dimensiune mare sunt doar cei din
clasa O(n
k
) (k n constant a) cunoscut i sub numele de algoritmi polinomiali.
Algoritmii de complexitate exponent ial a sunt aplicabili doar pentru probleme
de dimensiune mica.
Pentru stabilirea clasei (ordinului) de complexitate a unui algoritm se par-
curg urm atoarele etape:
64
1. Se stabileste dimensiunea problemei.
2. Se identic a operat ia de baza (operat ia dominant a).
3. Se verica daca num arul de execut ii ale operat iei 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 apart ine algoritmul.
3.4 Analiza empirica
Motivat ie. Analiza teoretic a a ecient ei algoritmilor poate dicil a n cazul
unor algoritmi care nu sunt simpli, mai ales dac a este vorba de analiza cazu-
lui mediu. O alternativ a la analiza teoretic a a ecient ei o reprezinta analiza
empiric a.
Aceasta poate utila pentru: (i) a obt ine informat ii preliminare privind
clasa de complexitate a unui algoritm; (ii) pentru a compara ecient a a doi
(sau mai mult i) algoritmi destinat i rezolvarii aceleiasi probleme; (iii) pentru a
compara ecient a mai multor implementari ale aceluiasi algoritm; (iv) pentru
a obt ine informat ii privind ecient a implementarii unui algoritm pe o anumit a
masina de calcul; (v) pentru a identica port iunile cele mai costisitoare din
cadrul programului (prolare).
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 ecient a ce va utilizat a (num arul de execut ii ale
unei/unor operat ii sau timpul de execut ie a ntregului algoritm sau a unei
port iuni din algoritm).
3. Se stabilesc propriet at ile datelor de intrare n raport cu care se face ana-
liza (dimensiunea datelor sau propriet at i 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 obt inute.
65
Alegerea masurii de ecient a depinde de scopul analizei. Daca, de exem-
plu, se urm areste obt inerea unor informat ii privind clasa de complexitate sau
chiar vericarea acuratet ei unei estimari teoretice atunci este adecvata uti-
lizarea num arului de operat ii efectuate. Daca ns a scopul este evaluarea com-
port arii implement arii unui algoritm atunci este potrivit timpul de execut ie.
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 evident a 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
important a si analiza diferitelor valori sau congurat ii 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 obt ine 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 secvent e al caror scop este monitorizarea
execut iei. Daca metrica de ecient a este numarul de execut ii ale unei operat ii
atunci se utilizeaz a un contor care se incrementeaza dup a ecare execut ie a
operat iei respective. Daca metrica este timpul de execut ie atunci trebuie
nregistrat momentul intr arii n secvent a analizat a si momentul iesirii. Ma-
joritatea limbajelor de programare ofer a funct ii 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 execut iei
programului analizat.

In special dac a este vorba de masurarea timpului este in-
dicat 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 obt in a
date tipice rul arilor uzuale (sa nu e doar except ii).

In acest scop adesea
datele se genereaza n manier a aleatoare.

In realitate este vorba de o pseudo-
aleatoritate ntrucat este simulata prin tehnici cu caracter determinist.
Dup a execut ia programului pentru datele de test se nregistreaz a rezul-
tatele, 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 ecient a).
3.5 Analiza amortizata
S a consideram problema num ar arii n baza 2 de la 0 p an a la n = 2
k
1
consider and valoarea binar a curent a stocata ntr-un tablou b[0..k 1] (b[0]
reprezint a bitul cel mai put in semnicativ iar b[n] reprezint a bitul cel mai sem-
nicativ). 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]) numarare(integer n, k)
integer i integer b[0..k 1],j
1: i 0
2: while i < k and b[i] = 1 do
3: b[i] 0
4: i i + 1
5: end while
6: b[i] 1
7: return b[0..k 1]
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
operat ia 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 ecient a 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 apart ine lui O(k). Cum algoritmul numarare apeleaz a
algoritmul increm de exact n ori rezult a ca n cazul cel mai defavorabil se
efectueaza kn operat ii pentru a se num ara de la 1 la n.
j b[0..k 1] Nr.
b
3
b
2
b
1
b
0
operat ii
0 0 0 0 0 0
1 0 0 0 1 1
2 0 0 1 0 3
3 0 0 1 1 4
4 0 1 0 0 7
5 0 1 0 1 8
6 0 1 1 0 10
7 0 1 1 1 11
j b[0..k 1] Nr.
b
3
b
2
b
1
b
0
operat ii
8 1 0 0 0 15
9 1 0 0 1 16
10 1 0 1 0 18
11 1 0 1 1 19
12 1 1 0 0 22
13 1 1 0 1 23
14 1 1 1 0 25
15 1 1 1 1 26
Tabelul 3.7: Num arul de operat ii de transformare a unei cifre binare n cazul
num ar arii de la 0 la 15. Cifrele marcate sunt modicate la iterat ia j n cadrul
algoritmului num arare
Dacans a se urmareste numarul de operat ii efectuate pentru k = 4 si n = 15
(Tabelul 3.7) se observ a ca num arul de operat ii nu dep aseste 2n. Aceasta
nseamna ca marginea superioar a obt inut a aplic and analiza clasica este prea
larg a. Se observ a ca cifra de pe pozit ia 0 se modic a la ecare iterat ie, cifra de
pe pozit ia 1 din n dou a iterat ii, cea de pe pozit ia 2 din patru n patru iterat ii
67
s.a.m.d. Prin urmare num arul de operat ii efectuate este
k1

i=0

n
2
i
| n

i=0
1
2
i
= 2n
Deci la ecare dintre cele n iterat ii din algoritmul numarare 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 numarare, 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
apart ine 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 operat iile
(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 operat ii.

Intrucat
num arul de operat ii este mai mare cu c at sunt mai multe cifre de 1 pe primele
pozit ii 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 funct iei 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 not iunea
de cost mediu, dar nu n sens statistic, neind astfel necesara stabilirea unei
distribut ii de probabilitate pentru diferitele clase de instant e ale problemei.
Pentru detalii suplimentare privind analiza amortizata pot consultate [3], [6],
[11].
68

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