Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
aa:lab:2 [2023/10/09 14:41] vlad.juja |
aa:lab:2 [2025/10/14 10:42] (current) dmihai |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Computing ====== | + | ====== Notații asimptotice și analiză amortizată ====== |
| - | <note important> | + | ==== Notații asimptotice ==== |
| - | Solutii: https://drive.google.com/file/d/1Y6JV-pDyuvejx3g8KL6SpWzbp52VMWnY/view?usp=sharing | + | |
| - | </note> | + | |
| - | 1. Amintiți-vă mașina ''isEven'' de la curs, care determină dacă un număr în baza 2 este par. | + | $ \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) \}$ | ||
| - | ^ ^ 0 ^ 1 ^ $\square$ ^ | + | {{:aa:lab:theta_fn.png|}} |
| - | | $ q_1$ | $ q_1, 0, \rightarrow$ | $ q_1, 1, \rightarrow$ | $ q_2, \square, \leftarrow$ | | + | |
| - | | $ q_2$ | $ Y, 0, -$ | $ N, 1, -$ | $ N, \square, -$ | | + | |
| - | a) scrieți care sunt configurațiile prin care trece mașina pentru inputul: 100 | + | $ 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) \}$ | ||
| - | <hidden> | + | {{:aa:lab:o_fn.png|}} |
| - | Soluție: | + | |
| - | (ꞓ, q<sub>1</sub>, 100) ⊢ (1, q<sub>1</sub>, 00) ⊢ (10, q<sub>1</sub>, 0) ⊢ (100, q<sub>1</sub>, □) ⊢ (10, q<sub>2</sub>, 0) ⊢ (10, Y, 0) | + | $ \Omega(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ |
| - | </hidden> | + | \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) \}$ | ||
| - | b) scrieți care sunt configurațiile prin care trece mașina pentru inputul: 1011 | + | {{:aa:lab:omega_fn.png|}} |
| - | <hidden> | + | $ o(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ |
| - | Soluție: | + | \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) < cf(n) \}$ | ||
| - | (ꞓ, q<sub>1</sub>, 1011) ⊢ (1, q<sub>1</sub>, 011) ⊢ (10, q<sub>1</sub>, 11) ⊢ | + | $ \omega(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ |
| - | (101, q<sub>1</sub>, 1) ⊢ (1011, q<sub>1</sub>, □) ⊢ (101, q<sub>2</sub>, 1) ⊢ (101, N, 1) | + | \begin{array}{l} |
| - | </hidden> | + | \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) < g(n) \}$ | ||
| - | 2. Fie mașina: | + | ===== Syntactic sugars ====== |
| - | ^ ^ 0 ^ 1 ^ $\square$ ^ | + | 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: |
| - | | $ q_1$ | $ q_1, 1, \rightarrow$ | $ q_1, 0, \rightarrow$ | $ q_2, \square, \leftarrow$ | | + | |
| - | | $ q_2$ | $ q_2, 1, \rightarrow$ | $ q_2, 0, \rightarrow$ | $ q_1, \square, \rightarrow$ | | + | |
| - | Scrieți primele 15 configurații prin care trece, pentru inputul 1011. | + | $ f(n) = \Theta(n) + O(\log(n)) $ |
| - | <hidden> | + | Care trebuie citită: $math[\exists g \in \Theta(n)] și $math[\exists h \in O(\log(n))] a.î. $math[f(n) = g(n) + h(n),\ \forall n \in \mathbb{R}^{+}]. |
| - | Soluție: | + | |
| + | Putem de asemenea scrie //ecuații//: | ||
| - | (ꞓ, q<sub>1</sub>, 1011) ⊢ (0, q<sub>1</sub>, 011) ⊢ (01, q<sub>1</sub>, 11) ⊢ (010, q<sub>1</sub>, 1) ⊢ (0100, q<sub>1</sub>, □) ⊢ | + | $ \Theta(n^2) = O(n^2) + o(n)$ |
| - | (010, q<sub>2</sub>, 0) ⊢ (0101, q<sub>2</sub>, □) ⊢ (0101□, q<sub>1</sub>, □) ⊢ | + | |
| - | (0101, q<sub>2</sub>, □) ⊢ (0101□, q<sub>1</sub>, □) ⊢ (0101, q<sub>2</sub>, □) ⊢ ...\\ \\ | + | |
| - | Se observă că mașina ciclează pentru acest input. | + | Care ar trebui citite: $math[\forall f \in \Theta(n^2),\ \exists g \in O(n^2)] și $math[\exists h \in o(n)] a.î. $math[f(n) = g(n) + h(n),\ \forall n \in \mathbb{R}^{+}]. |
| - | </hidden> | + | |
| - | 3. Fie mașina: | + | Observați că ecuațiile nu sunt simetrice și ar trebui citite de la stânga la dreapta. De exemplu: |
| - | ^ ^ 0 ^ 1 ^ $\square$ ^ | + | $\Theta(n) = O(n)$ |
| - | | $ q_1$ | $ q_1, 0, \rightarrow$ | $ q_1, 1, \rightarrow$ | $ q_2, 1, \leftarrow$ | | + | |
| - | | $ q_2$ | $ q_2, 0, \leftarrow$ | $ q_2, 1, \leftarrow$ | $ q_1, 1, \rightarrow$ | | + | |
| - | Scrieți primele 15 configurații prin care trece, pentru inputul 01. | + | Deși e adevărat că, pentru orice funcție $math[\Theta(n)] există o funcție egală în $math[O(n)], putem vedea că există funcții în $math[O(n)] pentru care nu există niciun corespondent în $math[\Theta(n)]. |
| - | <hidden> | + | Ca regulă, fiecare notație asimptotică din stânga unui egal, ar trebui citită ca o funcție **cuantificată universal** ($math[\forall f]) din acea clasă, iar fiecare notație asimptotică din dreapta unui egal ar trebui citită ca o funcție **cuantificată existențial** ($math[\exists g]) din clasa respectivă. |
| - | Soluție: | + | |
| - | (ꞓ, q<sub>1</sub>, 01) ⊢ (0, q<sub>1</sub>, 1) ⊢ (01, q<sub>1</sub>, □) ⊢ (0, q<sub>2</sub>, 11) ⊢ (□, q<sub>2</sub>, 011) ⊢ (□, q<sub>2</sub>, □011) ⊢ | + | $\left(\frac{\omega(n^2)}{\Theta(n)}\right) = \Omega(n) + o(n)$ |
| - | (1, q<sub>1</sub>, 011) ⊢ (10, q<sub>1</sub>, 11) ⊢ | + | |
| - | ⊢ (101, q<sub>1</sub>, 1) ⊢ (1011, q<sub>1</sub>, □) ⊢ (101, q<sub>2</sub>, 11) ⊢ | + | $math[\forall f \in \omega(n^2)\ and\ |
| - | (10, q<sub>2</sub>, 111) ⊢ (1, q<sub>2</sub>, 0111) ⊢ (□, q<sub>2</sub>, 10111) ⊢ (□, q<sub>2</sub>, □10111) ⊢ ...\\ \\ | + | \forall g \in \Theta(n),\ \exists h \in \Omega(n)] și $math[\exists j \in o(n)] a.î. |
| + | $math[\left(\frac{f(n)}{g(n)}\right) = | ||
| + | h | ||
| + | (n) + j(n),\ \forall n \in \mathbb{R}^{+}] | ||
| - | Se observă că mașina ciclează pentru acest input. Ea va continua să scrie 1 la stânga și la dreapta pe bandă. | ||
| - | </hidden> | ||
| - | 4. Fie următoarea definiție, mai restrictivă, de mașină Turing: | + | ===== Exerciții ===== |
| - | $ M = (Q, \Sigma, \Gamma, B, q_1, Y, N, H, \delta)$, unde fiecare element al tuplului are aceeași semnificație ca până acum, in afară de $ \delta: Q \times \Gamma \rightarrow Q' \times \Gamma \times \{\leftarrow, \rightarrow\}$. | + | 1. Dați exemple de câte o funcție din următoarele clase de complexitate: |
| - | Cu alte cuvinte, la fiecare tranziție, capul mașinii se poate muta pe celula din stânga sau din dreapta, dar nu poate rămâne pe loc. | + | * $ O(n)$ |
| - | Arătați că, oricare ar fi o mașină $ M$ conform definiției de la curs, există o mașină $ M'$ conform acestei definiții, astfel încât $ \forall w \in \Sigma^*, M[w] \equiv M'[w]$. | + | * $ \Omega(log(n))$ |
| + | * $ \Theta(n^2)$ | ||
| + | * $ \omega(\frac{1}{n})$ | ||
| + | * $ o(3^n)$ | ||
| - | <hidden> | + | 2. Verificați valoarea de adevăr a următoarelor propoziții: |
| - | Trebuie să demonstrăm că putem echivala orice tranziție a mașinii $ M$ cu o tranziție sau un set de tranziții în cadrul mașinii $ M'$.\\ \\ | + | |
| - | Dacă mașina $ M$ are o tranziție care mută capul de citire la stânga sau la dreapta, atunci acea tranziție va arăta identic pentru mașina $ M'$, pentru că, în acest caz, nu există nici un fel de restricție. | + | * $ \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})$ | ||
| - | Pentru $ \delta M(q,c) = (q',c',dir), dir \in \{\leftarrow, \rightarrow\}$, construim $ \delta M'(q,c) = (q',c',dir)$.\\ \\ | + | 3. Fie funcția: |
| - | Dacă mașina $ M$ are o tranziție care nu modifică poziția capului de citire, putem simula acest comportament în cadrul mașinii $ M'$, mutând capul de citire la dreapta după care înapoi la stânga, trecând printr-o stare auxiliară. | + | <code c> |
| + | 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; | ||
| + | } | ||
| + | </code> | ||
| - | Pentru $ \delta M(q,c) = (q',c',-)$ construim $ \delta M'(q,c) = (q_{aux},c',\rightarrow)$ și $ \delta M'(q_{aux},x) = (q',x,\leftarrow)$, $ \forall x \in \Gamma$. | + | a) Folosiți notații asimptotice pentru a descrie limita superioară a $ f$. |
| - | </hidden> | + | |
| - | 5. Considerăm mașinile Turing cu următorii membrii fixați: | + | b) Folosiți notații asimptotice pentru a descrie limita inferioară a $ f$. |
| - | * $ \Sigma = \{X\}$ | + | c) Folosiți notațiile asimptotice pentru a estima numărul de iterații din bucla ''while''. |
| - | * $ \Gamma = \{X, \square\}$ | + | |
| - | * $ B = \square$ | + | |
| - | și cu proprietatea că, primind ca input șirul vid, execuția se va termina în starea $ H$, după un număr finit de tranziții. | + | d) Îmbunătățiți limitele superioare pentru $ f$ folosind aceste estimări. |
| - | Care este numărul maxim de tranziții și cum ar arăta, concret, funcția $ \delta$ pentru o astfel de mașină cu: | + | |
| - | a) o stare | + | e) Puteți găsi limite strânse (tight bounds) pentru f? |
| - | b) două stări | + | ==== Exerciții - syntactic sugars ==== |
| - | c) trei stări | + | 4. Demonstrați/infirmați următoarele propoziții: |
| - | 6. Arătați că, dacă $ f$ și $ g$ sunt două funcții //computabile//, atunci și compunerea lor $ f \circ g$ e computabilă. | + | * $ 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)$ | ||
| - | <hidden> | ||
| - | Fie $ M_f$ o Mașină Turing care "computează" $ f \Rightarrow \forall w, M_f[w] \rightarrow f(w)$ \\ \\ | ||
| - | Similar, fie $ M_g$ o Mașină Turing care "computează" $ g \Rightarrow \forall w, M_g[w] \rightarrow g(w)$ \\ \\ | ||
| - | Pentru a nu apărea probleme, este important ca $ M_f$ și $ M_g$ să nu aibă stări cu aceeași denumire. Construim $ M_{fg}$ care începe prin a rula tranzițiile din $ M_f$ pe inputul $ w \Rightarrow$ obținem pe bandă $ f(w)$. Folosind stări auxiliare, mutăm cursorul până la începutul rezultatului aflat pe bandă, lăsând mașina $ M_{fg}$ în configurația: $ (□, Stare-Inițială-M_g, f(w))$, care rulează apoi tranzițiile din $ M_g$ pe noul input, $ f(w)$. În final se obține $ g(f(w))$, adică $ (g \circ f)(w)$. | + | ==== Analiză amortizată ==== |
| - | </hidden> | + | |
| - | 7. Fie o mașină Turing a cărei bandă constă în $ k$ //piste//. Fiecare celulă e împărțită pe orizontală în $ k$ porțiuni ce conțin fiecare câte un simbol. La începutul computației, simbolurile din input se află pe prima pistă (în fiecare celulă, pe prima porțiune), restul simbolurilor fiind $ B$. Capul de citire se află pe celula ce conține primul simbol din input. | ||
| - | $ M = (Q, \Sigma, \Gamma, B, q_1, Y, N, H, \delta)$, unde fiecare element al tuplului are aceeași semnificație ca până acum, în afară de $ \delta: Q \times \Gamma^k \rightarrow Q' \times \Gamma^k \times \{\leftarrow, -, \rightarrow\}$. | + | 1. Implementați un contor binar împreună cu operația de incrementare (''inc''), folosind un array de tip ''unsigned''. Folosiți o variabilă globală pentru a număra numărul de schimbări de biți (flips) într-o secvență de $ n$ operații de incrementare. |
| - | Cu alte cuvinte, la fiecare tranziție, capul mașinii citește simultan $ k$ simboluri și scrie $ k$ simboluri (în rest, ca și în definiția din curs, capul se mută apoi o celulă la stânga/dreapta sau rămâne pe loc, iar mașina trece într-o nouă stare). | + | 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. |
| - | Arătați că oricare ar fi o masină $ M$ conform acestei definiții, există o mașină $ M'$ conform definiției de la curs, astfel încât $ \forall w \in \Sigma^*, M[w] \equiv M'[w]$. | + | |
| - | <hidden> | + | 3. Aplicați celelalte două metode de analiză amortizată. |
| - | Soluția constă în a mapa fiecare tuplu $ t \in \Gamma ^k$ la un simbol din $ \Gamma'$. Pentru a putea face acest lucru, $ \vert \Gamma ' \vert = \vert \Gamma \vert ^k$. \\ \\ | + | 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''. |
| - | Fie a și b simbolurile din $ \Gamma '$ la care se mapează tuplurile: $ (t_1,t_2 ... t_k)$, respectiv $ (t_1', t_2' ... t_k')$ din $ \Gamma ^k$. \\ \\ | + | 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. | |
| - | Construim $ \delta M'$ în felul următor: | + | |
| - | + | ||
| - | Pentru $ \delta M(q, (t_1,t_2 ... t_k)) = (q', (t_1', t_2' ... t_k'), dir) \Rightarrow \delta M'(q, a) = (q', b, dir), dir \in (\leftarrow, -, \rightarrow)$. | + | |
| - | + | ||
| - | </hidden> | + | |
| - | + | ||
| - | 8. Fie o versiune de mașină Turing a cărei bandă se extinde arbitrar doar în partea dreaptă, //nu și în stânga//. La începutul computației, inputul e scris pe bandă, cu primul simbol pe prima celulă, unde se află și capul de citire. La orice moment de timp, dacă capul de citire se află pe prima celulă și mașina face o tranziție care îl mută la stânga, acesta rămâne pe loc. | + | |
| - | Arătați că oricare ar fi o masină $ M$ conform definiției de la curs, există o mașină $ M'$ conform acestei definiții, astfel încât $ \forall w \in \Sigma^*, M[w] \equiv M'[w]$. | + | |
| - | + | ||
| - | 9. Fie o versiune de mașină Turing cu singura diferență că, la orice tranziție, capul de citire se poate sta pe loc, sau se poate mișca la stânga/dreapta cu orice număr $ n \in \mathbb{N}$ de poziții. | + | |
| - | Arătați că oricare ar fi o masină $ M$ conform acestei definiții, există o mașină $ M'$ conform definiției de la curs, astfel încât $ \forall w \in \Sigma^*, M[w] \equiv M'[w]$. | + | |