Documente Academic
Documente Profesional
Documente Cultură
Eficienta Algoritmilor
Eficienta Algoritmilor
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).
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.
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.
+
, 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.
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)).
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
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