Documente Academic
Documente Profesional
Documente Cultură
1
Tema: Analiza algoritmilor (Timpul de execuie al algoritmilor).
Scopul lucrrii:
1.
2.
3.
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.
1
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.
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.
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.
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
n ,
2
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:
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. Iat acum o
alt metod, mai performant, care rezolv aceeai problem.
function fib2(n)
i 1; j 0
for k 1 to n do j i + j
ij-i
return j
Mai exist un algoritm :
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.
ntrebri de control:
1.
2.
3.
4.