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/21 21:27] tpruteanu |
aa:lab:2 [2025/10/14 10:42] (current) dmihai |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Computing ====== | + | ====== Notații asimptotice și analiză amortizată ====== |
| - | ===== Mașina Turing ===== | + | ==== Notații asimptotice ==== |
| - | După definiția de la curs, o mașină Turing poate fi caracterizată printr-un 6-tuplu: $ (Q, \Sigma, \Gamma, B, q_1, \delta)$, unde: | + | $ \Theta(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\ |
| - | * $ Q $ e mulțimea stărilor interne | + | \begin{array}{l} |
| - | * $ \Sigma $ e alfabetul de intrare (simboluri aflate pe bandă la începutul rulării) | + | \exists c_1, c_2 \in \mathbb{R}^+\cr |
| - | * $ \Gamma $ e alfabetul benzii (simboluri pe care le putem folosi în timpul rulării mașinii) | + | \exists n_0 \in \mathbb{N} |
| - | * $ B $ e starea default a unei celule nescrise (**blank symbol**) | + | \end{array}\ |
| - | * $ q_1 $ e starea inițială | + | such\ that\ \forall\ n \ge n_0,\ \ c_1f(n) \le g(n) \le c_2f(n) \}$ |
| - | * $ \delta $ e funcția de tranziție, definită astfel: $ \delta: Q \times \Gamma \rightarrow (Q \cup \{Y, N, H\}) \times \Gamma \times \{\leftarrow, -,\rightarrow\}$ | + | |
| - | * $ Y $ e starea de acceptare, când mașina ajunge în această stare, se oprește cu răspunsul „da” | + | |
| - | * $ N $ e starea de rejectare, când mașina ajunge în această stare, se oprește cu răspunsul „nu” | + | |
| - | * $ H $ e starea de terminare, când mașina ajunge în această stare, se oprește cu răspunsul format din conținutul benzii | + | |
| - | ===== Exerciții ===== | + | {{:aa:lab:theta_fn.png|}} |
| - | 1. Amintiți-vă mașina ''isEven'' de la curs, care determină dacă un număr în baza 2 este par. | + | $ 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) \}$ | ||
| - | * scrieți care sunt configurațiile prin care trece mașina pentru inputul: 100 | + | {{:aa:lab:o_fn.png|}} |
| - | * scrieți care sunt configurațiile prin care trece mașina pentru inputul: 1011 | + | $ \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) \}$ | ||
| - | ^ ^ 0 ^ 1 ^ $\square$ ^ | + | {{:aa:lab:omega_fn.png|}} |
| - | | $ q_1$ | $ q_1, 0, \rightarrow$ | $ q_1, 1, \rightarrow$ | $ q_2, \square, \leftarrow$ | | + | |
| - | | $ q_2$ | $ Y, 0, -$ | $ N, 1, -$ | $ N, \square, -$ | | + | |
| - | ---- | + | $ 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) < cf(n) \}$ | ||
| - | 2. Scrieți primele 15 configurații prin care trece mașina de mai jos pentru inputul 1011. Ce observați? | + | $ \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) < g(n) \}$ | ||
| - | ^ ^ 0 ^ 1 ^ $\square$ ^ | + | ===== Syntactic sugars ====== |
| - | | $ 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$ | | + | |
| - | ---- | + | 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: |
| - | 3. Scrieți primele 15 configurații prin care trece mașina de mai jos pentru inputul 01. | + | $ f(n) = \Theta(n) + O(\log(n)) $ |
| - | ^ ^ 0 ^ 1 ^ $\square$ ^ | + | 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}^{+}]. |
| - | | $ 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$ | | + | |
| - | ---- | + | Putem de asemenea scrie //ecuații//: |
| - | 4. Considerăm mașinile Turing cu următorii membrii fixați: | + | $ \Theta(n^2) = O(n^2) + o(n)$ |
| - | * $ \Sigma = \{X\}$ | + | 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}^{+}]. |
| - | * $ \Gamma = \{X, \square\}$ | + | |
| - | * $ B = \square$ | + | 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 $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)]. | ||
| + | |||
| + | 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ă. | ||
| + | |||
| + | $\left(\frac{\omega(n^2)}{\Theta(n)}\right) = \Omega(n) + o(n)$ | ||
| + | |||
| + | $math[\forall f \in \omega(n^2)\ and\ | ||
| + | \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}^{+}] | ||
| + | |||
| + | |||
| + | ===== Exerciții ===== | ||
| - | Știind că mașina trebuie să se oprească în starea $ H $ și are un numar **k** de stări ( $ |Q| = k $ ), aflați numărul **maxim** de tranziții ce pot fi efectuate de această mașină atunci când banda de intrare este goală și definiți funcția de tranziție $ \delta $ pentru: | + | 1. Dați exemple de câte o funcție din următoarele clase de complexitate: |
| - | * o stare ( $ k = 1 $ ) | + | * $ O(n)$ |
| + | * $ \Omega(log(n))$ | ||
| + | * $ \Theta(n^2)$ | ||
| + | * $ \omega(\frac{1}{n})$ | ||
| + | * $ o(3^n)$ | ||
| - | * două stări ( $ k = 2 $ ) | + | 2. Verificați valoarea de adevăr a următoarelor propoziții: |
| - | * trei stări ( $ k = 3 $ ) | + | * $ \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})$ | ||
| - | <hidden> | + | 3. Fie funcția: |
| - | <note> | + | |
| - | **Hint:** soluția optimă pentru $ k = 1 $ este 2 tranziții, pentru $ k = 2 $ este 6 tranziții, iar pentru $ k = 3 $ este 21 tranziții. | + | |
| - | </note> | + | |
| - | </hidden> | + | |
| - | ---- | + | <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> | ||
| - | 5. Arătați că, dacă $ f $ și $ g $ sunt două funcții //computabile//, atunci și compunerea lor $ f \circ g$ e computabilă. | + | 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$. |
| - | 6. Fie o definiție mai restrictivă de mașină Turing, unde singura diferență apare la: $ \delta: Q \times \Gamma \rightarrow (Q \cup \{Y, N, H\}) \times \Gamma \times \{\leftarrow,\rightarrow\} $ | + | c) Folosiți notațiile asimptotice pentru a estima numărul de iterații din bucla ''while''. |
| - | Cu alte cuvinte, la fiecare tranziție, capul mașinii **trebuie** să se mute pe celula din stânga sau din dreapta, nu poate rămâne pe loc. | + | d) Îmbunătățiți limitele superioare pentru $ f$ folosind aceste estimări. |
| - | 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]$ (cele două mașini dau același răspuns indiferent de input). | + | e) Puteți găsi limite strânse (tight bounds) pentru f? |
| - | ---- | + | ==== Exerciții - syntactic sugars ==== |
| - | 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. | + | 4. Demonstrați/infirmați următoarele propoziții: |
| - | $ M = (Q, \Sigma, \Gamma, B, q_1, \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 \cup \{Y, N, H\}) \times \Gamma^k \times \{\leftarrow,-,\rightarrow\} $ | + | * $ 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)$ | ||
| - | 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 **pe toate pistele simultan**, iar mașina trece într-o nouă stare). | ||
| - | 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]$. | ||
| - | ---- | + | ==== Analiză amortizată ==== |
| - | 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]$. | ||
| - | ---- | + | 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. |
| - | 9. Fie o versiune de mașină Turing cu singura diferență că, la orice tranziție, capul de citire poate sta pe loc, sau se poate mișca la stânga/dreapta cu orice număr $ n \in \mathbb{N}$ de poziții. | + | 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 mașină $ 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]$. | + | |
| - | ---- | + | 3. Aplicați celelalte două metode de analiză amortizată. |
| - | 10. Fie o mașină Turing cu o bandă bidimensională infinită a cărei cap de citire poate fi deplasat în orice direcție (sus, jos, stânga, dreapta) sau poate rămâne pe loc. | + | 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''. |
| - | Arătați că oricare ar fi o mașină $ 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]$. | + | |
| - | /* | + | Estimați costul unei secvențe de operații de adăugare și eliminare? |
| - | <note> | + | Luați în considerare scenariul nefavorabil, fără a face nicio presupunere asupra ordinii în care apar operațiile. |
| - | Soluțiile pentru exercițiile din laborator se pot găsi [[aa:lab:sol:1|aici]]. | + | |
| - | </note> | + | |
| - | */ | + | |