Sunteți pe pagina 1din 25

Complexitatea algoritmilor

TAP
INFO II, III
2010-2011
Algoritm
Def:
O metodă efectivă de rezolvare a unei probleme.

Obs:
1. Problema determină algoritmul.
2. Ce înseamnă efectivă?
3. Dacă există mai mulţi algoritmi, pe care îl
utilizez?
Algoritm
Obs:
1. Problema determină algoritmul.
Pentru probleme diferite, se presupune că se
găsesc algoritmi diferiţi.

Alternativ: General Problem Solver (GPS)


aplicaţie creată în 1957 de H. Simon, J.C. Shaw şi
A. Newell
Algoritm
Obs:
2. Ce înseamnă efectivă?
Indiferent de interacţiunile cu mediul (date de
intrare, valori generate, evenimente externe)
algoritmul este o listă finită, bine-definită de
paşi.

Există programe fără date de intrare???


Valori generate: generatoare de numere aleatoare.
Evenimente externe: depăşirea timpului alocat
pentru un trasfer de date.
Algoritm
Obs:
3. Dacă există mai mulţi algoritmi, pe care îl
utilizez?
Definesc o măsură, unitatea de măsură şi apoi îi
compar.
Măsuri funcţionale (numerice, cantitative): câte
instrucţiuni elementare sunt neceare, câtă
memorie este necesară?
Măsuri nefuncţionale (nenumerice, calitative,
descrise de Ingineria Programării): (anul III!!!)
Unitatea de măsură: o comparaţie, o atribuire…
Proprietăţile algoritmilor
Corect:
rezolvă problema propusă.
Finit:
se încheie întotdeauna (în lipsa întreruperilor
externe).
General:
rezolvă mai multe instanţe (seturi diferite de
date de intrare).
Determinist:
la execuţii repetate în aceleaşi condiţii
evoluează identic.
Analiza algoritmilor
1. Invarianţe.
2. Dacă e finit, atunci rezolvă problema.
3. Este finit.
4. Este cât mai eficient (optim de preferinţă).

Exemplu: Sortarea prin interschimbare


for each i in 0 to n – 2
for each j in i + 1 to n - 1
if A[i] > A[j] then swap( A[i], A[j] )
end for
end for
Analiza algoritmilor
Exemplu: Sortarea prin interschimbare
Invarianţă
După fiecare comparare cu ultimul element al vectorului, cel mai mic element
din fragmentul prelucrat ajunge pe poziţia corectă.

Dacă e finit, atunci rezolvă problema


Se fac n -1 treceri prin vector şi deci se aşează corect primele n -1 elemente,
vectorul este deci corect sortat.

Este finit
Sunt 2 structuri repetitive imbricate, pentru care secvenţa internă se execută de
un număr finit de ori.

Eficienţă
Se va măsura. Optimalitate – Nu se pune problema (încă).
Analiza algoritmilor
Exemplu: Sortarea prin interschimbare
Eficienţă
Se alege instrucţiunea elementară: atribuirea.
Se numără atribuirile:
n2 n 1

 (1 
i 0
 (1 
j i 1
3))  O ( n 2
)

Dacă instrucţiunea elementară este comparaţia? Dar interschimbarea (swap)?


Analiza algoritmilor
Ordinul lui f: N →R
Multimea funcţiilor asimptotic mărginite superior de un multiplu pozitiv al lui f

Ierarhie de ordine ale lui f:

Este de dorit un algoritm de ordin cât mai in stânga.


Analiza algoritmilor
Aproximarea Stirling pentru log(n!):
log(n!) = n*log(n) - n + O(log(n))

Aproximarea Srinivasa Ramanujan pentru log(n!):


log(n!) = n*log(n) - n + log(n*(1+4*n*(1+2*n)))/6 + log(PI)/2
dacă n > 20

Deci O(log(n!)) = O(n log(n))

Ramanujan, Srinivasa (1988), The lost notebook and other unpublished papers, Springer Berlin, p. 339, ISBN

354018726X
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
1. Expandare (augmentation)
instrucţiuni suplimentare
2. Execuţie (execution)
rezultate scrise în fişiere speciale
3. Analiza (analysis)
analiza fişierelor rezultate
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru atribuiri
count = 0
for each i in 0 to n – 2
count++
for each j in i + 1 to n – 1
count++
if A[i] > A[j] then
swap( A[i], A[j] )
count+=3
end for
end for
Fără probleme
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru timp
begin_time = clock()
for each i in 0 to n – 2
for each j in i + 1 to n – 1
if A[i] > A[j] then swap( A[i], A[j] )
end for
end for
end_time = clock()
needed_time = end_time - begin_time

Apar probleme
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru timp
Apar probleme:
Granularitatea ceasului introduce erori (unele
execuţii se fac în timp zero).
Rezolvare (parţială): Se realizează execuţii
multiple şi se calculează media aritmetică.
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru timp
begin_time = clock()
for k in 1 to nexec
reset A
for each i in 0 to n – 2
for each j in i + 1 to n – 1
if A[i] > A[j] then swap( A[i], A[j] )
end for
end for
end for
end_time = clock()
needed_time = (end_time - begin_time)/nexec
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru timp
De ce parţială?
Se introduc suplimentări de timp prin resetarea lui
A.
Altă rezolvare (tot parţială): se consideră doar
aplicaţia originală la captarea timpului.
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru timp
needed_time = 0
for k in 1 to nexec
reset A
begin_time = clock()
for each i in 0 to n – 2
for each j in i + 1 to n – 1
if A[i] > A[j] then swap( A[i], A[j] )
end for
end for
end_time = clock()
needed_time += (end_time - begin_time)
end for
needed_time /=nexec
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru timp
De ce tot parţială?
Se preiau neajunsurile de la trasarea iniţială.

Alte probleme, în cazul unui algoritm oarecare:


Numărul de instrucţiuni elementare poate depinde
de datele de intrare.
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Exemplu pentru timp
Bubble-sort: instrucţiunea elementară este ???
do
swapped = false
for each i in 1 to n - 1
if A[i - 1] > A[i] then
swap( A[i - 1], A[i] )
swapped = true
end for
while swapped
Analiza algoritmilor
Automatizarea analizei (trasare – profiling)
Numărul de instrucţiuni elementare poate depinde
de datele de intrare.

Se definesc cazurile:
• cel mai favorabil (consum minim de resurse)
• mediu (statistica pentru toate cazurile – se
generează toate posibilităţile – uneori infezabil)
• cel mai nefavorabil (consum maxim de
resurse)
Analiza algoritmilor
Analiză teoretică.
Instrucţiune elementară: comparaţia.

Se poate un ordin de sortare prin comparaţie


< O(n log(n)) în cazul cel mai nefavorabil ?

NU
Analiza algoritmilor
Analiză teoretică.
Instrucţiune elementară: comparaţia.
Arborele de decizie: binar, frunza este o permutare,
nodul are o comparaţie.
Analiza algoritmilor
Analiză teoretică.
Instrucţiune elementară: comparaţia.

O listă cu n elemente distincte se sortează în f(n)


comparaţii.
Dacă f(n) este minim, atunci arborele trebuie să fie
echilibrat (arbore AVL*).
Un arbore echilibrat pe f(n) niveluri are cel mult 2f(n)
frunze.
n!< 2f(n) deci f(n)>log(n!)
deci f(n) are cel puţin ordinul O(n log(n))
* Adelson-Velskii, G.; E. M. Landis (1962) "An algorithm for the organization of information". Proceedings of the
USSR Academy of Sciences 146: 263–266. (Russian) English translation by Myron J. Ricci in Soviet
Math. Doklady, 3:1259–1263
Analiza algoritmilor
Analiză teoretică.
Instrucţiune elementară: comparaţia.

Există sortări cu O(n log(n)) în cazul cel mai


nefavorabil?

DA
care???

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