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:sol:11 [2024/01/06 07:15]
alexandra.udrescu01
aa:lab:sol:11 [2024/01/08 23:55] (current)
stefan.sterea
Line 1: Line 1:
 ===== Analiza amortizata ===== ===== Analiza amortizata =====
- +==== 1. Stack ====
-==== 1. FIFO ==== +
- +
-TODO +
- +
-==== 2. Stack ====+
  
 Naiv: La un momnt dat pot fi k elemente in stack, deci cea mai costisitoare operatie va fi mpop cu complexitate temporala O(k).  Naiv: La un momnt dat pot fi k elemente in stack, deci cea mai costisitoare operatie va fi mpop cu complexitate temporala O(k). 
Line 19: Line 14:
  
  
-=== 2.1. Aggregate method ===+=== 1.1. Aggregate method ===
  
  $ pop $  si  $ push $  au cost $ 1 $,  $ mpop $  are cost $ k $.  $ pop $  si  $ push $  au cost $ 1 $,  $ mpop $  are cost $ k $.
Line 28: Line 23:
  $ cost(op) = cost(S) / k = (2k - 2) / k \leq 2 => cost(op) = 2 $   $ cost(op) = cost(S) / k = (2k - 2) / k \leq 2 => cost(op) = 2 $ 
  
-=== 2.2. Banking method ===+=== 1.2. Banking method ===
  
 Pentru fiecare operatie push, trebuie sa avem in vedere un viitor ​ $ pop $ .  Pentru fiecare operatie push, trebuie sa avem in vedere un viitor ​ $ pop $ . 
Line 34: Line 29:
  
 Alegem: \\ Alegem: \\
- $ \hat(c_{push}= 2 $  \\ + $ \hat c_{push} = 2 $  \\ 
- $ \hat(c_{pop}= 0 $  \\ + $ \hat c_{pop} = 0 $  \\ 
- $ \hat(c_{mpop}= 0 $ + $ \hat c_{mpop} = 0 $ 
  
 Aratam ca:  $ cost(S) \leq \sum_{i=1}^{n}\hat{c_i} $ . \\ Aratam ca:  $ cost(S) \leq \sum_{i=1}^{n}\hat{c_i} $ . \\
Line 42: Line 37:
  $ \sum_{i=1}^{n}\hat{c_i} = 2 * (k-1) + 0 * 1 = 2k - 2 $   $ \sum_{i=1}^{n}\hat{c_i} = 2 * (k-1) + 0 * 1 = 2k - 2 $ 
  
-=== 2.3. Potential method ===+=== 1.3. Potential method ===
  
 Fie  $ D_k $  starea dupa k operatii. Starea initiala cand stiva e goala este  $ D_0 $ . Fie  $ D_k $  starea dupa k operatii. Starea initiala cand stiva e goala este  $ D_0 $ .
 Definim o functie ne-negativa de potential ​ $ \Phi : States -> ℕ $  Definim o functie ne-negativa de potential ​ $ \Phi : States -> ℕ $ 
  
-Notand costurile amortizate ale unei operatii arbitrare cu  $ \hat(c_{i}$  si costul sau real cu  $ c_i $ , avem de aratat ca: \\+Notand costurile amortizate ale unei operatii arbitrare cu  $ \hat c_{i} $  si costul sau real cu  $ c_i $ , avem de aratat ca: \\
  $ \sum_{i=1}^{n}{c_i} \leq \sum_{i=1}^{n}{\hat{c_i}} $   $ \sum_{i=1}^{n}{c_i} \leq \sum_{i=1}^{n}{\hat{c_i}} $ 
  
-Stim ca:  $ \hat{c_i} = c_{i} + \Phi(D_k) - \Phi(D_{k-1}) $ +Stim ca:  $ \hat{c_i} = c_{i} + \Phi(D_i) - \Phi(D_{i-1}) $ 
  
 Deci:  $  \sum_{i=1}^{n}{\hat{c_i}} = \sum_{i=1}^{n}{c_i} + \Phi(D_n) - \Phi(D_0) $  ​ Deci:  $  \sum_{i=1}^{n}{\hat{c_i}} = \sum_{i=1}^{n}{c_i} + \Phi(D_n) - \Phi(D_0) $  ​
Line 62: Line 57:
  
 Calculam costul amortizat al fiecarei operatii:\\ Calculam costul amortizat al fiecarei operatii:\\
- $ \hat(c_{push}= c_{push} + \Phi(D_i) - \Phi(D_{i-1}) = c_{push} + (m + 1) - m = c_{push} + 1 = 1 + 1 = 2 $ \\ + $ \hat c_{push} = c_{push} + \Phi(D_i) - \Phi(D_{i-1}) = c_{push} + (m + 1) - m = c_{push} + 1 = 1 + 1 = 2 $ \\ 
- $ \hat(c_{pop}= c_{pop} + \Phi(D_i) - \Phi(D_{i-1}) = c_{pop} + (m - 1) - m = c_{pop} - 1 = 1 - 1 = 0 $  \\ + $ \hat c_{pop} = c_{pop} + \Phi(D_i) - \Phi(D_{i-1}) = c_{pop} + (m - 1) - m = c_{pop} - 1 = 1 - 1 = 0 $  \\ 
- $ \hat(c_{mpop(k)}= c_{mpop(k)} + \Phi(D_i) - \Phi(D_{i-1}) = c_{mpop(k)} + (m - k) - m = c_{mpop(k)} - k = k - k = 0 $ + $ \hat c_{mpop(k)} = c_{mpop(k)} + \Phi(D_i) - \Phi(D_{i-1}) = c_{mpop(k)} + (m - k) - m = c_{mpop(k)} - k = k - k = 0 $ 
  
-==== 3. Heap ====+==== 2. Heap ====
  
-TODO+=== 2.1. Aggregate Method ===
  
-==== 4Binary Counter ====+Fie $ S $ o secventa de $ n $ inserari intr-un heap gol. Pentru a 
 +simplifica analiza, dar fara a influenta rezultatul, vom presupune  
 +ca $ n 2^k $, $ k log_2(n) $.
  
-=== 4.1. Aggregate method ===+Pe nivelul 0 avem 1 nod (radacina) care necesita maxim 0 swap-uri pentru a ajunge pe pozitia corecta. \\  
 +Pe nivelul 1 avem 2 noduri care necesita maxim 1 swap-uri pentru a ajunge pe pozitia corecta. \\  
 +Pe nivelul 2 avem 4 noduri care necesita maxim 2 swap-uri pentru a ajunge pe pozitia corecta. \\  
 +... \\ 
 +Pe nivelul k avem $ 2^k $ noduri care necesita maxim k swap-uri pentru a ajunge pe pozitia corecta. \\  
 + 
 +Pentru a insera un nod in heap, avem nevoie de costul de inserare ($ 1 $) si costul de pozitionare prin swap cu parintii. 
 + 
 +$ cost(S) ​\sum_{i=1}^{n}{1} + \sum_{i=1}^{k}{nodes(i) * swaps(i)} = $ \\ 
 +$ = n + \sum_{i=1}^{log_2(n)}{2^i * i} = $ \\ 
 +https://​www.wolframalpha.com/​input?​i=sum+j%3D0+to+n+of+j+2%5Ej \\ 
 +$ = n + 2(log_2(n) * 2^{log_2(n)} - 2^{log_2(n)} + 1) = $ \\ 
 +$ = n + 2(log_2(n) * n - n + 1) = $ \\ 
 +$ = n + 2 * log_2(n) * n - 2n + 2 = O(nlog(n)) $ 
 + 
 +Deci, pentru o singura operatie de insert, avem $ cost(insert) = cost(S) / n = O(nlog(n)) / n = O(log(n)) $ 
 + 
 +=== 2.2. Accounting Method === 
 + 
 +Pentru fiecare $ insert $, avem nevoie sa luam in considerare:​ 
 +  - costul de creare al unui nou nod = $ 1 $ 
 +  - swap cu parintii = $ log(n) $ 
 + 
 +Alegem $ \hat c_{insert} = 1 + log(n) = O(log(n)) $ 
 + 
 +Acest cost este mereu mai mare sau egal decat costul real al unei operatii, dat fiind ca nu toate operatiile au nevoie de $ log(n) $ swap-uri. 
 + 
 +=== 2.3. Potential Method === 
 + 
 +Fie starile $ D_i $ = starea heap-ului dupa $ i $ operatii $ insert $ 
 + 
 +Definim o functie ne-negativa de potential ​ $ \Phi : States -> ℕ $ \\ 
 +$ \Phi(D_0) = 0 $ \\ 
 +$ \Phi(D_i) = $ numarul de valori in heap 
 + 
 +Calculam costul amortizat: \\ 
 +$ \hat{c_i} = c_{i} + \Phi(D_i) - \Phi(D_{i-1}) = c_{i} + 1 $ 
 + 
 +$ c_{i} $ are un cost $ log(n) + 1 $ dat de numarul de swap-uri maxim + inserarea unui nod in heap. 
 + 
 +Deci, putem alege $ \hat{c_i} = log(n) + 2 $ 
 + 
 + 
 +==== 3. Binary Counter ==== 
 + 
 +=== 3.1. Aggregate method ===
  
 Bitul 0 se schimba la fiecare operatie. \\ Bitul 0 se schimba la fiecare operatie. \\
Line 81: Line 123:
  
 Intr-o secventa $ S $ de $ n $ operatii $ increment $, numarul total de modificari de biti este: \\ Intr-o secventa $ S $ de $ n $ operatii $ increment $, numarul total de modificari de biti este: \\
-$cost(S) = n + n/2 + n/(2^2) + ... + n/(2^k) \leq n / (1 - 1/2) = 2n $+$ cost(S) = n + n/2 + n/(2^2) + ... + n/(2^k) \leq n / (1 - 1/2) = 2n $
  
 Deci, costul amortizat al unei singure operatii de increment este: Deci, costul amortizat al unei singure operatii de increment este:
Line 87: Line 129:
 $ cost(op) = cost(S) / n = 2n / n = 2 $ $ cost(op) = cost(S) / n = 2n / n = 2 $
  
-=== 4.2. Accounting method ===+=== 3.2. Accounting method ===
  
 Costul real al unei operatii este numarul de biti modificati. Costul real al unei operatii este numarul de biti modificati.
Line 95: Line 137:
   - o schimbare ulterioara a bitului din 1 in 0   - o schimbare ulterioara a bitului din 1 in 0
  
-$ \hat(c_{increment}= 2$+$ \hat c_{increment} = 2$
  
  
-=== 4.3. Potential method ===+=== 3.3. Potential method ===
  
  
Line 109: Line 151:
 Presupunand ca operatia $ i $ reseteaza $ k_i $ biti de 1, costul real al operatiei devine $ c_i = 1 + k_i $. Presupunand ca operatia $ i $ reseteaza $ k_i $ biti de 1, costul real al operatiei devine $ c_i = 1 + k_i $.
  
-Stim ca $ \hat{c_i} = c_{i} + \Phi(D_k) - \Phi(D_{k-1}) $+Stim ca $ \hat{c_i} = c_{i} + \Phi(D_i) - \Phi(D_{i-1}) $
  
 Calculam $ \hat{c_i} $ pe un caz simplu: $ 000000 -> 000001 $ \\ Calculam $ \hat{c_i} $ pe un caz simplu: $ 000000 -> 000001 $ \\
-$ \hat{c_i} = c_{i} + \Phi(D_k) - \Phi(D_{k-1}) = 1 + 1 - 0 = 2 $+$ \hat{c_i} = c_{i} + \Phi(D_i) - \Phi(D_{i-1}) = 1 + 1 - 0 = 2 $
  
 Aratam ca $ \sum_{i=1}^{n}{c_i} \leq \sum_{i=1}^{n}{\hat{c_i}} $ \\ Aratam ca $ \sum_{i=1}^{n}{c_i} \leq \sum_{i=1}^{n}{\hat{c_i}} $ \\
-$ \sum_{i=1}^{n}{c_i} = 2n $ (am vazut mai devreme la metoda agregarii) \\ +\hat{c}_i = c_i + \Phi(F_i) - \Phi(F_{i-1}) => \sum_{i=1}^{n}{\hat{c_i}} = \sum_{i=1}^{n}{c_i + \Phi(F_i- \Phi(F_{i-1})} = $ \\ 
-$ \sum_{i=1}^{n}{\hat{c_i}} = n * \hat{c_i= 2n $+\sum_{i=1}^{n}{c_i} + \Phi(F_n) - \Phi(F_{0}) $ 
 + 
 +\Phi(F_n) \geq \Phi(F_{0}) $ se intampla mereu pentru ca numarul de biti de 1 nu poate scadea sub $ 0 $, adica atatia biti $ 1 $ cat sunt in starea $ F_0 $