6
ANEXA 1 LIMITELE ASIMPTOTICE ALE FUNCŢIILOR Pentru a putea compara algoritmii din punctul de vedere al performanţelor avem nevoie de definirea unor indicatori ai complexităţii. Aceştia trebuie să permită atât o determinare cât mai corectă a timpului de execuţie al algoritmului, cât şi o simplificare a procesului de analiză. În majoritatea cazurilor, analiza exactă a complexităţii este dificilă şi chiar inutilă. Nu avem nevoie de o valoare exactă a timpului de execuţie al unui algoritm, ci doar de o estimare a acestuia, astfel încât algoritmul să poată fi încadrat într-o clasă de complexitate. Timpul de execuţie al unui algoritm este definit ca numărul de operaţii de bază sau paşi de calcul. Pentru simplitate se poate presupune că toate operaţiile de bază se execută în timp constant. Condiţia impusă în alegerea operaţiei de bază este aceea de a nu depinde de dimensiunea problemei. Timpul de execuţie este exprimat în general ca o funcţie de dimensiunea intrării. Pot exista cazuri în care timpul de execuţie depinde şi de valorile efective ale datelor de intrare, nu numai de volumul acestora. În aceste cazuri se va determina, în funcţie de scopul analizei algoritmului, timpul de execuţie pentru cazul cel mai defavorabil şi eventual pentru cazul mediu. Pentru analiza performanţelor algoritmilor, adică a modului cum variază timpul de execuţie atunci când creşte dimensiunea intrării, se folosesc limitele asimptotice ale funcţiilor: limita asimptotică superioară, limita asimptotică inferioară şi ordinul exact al funcţiilor. Limita asimptotică superioară. Fie funcţiile f, g : NR + . Funcţia g(n) este limita asimptotică superioară a funcţiei f(n) dacă o constantă c > 0 şi o valoare n 0 0, astfel încât, pentru n n 0 , există relaţia f(n) cg(n). Se spune că funcţia f(n) este în ordinul lui g(n) sau g(n) limitează superior pe f(n). Se notează f(n) = O(g(n)). Această clasă de funcţii permite descrierea comportării unui algoritm în cazul cel mai defavorabil. Întrucât, de regulă, interesează comportarea algoritmului pentru date arbitrare de intrare, este suficient să specificăm o limită superioară pentru timpul de execuţie. Notaţia f(n) = O(g(n)) înseamnă că f(n) creşte asimptotic cel mult la fel de repede ca g(n).

CP Anexa1 Limite Asimptotice

Embed Size (px)

DESCRIPTION

CP CP CP CP CP CP CP CP CP CP CP CP CP CP CP CP CP CP CP CP

Citation preview

  • ANEXA 1

    LIMITELE ASIMPTOTICE ALE FUNCIILOR Pentru a putea compara algoritmii din punctul de vedere al performanelor

    avem nevoie de definirea unor indicatori ai complexitii. Acetia trebuie s permit att o determinare ct mai corect a timpului de execuie al algoritmului, ct i o simplificare a procesului de analiz.

    n majoritatea cazurilor, analiza exact a complexitii este dificil i chiar inutil. Nu avem nevoie de o valoare exact a timpului de execuie al unui algoritm, ci doar de o estimare a acestuia, astfel nct algoritmul s poat fi ncadrat ntr-o clas de complexitate.

    Timpul de execuie al unui algoritm este definit ca numrul de operaii de baz sau pai de calcul. Pentru simplitate se poate presupune c toate operaiile de baz se execut n timp constant. Condiia impus n alegerea operaiei de baz este aceea de a nu depinde de dimensiunea problemei.

    Timpul de execuie este exprimat n general ca o funcie de dimensiunea intrrii. Pot exista cazuri n care timpul de execuie depinde i de valorile efective ale datelor de intrare, nu numai de volumul acestora. n aceste cazuri se va determina, n funcie de scopul analizei algoritmului, timpul de execuie pentru cazul cel mai defavorabil i eventual pentru cazul mediu.

    Pentru analiza performanelor algoritmilor, adic a modului cum variaz timpul de execuie atunci cnd crete dimensiunea intrrii, se folosesc limitele asimptotice ale funciilor: limita asimptotic superioar, limita asimptotic inferioar i ordinul exact al funciilor.

    Limita asimptotic superioar. Fie funciile f, g : NR+. Funcia g(n) este limita asimptotic superioar a funciei f(n) dac o constant c > 0 i o valoare n0 0, astfel nct, pentru n n0, exist relaia f(n) cg(n). Se spune c funcia f(n) este n ordinul lui g(n) sau g(n) limiteaz superior pe f(n). Se noteaz f(n) = O(g(n)).

    Aceast clas de funcii permite descrierea comportrii unui algoritm n cazul cel mai defavorabil. ntruct, de regul, intereseaz comportarea algoritmului pentru date arbitrare de intrare, este suficient s specificm o limit superioar pentru timpul de execuie. Notaia f(n) = O(g(n)) nseamn c f(n) crete asimptotic cel mult la fel de repede ca g(n).

  • 2 CALCUL PARALEL

    Limita asimptotic inferioar. Fie funciile f, g : NR+. Funcia g(n) este limita asimptotic inferioar a funciei f(n) dac o constant c > 0 i o valoare n0 0, astfel nct n n0, exist relaia f(n) cg(n). Se noteaz f(n) = (g(n)).

    Aceast notaie este folosit n special pentru a caracteriza comportarea algoritmului n cazul cel mai favorabil. Notaia f(n) = (g(n)) nseamn c f(n) crete asimptotic cel puin la fel de repede ca g(n).

    Nici una dintre limitele asimptotice superioar i inferioar nu specific ct este de strns limitarea.

    Limitele asimptotice superioar i inferioar au proprietatea de antisimetrie, adic f(n) = O(g(n)) implic g(n) = (f(n)).

    Ordinul exact. Fie funciile f, g : NR+. Funcia f(n) este n ordinul exact al funciei g(n) dac dou constante c1 > 0, c2 > 0 i o valoare n0 0, astfel nct, pentru n n0, exist relaia c1g(n) f(nx) c2g(n). Se noteaz f(n) = (g(n)).

    Din definiiile limitelor asimptotice ale funciilor rezult c f(n) = (g(n)) i f(n) = O(g(n)) implic f(n) = (g(n)).

    Ordinul exact are proprietatea de simetrie: f(n)= (g(n)) implic g(n)= (f(n)) i este utilizabil numai atunci cnd funcia care caracterizeaz timpul de execuie este unic.

    Notaia (n) = O(g(n)) nseamn c (n) nu crete mai repede dect g(n), astfel nct, pentru n suficient de mare (n n0) i o constant c aleas convenabil, (n) rmne ntotdeauna sub c*g(n). Notaia f(n) = (g(n)) nseamn c f(n) crete cel puin la fel de repede g(n), iar f(n) = (g(n)) nseamn c f(n) crete la fel de repede ca i g(n) (Fig. A1.1).

    Fig. A1.1 (a) Limita asimptotic superioar. (b) Limita asimptotic inferioar.

    n n0

    c*g(n)

    f(n)

    f(n) = O(g(n)) (a):

    Unii autori recomand pentru notaia de ordin: (n) O(g(n)) sau (n) este n O(g(n)) dat fiind c O(g(n)) este o mulime de funcii. Semnul egal din notaia (n) = O(g(n)) poate fi considerat un abuz de notaie, care sugereaz o simetrie a instruciunii respective, simetrie care nu exist. De exemplu O(n) = O(n2) este adevrat, dar O(n2) = O(n), nu este adevrat.

    Notaia (n) O(g(n)) se bazeaz pe faptul c limitele asimptotice sunt mulimi de funcii.

    n n0

    c*g(n)

    f(n)

    (b): f(n) = (g(n))

  • Anexa 1 Limitele asimptotice ale funciilor 3 ntra-adevar, pentru o funcie dat g(n), se poate defini clasa O(g(n)) a

    algoritmilor ca totalitatea algoritmilor cu timpi de execuie caracterizai de o funcie f(n) din mulimea O(g(n)) = { f(n) | ( c R+)( n N)( n n0) [f(n) cg(n)]}.

    n continuare vom folosi totui notaia (n) = O(g(n)), dar cu grija necesar ca aceast notaie s nu genereze erori de interpretare.

    Aceleai observaii sunt valabile i pentru notaiile f(n) = (g(n)) i f(n) = (g(n)).

    Pentru analiza unui algoritm este util s se determine cea mai mic limit asimptotic superioar (sau inferioar). Astfel, pentru pentru f(n) = 2n + 3, vom spune c este n ordinul lui O(n), nu O(n2), (chiar dac afirmaia ar fi corect din punctul de vedere al definiei).

    Se pot defini funcii limite asimptotice ca expresii de dou sau mai multe variabile. De exemplu:

    ( ) ( )2 2, log O log .f n p n p p np n p p np= + + = + + Proprietile limitelor asimptotice

    (a) Reflexivitate: f(n) = O(f(n)) f(n) = (f(n)) f(n) = (f(n)) (b) Tranzitivitate: f(n) = (h(n)) i h(n) = (g(n)) f(n) = (g(n)) f(n) = (h(n)) i h(n) = (g(n)) f(n) = (g(n)) f(n) = (h(n)) i h(n) = (g(n)) f(n) = (g(n))

    (c) Multiplicarea cu o constant k > 0: f(n) = O(k*g(n)) f(n) = O(g(n)) f(n) = (k*g(n)) f(n) = (g(n)) f(n) = (k*g(n)) f(n) = (g(n)) Totui, pentru o analiz mai detaliat a comportrii funciilor, uneori poate fi

    util s nu neglijm constantele multiplicative ale unor termeni.

    (d) Suma funciilor:

    O(f1(n) + f2(n)) = max (O(f1(n), O(f2(n))) (f1(n) + f2(n)) = max ( (f1(n), (f2(n))) (f1(n) + f2(n)) = max ((f1(n), (f2(n))) Alegerea termenului maxim dintre O(f1(n)) i O(f2(n)) se face pe baza ordinii

    de dominan a funciilor, definit n continuare.

  • 4 CALCUL PARALEL

    Ordinea de dominan a funciilor. g2(n)) domin pe g1(n)) i se scrie g2(n)) > g1(n)), precum i O(g2(n)) > O(g1(n)), dac g2(n)/g1(n) este o funcie monoton cresctoare de n.

    Funciile folosite ca limite asimptotice pot avea rata (viteza) de cretere sub-linear, linear i supralinear. n analiza complexitii, funciile cel mai frecvent folosite sunt: Funcii cu viteza de cretere sub-linear:

    Constanta: O(1) Dublu logaritm: O(log log n) Logaritm: O(log n) Polinom (grad < 1) O(nc), c < 1 (c este o constant)

    Funcia cu viteza de cretere linear: Polinom (grad 1): O(n) Funcii cu viteza de cretere supralinear: Produs x*log x O(n log n) Polinom (grad > 1) O(nc), c > 1 (c este o constant)

    Exponenial: O(2n) Aceste funcii au fost prezentate n ordinea creterii dominanei: funcia

    exponenial domin funcia polinomial, funcia polinomial domin funcia logaritmic, funcia logaritmic domina funcia constant.

    Relaia de dominan este tranzitiv. Dac funcia f2 domin funcia f1, i funcia f1 domin funcia f0, atunci funcia f2 domin, de asemenea, funcia f0. Putem scrie: O(1) < O(log n) < O(n) < O(n * log n) < O(n2) < O(nx3) < O(2nx).

    n Fig. A1.2 a) i b) sunt date valorile funciilor importante n form numeric, respectiv grafic, pentru diferite valori ale variabilei lor.

    f(n)

    Fig. A1.2-a Rata de cretere a funciilor n form numeric.

  • Anexa 1 Limitele asimptotice ale funciilor 5

    f(n)

    n

    Fig. A1.2-b Rata de cretere a funciilor n form grafic.

    Clasele de complexitate a algoritmilor. Teoria complexitii este o ramur a tiinei calculatoarelor care ncearc s determine ct de greu sau ct de uor se poate rezolva o problem de calcul.

    n teoria complexitii, problemele se mpart n cteva clase de complexitate n funcie de timpul necesar s fie rezolvate pe un sistem de calcul uniprocesor (mai precis, pe o main Turing determinist).

    Problemele ale cror timp de execuie este limitat superior de funcii polinomiale (de dimensiunea n a problemei) se numesc probleme din clasa P i sunt considerate rezolvabile (tractabile). Chiar pentru polinoame cu grad ridicat, care ar putea necesita timpi de execuie de ani de zile pe cele mai rapide supercalculatoare, tot exist sperana c ele vor fi rezolvate.

    Problemele pentru care cel mai bun algoritm determinist are timp de execuie exponenial sunt considerate ne-rezolvabile (netractabile). De exemplu, dac rezolvarea unei probleme cu dimensiunea n a intrrii necesit un timp de execuie de 2n, atunci pentru n = 100, timpul de execuie pe un calculator de 1 GIPS ar fi de 400 miliarde de secole!

    O problem cu timp de execuie exponenial, pentru care, fiind cunoscut o soluie, corectitudinea acelei soluii se poate verifica n timp polinomial, aparine clasei NP (non-deterministic polinomial).

    Deoarece algoritmii determiniti sunt un caz special al algoritmilor nedeterminiti, se tie c P NP (Fig.A1.3).

  • 6 CALCUL PARALEL

    NP: clasa problemelor rezolvabile prin algoritmi nedeterminiti n timp

    polinomial;

    P : clasa problemelor rezolvabile prin algoritmi determiniti n timp

    polinomial;

    NPC: clasa problemelor complet nedeterministe.

    NP

    NPC

    P

    Fig. A1.3 Conjectura relaiilor ntre clasele de complexitate NP, P i NPC.

    Problemele din mulimea P sunt rezolvabile din punct de vedere computaional, n timp ce problemele din mulimea {NP P} sunt nerezolvabile. Ceea ce nu se cunoate nc, fiind o problem deschis n tiina calculatoarelor, este dac P = NP sau P NP.

    n momentul de fa, cei mai muli teoreticieni din domeniul tiinei calculatoarelor cred c P NP. Aceast presupunere conduce ctre conjectura c exist o subclas de probleme, numit clasa NP complet (nondeterministic complete - NPC), astfel c:

    NPC NP i NPC P = .

    ANEXA 1