Sunteți pe pagina 1din 6

LUCRARE DE LABORATOR NR.

1
Tema: Analiza algoritmilor (Timpul de execuie al algoritmilor).
Scopul lucrrii:
1.
2.
3.

Analiza empiric a algoritmilor.


Analiza teoretic a algoritmilor.
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:
1) algoritmul s fie simplu de neles, de codificat i de depanat;
2) 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.
In 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.

Importanta 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, aceasta 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).
Timp mediu de execuie. Uneori, cazurile extreme (cel mai defavorabil i cel mai favorabil) se ntlnesc rar,
astfel ca analiza acestor cazuri nu furnizeaz suficient informaie despre algoritm.
In 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. Ordin de cretere
Pentru a aprecia eficiena unui algoritm nu este necesar cunoaterea expresiei detaliate a timpului de execuie.
Mai degrab intereseaz 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 performantelor 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.

2.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. Mulimea {true, false} de constante booleene o notm cu B. 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. De exemplu, vom vorbi despre ordinul lui n/log n, chiar dac pentru n = 0 i n = 1 funcia nu este
definit. 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 echivalenta: 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)
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 la stnga. 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.

2.2. Operaii asupra funciilor asimptotice


1. Dac T1(n) i T2(n) snt 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)).

3. 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 n a datelor de
intrare, snt:
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
3

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.

4. Analiza empiric a complexitii algoritmilor


O alternativ la analiza matematic a complexitii o reprezint analiza empiric.
Aceasta poate fi util pentru: (i) a obine informaii preliminare privind clasa de complexitate a unui
algoritm; (ii) pentru a compara eficiena a doi (sau mai muli) algoritmi destinai rezolvrii aceleiai
probleme; (iii) pentru a compara eficiena mai multor implementri ale aceluiai algoritm; (iv) 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 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 (dac se aleg fie doar tabloul aproape sortate dup criteriul dorit fie tablouri ordonate n sens invers
analiza nu va fi relevant).
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 execuiei 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 (media, abaterea standard etc.) fie se reprezint grafic perechi de puncte de
forma (dimensiune problema, msur de eficien).

5. Exemple
1. Mai jos se prezint modul de evaluare a timpului de execuie a procedurii de sortare a
elementelor unui tablou de dimensiune n prin metoda "bubble":
type int_array = array[1..n] of integer;
procedure bubble (var a: int_array); {sortare cresctoare}
4

var i, j, temp: integer;


begin
(1) for i:=1 to n - 1 do
(2) for j:=n downto i + 1 do
(3) if a[j - 1] > a[j] then begin
(4)
temp:=a[j - 1];
(5)
a[j - 1]:=a[j];
(6)
a[j]:=temp
end
end; {bubble}
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 deci 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:
S(i =1, n - 1) (n - i) = (n - 1) + (n - 2) +...+ (n n + 1) = n

n ,
2

deci este O(n2).


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): integer;
begin
(1) if n 1 then
(2) factorial:= 1
else
(3) factorial:= n*factorial(n - 1)
end; {factorial}
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) este O(n).

6. Numerele lui Fibonacci


irul lui Fibonacci este definit prin urmtoarea recurena:

Acest celebru ir a fost descoperit n 1202 de ctre Leonardo Pisano (Leonardo din Pisa), cunoscut sub
numele de Leonardo Fibonacci. Cel de-al n-lea termen al irului se poate obtine direct din definiie:

1. function fib1(n)
if n < 2 then return n
else return fib1(n-1) + fib1(n-2)
Aceast metod este foarte ineficienta, deoarece recalculeaz de mai multe ori aceleai valori. Urmeaz o
alt metod, mai performant, care rezolv aceeai problem.
2. function fib2(n)
i 1; j 0
for k 1 to n do j i + j
ij-i
return j
Mai exist un algoritm :
3. function fib3(n)
i 1; j 0; k 0; h 1
while n > 0 do
if n este impar then t jh
j ih+jk+t
i ik+t
2
t h
h 2kh+t
k k2+t
n n div 2
return j

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

Efectuai analiza empiric a algoritmilor propui n paragraful 6.


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.

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?
5. Ce proprieti posed funciile asimptotice?

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