Sunteți pe pagina 1din 5

LUCRARE DE LABORATOR NR.

1
Tema: Analiza algoritmilor
Scopul lucrrii:
1. Analiza empiric a algoritmilor.
2. Analiza teoretic a algoritmilor.
3. Determinarea complexitii temporale i asimptotice a algoritmilor
Note de curs:
1. Timpul de execuie al algoritmilor
De multe ori, pentru rezolvarea unei probleme, trebuie ales un algoritm dintre mai muli posibili, dou criterii
principale de alegere fiind contradictorii:
algoritmul s fie simplu de neles, de codificat i de depanat;
algoritmul s foloseasc eficient resursele calculatorului, s aib un timp de execuie redus.
Dac programul care se scrie trebuie rulat de un numr mic de ori, prima cerin este mai important; n aceast
situaie, timpul de punere la punct a programului e mai important dect timpul lui de rulare, deci trebuie aleas
varianta cea mai simpl a programului.
Daca programul urmeaz a fi rulat de un numr mare de ori, avnd i un numr mare de date de prelucrat,
trebuie ales algoritmul care duce la o execuie mai rapid. Chiar n aceast situaie, ar trebui implementat mai
nainte algoritmul mai simplu i calculat reducerea de timp de execuie pe care ar aduce-o implementarea
algoritmului complex.
Timpul de rulare al unui program depinde de urmtorii factori:
datele de intrare;
calitatea codului generat de compilator;
natura i viteza de execuie a instruciunilor programului;
complexitatea algoritmului care st la baza programului.
Deci timpul de rulare e o funcie de intrarea sa, de cele mai multe ori, nedepinznd de valorile de la intrare, ci de
numrul de date.
n continuare vom nota cu T(n) timpul de execuie al unui algoritm destinat rezolvrii unei probleme de
dimensiune n. Pentru a estima timpul de execuie trebuie stabilit un model de calcul i o unitate de msur. Vom
consider un model de calcul (numit i main de calcul cu acces aleator) caracterizat prin:
Prelucrrile se efectueaz n mod secvenial.
Operaiile elementare sunt efectuate n timp constant indiferent de valoarea operanzilor.
Timpul de acces la informaie nu depinde de poziia acesteia (nu sunt diferene ntre prelucrarea primului
element i cea a ultimului element al unui tablou).
A stabili o unitate de msur nseamn a stabili care sunt operaiile elementare i a considera ca unitate de
msur timpul de execuie a acestora. In acest fel timpul de execuie va fi exprimat prin numrul de operaii
elementare executate. Operaiile elementare sunt cele aritmetice (adunare, scdere, nmulire, mprire),
comparaiile i cele logice (negaie, conjuncie i disjuncie). Cum scopul calculului timpului de execuie este de a
permite compararea algoritmilor, uneori este suficient s se contorizeze doar anumite tipuri de operaii elementare,
numite operaii de baz (de exemplu n cazul unui algoritm de cutare sau de sortare se pot contoriza doar
operaiile de comparare) i/sau s se considere c timpul de execuie a acestora este unitar (dei operaiile de
nmulire i mprire sunt mai costisitoare dect cele de adunare i scdere n analiza se poate considera c ele au
acelai cost).
Timpul de execuie al ntregului algoritm se obine nsumnd timpii de execuie a prelucrrilor componente.
1.1 Importana celui mai defavorabil caz
In aprecierea i compararea algoritmilor intereseaz n special cel mai defavorabil caz deoarece furnizeaz cel
mai mare timp de execuie relativ la orice date de intrare de dimensiune fix. Pe de alt parte pentru anumii
algoritmi cazul cel mai defavorabil este relativ frecvent.
n ceea ce privete analiza celui mai favorabil caz, acesta furnizeaz o margine inferioar a timpului de execuie
i poate fi util pentru a identifica algoritmi ineficieni (dac un algoritm are un cost mare n cel mai favorabil caz,
atunci el nu poate fi considerat o soluie acceptabil).
1

1.2 Timp mediu de execuie


Uneori, cazurile extreme (cel mai defavorabil i cel mai favorabil) se ntlnesc rar, astfel c analiza acestor
cazuri nu furnizeaz suficient informaie despre algoritm.
n aceste situaii este util o alt msur a complexitii algoritmilor i anume timpul mediu de execuie. Acesta
reprezint o valoare medie a timpilor de execuie calculat n raport cu distribuia de probabilitate corespunztoare
spaiului datelor de intrare.

2. Etapele analizei complexitii


n analiza complexitii unui algoritm se parcurg urmtoarele etape:
1. Se stabilete dimensiunea problemei.
2. Se identific operaia de baz.
3. Se verific dac numrul de execuii ale operaiei de baz depinde doar de dimensiunea problemei. Dac da,
se determin acest numr. Dac nu, se analizeaz cazul cel mai favorabil, cazul cel mai defavorabil i (dac este
posibil) cazul mediu.
4. Se stabilete clasa de complexitate cruia i aparine algoritmul.
Cteva reguli generale pentru evaluarea timpului de execuie n funcie de mrimea datelor de intrare:
1. Timpul de execuie a unei instruciuni de asignare, citire sau scriere, este constant i se noteaz cu O(1).
2. Timpul de rulare a unei secvene de instruciuni e determinat de regula de nsumare, fiind proporional cu
cel mai lung timp din cei ai instruciunilor secvenei.
3. Timpul de execuie a unei instruciuni if - then - else este suma dintre timpul de evaluare a condiiei (O(1))
i cel mai mare dintre timpii de execuie ai instruciunilor pentru condiia adevrat sau fals.
4. Timpul de execuie a unei instruciuni de ciclare este suma, pentru toate iteraiile, dintre timpul de execuie
a corpului instruciunii i cel de evaluare a condiiei de terminare (O(1)).
5. Pentru evaluarea timpului de execuie a unei proceduri recursive, se asociaz fiecrei proceduri recursive
un timp necunoscut T(n), unde n msoar argumentele procedurii; se poate obine o relaie recurent pentru T(n),
adic o ecuaie pentru T(n), n termeni T(k), pentru diferite valori ale lui k.
6. Timpul de execuie poate fi analizat chiar pentru programele scrise n pseudocod; pentru secvenele care
cuprind operaii asupra unor structuri de date, se pot alege cteva implementri i astfel se poate face comparaie
ntre performanele implementrilor, n contextul aplicaiei respective.

3. Analiza empiric a complexitii algoritmilor


O alternativ la analiza matematic a complexitii o reprezint analiza empiric.
Aceasta poate fi util pentru:
- a obine informaii preliminare privind clasa de complexitate a unui algoritm;
- pentru a compara eficiena a doi (sau mai muli) algoritmi destinai rezolvrii aceleiai probleme;
- pentru a compara eficiena mai multor implementri ale aceluiai algoritm;
- pentru a obine informaii privind eficiena implementrii unui algoritm pe un anumit calculator.
Etapele analizei empirice. In analiza empiric a unui algoritm se parcurg de regul urmtoarele etape:
1. Se stabilete scopul analizei.
2. Se alege metrica de eficien ce va fi utilizat (numr de execuii ale unei/unor operaii sau timp de
execuie a ntregului algoritm sau a unei poriuni din algoritm.
3. Se stabilesc proprietile datelor de intrare n raport cu care se face analiza (dimensiunea datelor sau
proprieti specifice).
4. Se implementeaz algoritmul ntr-un limbaj de programare.
5. Se genereaz mai multe seturi de date de intrare.
6. Se execut programul pentru fiecare set de date de intrare.
7. Se analizeaz datele obinute.
Alegerea msurii de eficien depinde de scopul analizei. Dac, de exemplu, se urmrete obinerea unor
informaii privind clasa de complexitate sau chiar verificarea acurateei unei estimri teoretice atunci este adecvat
utilizarea numrului de operaii efectuate. Dac ns scopul este evaluarea comportrii implementrii unui algoritm
atunci este potrivit timpul de execuie.
Pentru a efectua o analiz empiric nu este suficient un singur set de date de intrare ci mai multe, care s pun n
eviden diferitele caracteristici ale algoritmului. n general este bine s se aleag date de diferite dimensiuni astfel
nct s fie acoperit plaja tuturor dimensiunilor care vor apare in practic. Pe de alt parte are importan i analiza
2

diferitelor valori sau configuraii ale datelor de intrare. Dac se analizeaz un algoritm care verific dac un numr
este prim sau nu i testarea se face doar pentru numere ce nu sunt prime sau doar pentru numere care sunt prime
atunci nu se va obine un rezultat relevant. Acelai lucru se poate ntmpla pentru un algoritm a crui comportare
depinde de gradul de sortare a unui tablou.
n vederea analizei empirice la implementarea algoritmului ntr-un limbaj de programare vor trebui introduse
secvene al cror scop este monitorizarea execuiei. Dac metrica de eficien este numrul de execuii ale unei
operaii atunci se utilizeaz un contor care se incrementeaz dup fiecare execuie a operaiei respective. Dac
metrica este timpul de execuie atunci trebuie nregistrat momentul intrrii n secvena analizat i momentul ieirii.
Majoritatea limbajelor de programare ofer funcii de msurare a timpului scurs ntre dou momente. Este
important, n special n cazul n care pe calculator sunt active mai multe taskuri, s se contorizeze doar timpul
afectat de execuia programului analizat. n special dac este vorba de msurarea timpului este indicat s se ruleze
programul de test de mai multe ori i s se calculeze valoarea medie a timpilor.
Dup execuia programului pentru datele de test se nregistreaz rezultatele iar n scopul analizei fie se
calculeaz mrimi sintetice (de ex. media) fie se reprezint grafic perechi de puncte de o anume form (dimensiune
problem, msur de eficien).

4. Ordin de cretere
Pentru a aprecia eficiena unui algoritm nu este necesar cunoaterea expresiei detaliate a timpului de execuie.
Mai degrab este interesant modul n care timpul de execuie crete o dat cu creterea dimensiunii problemei. O
msur util n acest sens este ordinul de cretere. Acesta este determinat de termenul dominant din expresia
timpului de execuie. Cnd dimensiunea problemei este mare valoarea termenului dominant depete semnificativ
valorile celorlali termeni astfel c acetia din urm pot fi neglijai.
ntruct problema eficienei devine critic pentru probleme de dimensiuni mari se face analiza complexitii
pentru cazul cnd n este mare (teoretic se consider c n ), n felul acesta lundu-se n considerare doar
comportarea termenului dominant. Acest tip de analiz se numete analiz asimptotic. In cadrul analizei
asimptotice se consider c un algoritm este mai eficient dect altul dac ordinul de cretere al timpului de execuie
al primului este mai mic dect al celuilalt.
Exist urmtoarele cazuri cnd ordinul de cretere a timpului de execuie, nu e cel mai bun criteriu de apreciere
a performanelor unui algoritm:
- dac un program se ruleaz de puine ori, se alege algoritmul cel mai uor de implementat;
- dac ntreinerea trebuie fcut de o alt persoan dect cea care l-a scris, un algoritm simplu, chiar mai puin
eficient, e de preferat unuia performant, dar foarte complex i greu de neles;
- exist algoritmi foarte eficieni, dar care necesit un spaiu de memorie foarte mare, astfel nct folosirea
memoriei externe le diminueaz foarte mult performanele.
4.1. Notaii asimptotice.
Fie N mulimea numerelor naturale (pozitive su zero) i R mulimea numerelor reale. Notam prin N+ i R+
mulimea numerelor naturale, respectiv reale, strict pozitive, i prin R mulimea numerelor reale nenegative. Fie f :
N R o funcie arbitrar. Definim mulimea
O(f) = {t : N R | ( c R+) ( n0 N) ( n n0) [t(n) cf (n)]}
Cu alte cuvinte, O(f) (se citete ordinul lui f ) este mulimea tuturor funciilor t mrginite superior de un
multiplu real pozitiv al lui f, pentru valori suficient de mari ale argumentului. Vom conveni s spunem c t este n
ordinul lui f (sau, echivalent, t este n O(f), sau t O(f)) chiar i atunci cnd valoarea f (n) este negativ sau
nedefinit pentru anumite valori n <n0. n mod similar, vom vorbi despre ordinul lui f chiar i atunci cnd valoarea
t(n) este negativ sau nedefinit pentru un numr finit de valori ale lui n; n acest caz, vom alege n0 suficient de
mare, astfel nct, pentru n n0, acest lucru s nu mai apar. n loc de t O( f ), uneori este mai convenabil s
folosim notaia t(n) O(f (n)), subnelegnd aici c t(n) i f (n) sunt funcii.
Notaia asimptotic definete o relaie de ordine parial ntre funcii i deci, ntre eficiena relativ a diferiilor
algoritmi care rezolv o anumit problem. Vom da n continuare o interpretare algebric a notaiei asimptotice.
Pentru oricare dou funcii f , g : N
R , definim urmtoarea relaie binar: f g dac O(f) O(g). Relaia este
o relaie de ordine pariala n mulimea funciilor definite pe N i cu valori n R . Definim i o relaie de
echivalen: f g dac O(f) = O(g).
n mulimea O(f) putem nlocui pe f cu orice alt funcie echivalent cu f. De exemplu, lg n ln n log n i
avem O(lg n) = O(ln n) = O(log n). Notnd cu O(1) ordinul funciilor mrginite superior de o constant, obinem
ierarhia:
O(1) O(log n) O(n) O(n log n) O(n2) O(n3) O(2n)
3

Aceast ierarhie corespunde unei clasificri a algoritmilor dup un criteriu al performanei. Pentru o problem
dat, dorim mereu s obinem un algoritm corespunztor unui ordin ct mai mic. Astfel, este o mare realizare dac
n locul unui algoritm exponenial gsim un algoritm polinomial.
Notaia O(f) este folosit pentru a limita superior timpul necesar unui algoritm, msurnd eficiena algoritmului
respectiv. Uneori este util s estimm i o limit inferioar a acestui timp. n acest scop, definim mulimea
( f ) = {t : N R | ( c R+) ( n0 N) ( n n0) [t(n) cf (n)]}
Exist o anumit dualitate ntre notaiile O(f) i (f). i anume, pentru dou funcii oarecare f, g : N
R,
avem: f O(g), dac i numai dac
g
(f).
O situaie fericit este atunci cnd timpul de execuie al unui algoritm este limitat, att inferior ct i superior, de
cte un multiplu real pozitiv al aceleiai funcii. Introducem notaia
(f) = O(f)
(f)
numit ordinul exact al lui f. Pentru a compara ordinele a dou funcii, notaia nu este ins mai puternic dect
notaia O, n sensul c relaia
O(f) = O(g) este echivalent cu (f) = (g).
Se poate ntmpla c timpul de execuie al unui algoritm s depind simultan de mai muli parametri. Aceast
situaie este tipic pentru anumii algoritmi care opereaz cu grafuri i n care timpul depinde att de numrul de
vrfuri, ct i de numrul de muchii. Notaia asimptotic se generalizeaz n mod natural i pentru funcii cu mai
multe variabile. Astfel, pentru o funcie arbitrar f : N N R definim
O(f) = {t : N N R | ( c R+) ( m0, n0 N) ( m m0) ( n n0) t(m, n) cf (m, n)]}
Similar, se obin i celelalte generalizri.
4.2. Operaii asupra funciilor asimptotice

1. Dac T1(n) i T2(n) sunt timpii de execuie a dou secvene de program P1 i P2, T1(n) fiind O(f(n)), iar
T2(n) fiind O(g(n)), atunci timpul de execuie T1(n)+T2(n), al secvenei P1 urmat de P2, va fi
O(max(f(n),g(n))).
2. Dac T1(n) este O(f(n)) i T2(n) este O(g(n)), atunci T1(n)*T2(n) este O(f(n)*g(n)).

5. Exemple
1. Mai jos este prezentat modul de evaluare a timpului de execuie a procedurii de sortare a elementelor unui
tablou de dimensiune n prin metoda "bubble sort":
procedure bubble ( a[1..n]){sortare cresctoare}
1: for i1 to n - 1 do
2: for jn downto i + 1 do
3:
if a[j - 1] > a[j] then
4:
tempa[j - 1];
5:
a[j - 1] a[j];
6:
a[j] temp
return a[1..n] sortat
Timpii de rulare pentru instruciunile de asignare (4),(5) si (6) snt O(1), deci pentru secvena (4)-(6), timpul
este O(max(1,1,1)) = O(1).
Pentru instruciunea if - then (3), timpul este suma dintre cel pentru evaluarea condiiei, O(1) i cel al secvenei
ce se execut la condiie adevrat, tot O(1), calculat mai sus, deci O(1), acesta fiind i timpul pentru o iteraie a
instruciunii for (2).
Pentru cele n - i iteraii ale lui for (2), timpul de execuie este:
O((n-i)*1) = O(n - i).
Pentru instruciunea for (1), avnd n-1 iteraii, timpul de execuie este:
n 1
i 1

2
n ,
n i = (n - 1) + (n - 2) +...+ (n n + 1) = n
2
2

deci este O(n ).

2. Modalitatea de evaluare a timpului de execuie al unei proceduri recursive, este ilustrat prin cea a funciei de
calcul al factorialului:
function factorial(n: integer)
1: if n 1 then
2: factorial1
3:
else factorial n*factorial(n - 1)
return factorial(n)
Dimensiunea intrrii este aici n, valoarea numrului al crui factorial se calculeaz i se noteaz cu T(n), timpul
de rulare al funciei factorial(n).
Timpul de rulare pentru liniile (1) si (2) este O(1), iar pentru linia (3) este O(1) + T(n - 1), deci cu constantele c
si d neprecizate:
T(n) = c + T(n - 1), pentru n > 1 sau T(n) = d , pentru n 1.
Pentru n > 2, expandnd pe T(n - 1), se obine T(n) = 2c + T(n - 2), pentru n > 2.
Pentru n > 3, expandnd pe T(n - 2), se obine T(n) = 3c + T(n - 3), pentru n > 3.
Deci, n general T(n) = ic + T(n - i), pentru n > i.
n final, cnd i = n - 1, se obine T(n) = (n - 1)c + T(1) = (n - 1)c + d.
Deci T(n) = O(n).

SARCINA DE BAZ:
1.
2.
3.
4.

Efectuai analiza empiric a algoritmilor propui.


Determinai relaia ce determin complexitatea temporal pentru aceti algoritmi.
Determinai complexitatea asimptotic a algoritmilor.
Facei o concluzie asupra lucrrii efectuate.

ntrebri de control:
1.
2.
3.
4.
5.

Enumerai factorii ce influeneaz timpul de execuie al algoritmului.


Cnd timpul de execuie al algoritmului este dat de o relaie de recuren ?
Care sunt regulile generale pentru evaluarea timpului de execuie?
Care sunt etapele analizei empirice i n care cazuri se face analiza empiric a algoritmilor?
Ce proprieti posed funciile asimptotice?

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