Scopul capitolului analiza performantei algoritmilor.
In astfel de cazuri aprecierea performantelor se realizeaza de regula prin masuratori experimentale si metode statistice.
In general, analiza unui algoritm se desfasoara in doua etape:
o (1) Analiza apriorica
Consta in aprecierea din punct de vedere temporal a operatiilor care se utilizeaza si a costului lor relativ.
Conduce de regula la stabilirea expresiei unei functii care margineste timpul de executie al algoritmului
o (2) Testul ulterior
Consta in stabilirea unui numar suficient de seturi de date initiale care sa acopere practic toate posibilitatile de comportament ale algoritmului
Testarea comportamentul algoritmului pentru fiecare set in parte
Se finalizeaza prin culegerea unor date in baza carora pot fi elaborate o serie de statistici referitoare la consumul de timp specific executiei algoritmului in cauza (profilul algoritmului).
Q(g(n)) [3.1.a]
Fig.3.a. Reprezentarea lui f(n) = Q(g(n))
f(n) = [3.1.b]
Cu alte cuvinte pentru orice n > n0 , f(n) este egala cu g(n) in interiorul unui factor constant.
Se spune ca g(n) este o margine asimptotica stransa ('asymptotically tight bound') a lui f(n).
Definitia lui Q necesita ca fiecare membru a lui Q(g(n)) sa fie asimptotic pozitiv, deci f(n) sa fie pozitiv pentru valori suficient de mari ale lui n.
o Pentru aceasta, constantele c1 , c2 si n0 trebuiesc determinate astfel incat, pentru orice n n sa fie valabila relatia:
.
o Se impart membrii inegalitatii cu n2 si se obtine
o Inegalitatea din dreapta este valabila pentru orice n 1 daca il alegem pe c2
o Inegalitatea din stanga este valabila pentru orice valoare a lui n daca se alege c1
o Astfel, alegand c1 = 1/14 , c2 = 1/2 si n0 = 7 se poate verifica simplu ca
Exemplul 3.1 Stabilirea functiei g(n) pentru o functie polinomiala.
Pornind de la observatia ca termenii de ordin inferior ai unei functii asimptotice pozitive pot fi neglijati
Daca se alege pentru c1 o valoare care este cu putin inferioara coeficientului termenului celui mai semnificativ
Daca se alege pentru c2 o valoare usor superioara aceluiasi coeficient
Inegalitatile impuse de notatia Q sunt satisfacute.
Coeficientul termenului celui mai semnificativ poate fi in continuare omis, intrucat el modifica pe c1 si pe c2 doar cu un factor constant egal cu coeficientul.
Fie spre exemplu functia polinomiala:
o Neglijand termenii de ordin inferior lui 2, se ajunge la concluzia ca f(n) = Q(n
o Acest lucru poate fi demonstrat si formal alegand pentru coeficienti urmatoarele valori:
, si [3.1.c]
In baza acelorasi considerente, pentru orice functie polinomiala p(n) de ordinul n unde ai este constant si a d > , este valabila afirmatia p(n) = Q(n d) ( [3.1.d]).
Daca unde = constant si
atunci [3.1.d]
Deoarece o functie polinominala de grad zero este o constanta, despre orice functie constanta se poate spune ca este Q(n sau Q
Desi acesta este un abuz de interpretare (deoarece n nu tinde la infinit), prin conventie Q desemneaza fie o constanta fie o functie constanta in raport cu o variabila.
Notatia O desemneaza marginea asimptotica superioara a unei functii. Pentru o functie data g(n), se defineste O(g(n)) ca si multimea de functii:
O(g(n)) = [3.a]
Notatia O se utilizeaza pentru a desemna o margine superioara a unei functii in interiorul unui factor constant.
Pentru toate valorile n superioare lui n0 , valoarea functiei f(n) este pe sau dedesubtul lui g(n) (fig.3.b ).
Fig.3.b. Reprezentarea lui f(n) = O(g(n))
Pentru a preciza ca o functie f(n) este membra a lui O(g(n)) se utilizeaza notatia f(n) = O(g(n)).
Faptul ca f(n) este Q(g(n)) implica ca f(n) = O(g(n)) deoarece notatia Q este mai puternica decat notatia O. Formal acest lucru se precizeaza prin relatia [3.b].
Q(g(n)) O(g(n)) [3.b]
In consecinta, deoarece s-a demonstrat faptul ca orice functie patratica a n + b n + c , a > este Q(n , in baza relatiei [3.b] rezulta ca aceasta functie este implicit si O(n 2).
Este surprinzator faptul ca din aceleasi considerente, functia liniara a n + b este de asemenea O(n 2), lucru usor de verificat daca se alege c = a + | b | si n0 = 1.
Notatia O este de obicei cea mai utilizata in aprecierea timpului de executie al algoritmilor respectiv a performantei acestora.
Ea poate fi uneori apreciata direct din inspectarea structurii algoritmului, spre exemplu existenta unei bucle duble conduce imediat la o margine de ordinul O(n 2)
Deoarece notatia O descrie o margine superioara, cand este utilizata pentru a margini cazul cel mai defavorabil de executie al unui algoritm, prin implicatie ea margineste superior comportamentul algoritmului in aceeasi masura pentru orice intrare.
In cazul notatiei Q lucrurile difera.
o Spre exemplu, daca Q(n margineste superior cel mai defavorabil timp de executie al unui algoritm de sortare prin insertie, aceasta nu inseamna ca Q(n margineste orice intrare.
o Astfel, daca intrarea este gata sortata, algoritmul dureaza un timp proportional cu Q(n)
Tehnic vorbind, afirmatia ca timpul de executie al unui algoritm de sortare este O(n2) constituie un abuz de limbaj.
Corect: indiferent de configuratia intrarii de dimensiune n, pentru orice valoare a lui n timpul de executie al algoritmului pentru setul corespunzator de intrari este O(n2).
Cele mai obisnuite ordine de marime ale notatiei O se afla in relatiile de ordine prezentate in [3.c], iar reprezentarea lor grafica la scara logaritmica apare in fig.3.c.
O(1) < O(log
n) < O(n) < O(n log n)
< O(n ) <
O(n ) <
< O(2n) < O(10 n) < O( n ! )
< O(n n) [3.c]
Fig. 3.c. Ordine de marime ale notatiei O
In acelasi context in [3.d] se prezinta cateva sume intregi utile care sunt frecvent utilizate in calculul complexitatii algoritmilor.
[3.d]
Demonstratie:
f(n) = O(g(n)) T c , n f(n) c1 g(n) pentru n > n
g(n) = O(h(n)) T c , n g(n) c2 h(n) pentru n > n
f(n) c ( c2 h(n))
Exemplul 3.3. Se considera expresia
8 n log(n) + 4 n
si se cere o estimare a sa in termenii notatiei O.
Se procedeaza dupa cum urmeaza:
o log (n) = O(n1/ 2) deoarece logaritmul unui numar este mai mic decat orice putere pozitiva a numarului in baza urmatoarei teoreme:
o Fie a > 0 si a
o Pentru exponent d > 0 exista un numar N astfel incat pentru x > N avem log a x < x d
o n log(n) = O(n n O(n 3/2) (Regula 5).
o n log(n) = O(n 3/2) (Regula 2).
o n = O(n 3/2) (Regula 2).
o n log(n) + n = O(max ) =
=O(max O(n 3/2) (Regula 4).
Notatia W (omega mare) precizeaza o margine asimptotica inferioara.
Pentru o functie data g(n), prin W(g(n)) se precizeaza multimea functiilor
= [3.4.a]
Fig. 3.d Reprezentarea lui f(n)=W(g)n))
Spre exemplu s-a demonstrat ca pentru orice valori ale constantelor a, b, c cu a > 0 . De aici rezulta imediat ca .
Deoarece notatia W descrie o limita
inferioara, atunci cand este utilizata
pentru a margini cazul cel mai favorabil de executie al unui
algoritm, prin implicatie ea margineste inferior orice
intrare arbitrara a algoritmului.
Exemplul a) Se considera formula . Cum se interpreteaza aceasta formula ?
o In general, cand intr-o formula apare o notatie asimptotica se considera ca ea tine locul unei functii care nu se nominalizeaza explicit.
o Astfel in exemplul de mai sus avem:
, unde .
o Se observa faptul ca in acest caz , care este intr-adevar Q(n)
Exemplul b) Utilizarea notatiei asimptotice poate fi de folos in eliminarea detaliilor neesentiale ale unei ecuatii.
o Spre exemplu fie relatia recursiva:
o Daca prezinta interes doar comportamentul asimptotic al lui T(n), nu e necesar sa fie specificati toti termenii de ordin inferior.
o Ei sunt inclusi intr-o functie anonima, precizata prin Q(n)
Exemplul c) Ecuatia se interpreteaza astfel: indiferent de maniera in care se alege functia anonima din partea stanga a ecuatiei, exista o modalitate de a alege functia anonima din partea dreapta, astfel incat semnul '=' sa indice o ecuatie adevarata.
o In cazul de fata, pentru orice functie , exista o functie , astfel incat pentru orice n.
o De fapt membrul drept al ecuatiei evidentiaza un grad mai redus de detaliere decat cel stang.
Exemplul d) Relatiile de acest tip pot fi inlantuite, spre exemplu:
o Prima ecuatie precizeaza faptul ca exista o functie astfel incat pentru toti n.
o A doua ecuatie precizeaza ca pentru orice exista o functie astfel incat pentru toti n.
o Aceasta interpretare implica ceea ce de fapt sugereaza intuitiv lantul de egalitati.
Marginea asimptotica superioara desemnata prin notatia O, poate fi din punct de vedere asimptotic stransa sau lejera (laxa).
Pentru desemnarea unei margini asimptotice lejere se utilizeaza notatia o (o mic).
= [3.6.a]
Principala diferenta dntre notatiile O si o rezida in faptul ca in cazul f(n) = O(g(n)), marginea 0 f(n) c g(n) este valabila pentru anumite constante c > , in timp ce f(n) =o(g(n)), marginea 0 g(n) < c g(n) este valabila pentru orice constanta c >
Intuitiv, in notatia o, functia f(n) devine nesemnificativa in raport cu g(n) cand n tinde la infinit [3.6.b].
f(n) = o(g(n)) implica [3.6.b]
Prin analogie, notatia w este pentru notatia W ceea ce este o pentru O.
Cu alte cuvinte notatia w precizeaza o margine asimptotica inferioara lejera.
= [3.7.a]
Proprietate: Relatia f(n) = w(g(n)) implica [3.7.b], adica f(n) devine in mod arbitrar semnificativa in raport cu g(n) atunci cand n tinde la infinit.
f(n) = implica [3.7.b]
Presupunand ca f(n) si g(n) sunt asimptotic pozitive, multe din proprietatile relationale ale numerelor reale se aplica similar comparatiilor asimptotice.
a) Tranzitivitate:
f(n) = si g(n) = implica f(n) =
f(n) = si g(n) = implica f(n) =
f(n) = si g(n) = implica f(n) =
f(n) = si g(n) = implica f(n) =
f(n) = si g(n) = implica f(n) =
b) Reflexivitate:
f(n) = ;
f(n) = ; [3.8.a]
f(n) = .
c) Simetrie:
f(n) = daca si numai daca g(n) =
d) Simetrie transpusa:
f(n) = daca si numai daca g(n) =
f(n) = o(g(n)) daca si numai daca g(n)=
Analogia dintre comparatia asimptotica a doua functii f si g si compararea a doua numere reale a si n este prezentata in 3.8.b
f(n)= a b
f(n)= a b
f(n)= a = b [3.8.b]
f(n)= a < b
f(n)= a > b
O proprietate specifica numerelor reale, care nu se aplica comparatiei asimptotice este trihotomia ('trichotomy').
o Conform acestei proprietati intre doua numere reale oarecare exista exact una din urmatoarele relatii:
a < b ; a = b ; a > b.
o Daca oricare doua numere reale pot fi comparate conform relatiei de mai sus, pentru doua functii f(n) si g(n) este insa posibil ca sa nu fie valabila nici f(n) = O(g(n)), nici f(n) = W(g(n))
Cu ajutorul notatiei O mare se poate aprecia timpul de executie al unui algoritm.
Se face sublinierea ca se poate aprecia timpul de executie al unui algoritm abstract si nu al unui program intrucat acesta din urma depinde de mai multi factori:
o Dimensiunea si natura datelor de intrare,
o Caracteristicile sistemului de calcul pe care se ruleaza programul,
o Eficienta codului produs de compilator.
Notatia O mare permite eliminarea factorilor care nu pot fi controlati (spre exemplu viteza sistemului de calcul) concentrandu-se asupra comportarii algoritmului independent de program.
In general un algoritm a carui complexitate temporala este O(n 2) va rula ca si program in O(n 2) unitati de timp indiferent de limbajul sau sistemul de calcul utilizat.
In aprecierea timpului de executie se porneste de la ipoteza simplificatoare deja enuntata, ca fiecare instructie exceptand eventual apelurile de proceduri sau functii utilizeaza in medie aceeasi cantitate de timp.
Singurele instructiuni care nu pot fi incadrate in aceasta medie de timp sunt instructiunea IF, secventele repetitive (buclele) si apelurile de proceduri si functii.
Presupunand pentru moment ca apelurile de proceduri si functii se ignora, se adopta prin conventie urmatoarele simplificari:
Exemplul 4.a. Se considera urmatoarea procedura care cauta intr-un tablou a cu n elemente, un element egal cu cheie si returneaza in variabila unde ultima locatie in care este gasita cheia sau zero in caz contrar [4.a].
PROCEDURE CautareLiniara(n,cheie: integer,
a: TablouNumeric; VAR unde: integer);
VAR indice: integer;
BEGIN
unde: = 0
FOR indice:= 1 TO n DO
IF a[indice]= cheie THEN [4.a]
unde:= indice
END
Intrarea in procedura si initializarea O(1)
variabilei unde
Bucla FOR (n reluari) O(1+n+1) = O(n)
Instructiunea IF si O(1) O(n*1) = O(n)
ramura sa
Revenirea din procedura O(1)
Fig. 4.a. Schema temporala a algoritmului [4.a]
In figura 4.a apare schema temporala a algoritmului impreuna cu estimarea O mare corespunzatoare.
In analiza au fost introduse si operatiile de intrare si revenire din procedura care nu apar ca parti explicite ale rutinei.
Pe viitor acestea vor fi omise din analiza temporala deoarece ele contribuie cu un timp constant la executie si nu influenteaza estimarea O mare
Exemplul 4.b Se considera urmatoarea portiune de cod [4.b].
FUNCTION SumProd(n: integer): integer;
VAR rezultat,k,i: integer;
BEGIN
rezultat:= 0;
FOR k:= 1 TO n [4.b]
FOR i:= 1 TO k
rezultat:= rezultat+k*i;
SumProd:= rezultat
END;
initializare rezultat O(1)
bucla FOR (n reluari)
bucla FOR (n reluari)
O(n*1) = O(n) O(n*n) = O(n O(1+n = O(n
interior O(1)
Fig. 4.b. Schema temporala a algoritmului din secventa [4.b]
La analiza complexitatii temporale se face presupunerea ca ambele bucle se reiau de numarul maxim de ori posibil, desi acest lucru nu este adevarat deoarece bucla interioara se executa cu limita k n ( si nu cu limita n)
Se va demonstra ca prin aceasta simplificare estimarea temporala finala nu este afectata.
La o analiza mai aprofundata se tine cont de faptul ca bucla FOR interioara se executa prima oara o data, a doua oara de 2 ori s.a.m.d, a k-oara de k ori.
1 + 2 + 3 + + n = [4.c]
In mod analog in cadrul secventei [4.d] se ajunge la estimarea: O(n n n) = O(n3).
FOR i:= 1 TO n DO
FOR j:= 1 TO i DO
FOR k:= 1 TO i DO [4.d]
Secventa ;
12 + 22 + 32 + + n 2 = = O(n 3) [4.e]
Exemplul 4.c. se refera tot la o bucla multiplicativa.
m:= 1
FOR i:= 1 TO n DO
BEGIN
m:= m *2;
FOR j:= 1 TO m DO [4.f]
Secventa
END;
In situatia in care bucla exterioara se executa pentru valorile 1, 2, 3, ale lui i, bucla interioara itereaza de 2, 4, 8, ori conducand la un timp de executie de ordinul O(2 + 4 + 8 + + 2n).
2 + 4 + 8 + + 2n = [4.g]
Aceasta estimare este complet diferita de estimarea O(n2) pentru care exista tentatia de a fi avansata si care este valabila pentru buclele nemultiplicative.
Presupunand ca un algoritm a fost conceput, implementat, testat si depanat pe un sistem de calcul tinta
Ne intereseaza de regula profilul performantei sale, adica timpii precisi de executie ai algoritmului pentru diferite seturi de date, eventual pe diferite sisteme tinta.
Pentru aceasta sistemul de calcul tinta trebuie sa fie dotat cu un ceas intern si cu functii sistem de acces la acest ceas.
Dupa cum s-a mai precizat, determinarea profilului performantei face parte din testul ulterior al unui algoritm si are drept scop determinarea precisa a ordinul de marime al timpului de executie al algoritmului.
Informatiile rezultate sunt utilizate de regula pentru a valida sau invalida, respectiv pentru a nuanta rezultatele estimarii apriorice.
Se presupune un algoritm implementat in forma unui program numit Algoritm(X: Intrare,Y: Iesire)unde X este intrarea iar Y iesirea.
Pentru a construi profilul algoritmului este necesar sa fie concepute:
o Seturile de date de intrare a caror dimensiune creste intre anumite limite, pentru a studia comportamentul algoritmului in raport cu dimensiunea intrarii
o Seturile de date care in principiu se refera la cazurile extreme de comportament.
o O procedura cu ajutorul careia poate fi construit profilul algoritmului in baza seturilor de date anterior amintite.
procedure Profil;
begin
*initializeaza procedura Algoritm;
*afiseaza('Testul lui Algoritm. Timpii in milisecunde');
repeat
*citeste(SetDeDate); [5.a]
*afiseaza('Un nou set de date:', SetDeDate);
*apel TIME(t);
*apel Algoritm(SetDeDate, Rezultate);
*apel TIME(t1);
*afiseaza('TimpExecutie=', t - t1);
until sfarsit(SetDeDate)
end
Procedura Profil poate fi utilizata in mai multe scopuri functie de obiectivele urmarite.
o (1) Evidentierea performantei intrinseci a unui algoritm precizat.
Pentru aceasta se aleg, asa cum s-a mai precizat, seturi de date cu dimensiuni din ce in ce mai mari.
Rezultatul va fi profilul algoritmului.
Pentru deplina conturare a profilului se testeaza de asemenea si cazurile de comportament extrem ale algoritmului (cel mai favorabil si cel mai defavorabil).
o (2) Evidentierea performantei relative a doi sau mai multi algoritmi diferiti care indeplinesc aceeasi sarcina.
In acest scop se executa procedura Profil pentru fiecare din algoritmi in parte, cu aceleasi seturi de date intiale, pe un acelasi sistem de calcul.
Compararea profilelor rezultate permite ierarhizarea performantelor algoritmilor analizati.
Trebuie insa acordata o atentie speciala procedurii TIME a caror rezultate in anumite circumstante pot fi nerevelevante.
o Astfel, in cazul sistemelor time-sharing, al sistemelor complexe (care lucreaza cu intreruperi) sau al sistemelor multi-procesor, timpul furnizat de aceasta functie poate fi complet needificator.
o In astfel de cazuri, una din solutii este aceea de a executa programul de un numar suficient de ori si de a apela la metode statistice pentru evidentierea performantelor algoritmului testat.
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |