Documente Academic
Documente Profesional
Documente Cultură
Algoritmica - Analiza Complexitatii Algoritmilor
Algoritmica - Analiza Complexitatii Algoritmilor
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
3.1
Timp de executie
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
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
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)
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
3.1.1
3.1.2
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
Tm (n) =
k=1
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
3.3
Notatii asimptotice
58
Tn
800
600
T2 n n2
400
200
T1 n10n10
10
15
20
25
30
3.3.1
Notatia .
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
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.
at
= {f : N R+ ; c R+ , n0 N astfel nc
(3.2)
0 f (n) cg(n), n n0 }
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 .
{f : N R+ ; c R+ , n0 N astfel nc
at
(3.3)
cg(n) f (n), n n0 }
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
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
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
3.4
Analiza empiric
a
65
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
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
i=0
1
n
n
= 2n
i
2i
2
i=0
68