Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 curscare determină dacă un număr în baza 2 este par.+$ \Theta(f(n)) = \{ g: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}\ |\  
 +\begin{array}{l} 
 +\exists c_1c_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, -$  ​+
  
-ascrieți care sunt configurațiile prin care trece mașina pentru inputul100+$ 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,\ \  
 +\le cf(n\le g(n\}$
  
-b) scrieți care sunt configurațiile prin care trece mașina pentru inputul1011+{{: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}^{+}\ |\  
-(101q<​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 simplitateputem scrie //expresii aritmetice//​ astfel:
-| $ q_1$ | $ q_11, \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țprimele 15 configurații prin care trece, pentru ​inputul 01.+Deș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⊢ (1011q<​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) =  
 +
 +(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șsemnificație ca până acum, in afară de $ \deltaQ \times \Gamma \rightarrow Q' \times \Gamma \times \{\leftarrow,​ \rightarrow\}$.+1. Daț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ă ​Mconform 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 ​Mare 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)$.\\ \\+3Fie funcția:
  
-Dacă mașina $ M$ are o tranziție care nu modifică poziția capului de citireputem simula acest comportament în cadrul mașinii $ M'$mutând capul de citire la dreapta după care înapoi la stângatrecând printr-o stare auxiliară.+<code c> 
 +int f(int *aint nint key) { 
 +    int lo = 0hi = 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$.  +aFolosiț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 ​ffolosind aceste estimări.
-Care este numărul maxim de tranziții șcum ar arăta, concret, funcția ​\deltapentru o astfel de mașină cu:+
  
-ao stare+ePuteț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 șscrie $ k$ simboluri (în rest, ca și în definiția din curs, capul se mută apoi 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 ​analiză agregată a costului unei secvențe de noperații de incrementare.
-Arătați că oricare ar fi o masină ​Mconform 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 $ \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 golImplementați operațiile ''​add''​ și ''​remove'​'.
  
-Fie a ș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țcostul unei secvențe de operații ​de adăugare și eliminare? 
- +Luați în considerare scenariul nefavorabilfă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 ​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 cursexistă 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]$.+