This is an old revision of the document!


Notații asimptotice și analiză amortizată

Notații asimptotice

$ \Theta(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ \begin{array}{l} \exists c_1, c_2 \in \mathbb{R}^+\cr \exists n_0 \in \mathbb{N} \end{array}\ such\ that\ \forall\ n \ge n_0,\ \ c_1f(n) \le g(n) \le c_2f(n) \}$

$ O(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ \begin{array}{l} \exists c \in \mathbb{R}^+\cr \exists n_0 \in \mathbb{N} \end{array}\ such\ that\ \forall\ n \ge n_0,\ \ 0 \le g(n) \le cf(n) \}$

$ \Omega(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ \begin{array}{l} \exists c \in \mathbb{R}^+\cr \exists n_0 \in \mathbb{N} \end{array}\ such\ that\ \forall\ n \ge n_0,\ \ 0 \le cf(n) \le g(n) \}$

$ o(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ \begin{array}{l} \forall c \in \mathbb{R}^+\cr \exists n_0 \in \mathbb{N} \end{array}\ such\ that\ \forall\ n \ge n_0,\ \ 0 \le g(n) \le cf(n) \}$

$ \omega(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ \begin{array}{l} \forall c \in \mathbb{R}^+\cr \exists n_0 \in \mathbb{N} \end{array}\ such\ that\ \forall\ n \ge n_0,\ \ 0 \le cf(n) \le g(n) \}$

Notațiile asimptotice sunt adesea folosite pentru a ne referi la funcții arbitrare cu o anumită creștere. Pentru simplitate, putem scrie expresii aritmetice astfel:

$ f(n) = \Theta(n) + O(\log(n)) $

Care trebuie citită: $ \exists g \in \Theta(n)$ și $ \exists h \in O(\log(n))$ a.î. $ f(n) = g(n) + h(n),\ \forall n \in \mathbb{R}^{+}$ .

Putem de asemenea scrie ecuații:

$ \Theta(n^2) = O(n^2) + o(n)$

Care ar trebui citite: $ \forall f \in \Theta(n^2),\ \exists g \in O(n^2)$ și $ \exists h \in o(n)$ a.î. $ f(n) = g(n) + h(n),\ \forall n \in \mathbb{R}^{+}$ .

Observați că ecuațiile nu sunt simetrice și ar trebui citite de la stânga la dreapta. De exemplu:

$\Theta(n) = O(n)$

Deși e adevărat că, pentru orice funcție $ \Theta(n)$ există o funcție egală în $ O(n)$ , putem vedea că există funcții în $ O(n)$ pentru care nu există niciun corespondent în $ \Theta(n)$ .

Ca regulă, fiecare notație asimptotică din stânga unui egal, ar trebui citită ca o funcție cuantificată universal ($ \forall f$ ) din acea clasă, iar fiecare notație asimptotică din dreapta unui egal ar trebui citită ca o funcție cuantificată existențial ($ \exists g$ ) din clasa respectivă.

$\left(\frac{\omega(n^2)}{\Theta(n)}\right) = \Omega(n) + o(n)$

$ \forall f \in \omega(n^2)\ and\ \forall g \in \Theta(n),\ \exists h \in \Omega(n)$ și $ \exists j \in o(n)$ a.î. $ \left(\frac{f(n)}{g(n)}\right) = h (n) + j(n),\ \forall n \in \mathbb{R}^{+}$

1. Dați exemple de câte o funcție din următoarele clase de complexitate:

  • $ O(n)$
  • $ \Omega(log(n))$
  • $ \Theta(n^2)$
  • $ \omega(\frac{1}{n})$
  • $ o(3^n)$

2. Verificați valoarea de adevăr a următoarelor propoziții:

  • $ \sqrt{n} \in O(\log{n})$
  • $ \log{n} \in O(\log{(\log{n})})$
  • $ n \in O(\sqrt{n}\cdot\log{n})$
  • $ n + \log{n} \in \Theta(n)$
  • $ \log{(n\cdot \log{n})}\in\Theta(\log{n})$
  • $ \sqrt{n}\in\omega(\log{n})$

3. Fie funcția:

int f(int *a, int n, int key) {
    int lo = 0, hi = n;            
    while (lo < hi) {                 
        int mid = lo + (hi - lo) / 2;
        if (a[mid] < key)
            lo = mid + 1;
        else
            hi = mid;
    }
    return lo;
}

a) Folosiți notații asimptotice pentru a descrie limita superioară a $ f$.

b) Folosiți notații asimptotice pentru a descrie limita inferioară a $ f$.

c) Folosiți notațiile asimptotice pentru a estima numărul de iterații din bucla while.

d) Îmbunătățiți limitele superioare pentru $ f$ folosind aceste estimări.

e) Puteți găsi limite strânse (tight bounds) pentru f?

Exerciții - syntactic sugars

4. Demonstrați/infirmați următoarele propoziții:

  • $ f(n) = \Omega(\log(n)) \land g(n)=O(n) \implies f(n)=\Omega(\log(g(n))$
  • $ f(n) = \Omega(\log(n)) \land g(n)=O(n) \implies f(n)=\Theta(\log(g(n))$
  • $ f(n) = \Omega(g(n)) \land g(n)=O(n^2) \implies \frac{g(n)}{f(n)}=O(n)$

Analiză amortizată

1. Implementați un contor binar împreună cu operația de incrementare (inc), folosind un array de tip unsigned. Folosiți o variabilă statică pentru a număra numărul de schimbări de biți (flips) într-o secvență de $ n$ operații de incrementare.

2. Experimentați cu diferite valori ale lui n și utilizați observațiile obținute pentru a realiza o analiză agregată a costului unei secvențe de $ n$ operații de incrementare.

3. Aplicați celelalte două metode de analiză amortizată.

4. Pentru editorul din laboratorul trecut, implementați un buffer de text, folosind un array care își dublează dimensiunea atunci când este plin și o înjumătățește atunci când este pe jumătate gol. Implementați operațiile add și remove.

 Estimați costul unei secvențe de operații de adăugare și eliminare? Luați în considerare scenariul nefavorabil, fără a face nicio presupunere asupra ordinii în care apar operațiile.