This is an old revision of the document!
Analiza amortizata
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). Daca avem n operatii in secventa (avem deci $ n \leq k $ ), vom avea maxim $ n * O(k) = O(n^2) $ . Dar totusi nu putem face atatea $ mpop(k) $ , pentru ca nu avem elemente.
Pentru a putea efectua un $ pop $ , operatia trebuie precedata in secventa $ S $ de un push.
Pentru a putea efectua un $ mpop(k) $ , operatia trebuie precedata in secventa $ S $ de $ k $ operatii push.
Worst-Case: Cate elemente pot fi adaugate si eliminate maxim intr-o secventa de k operatii? * se pot adauga maxim $ (k-1) $ elemente si se pot elimina cu un $ mpop(k-1) $ la final
2.1. Aggregate method
$ pop $ si $ push $ au cost $ 1 $, $ mpop $ are cost $ k $.
$ cost(S) = (k-1) * 1 + (k - 1) = 2k - 2 $
Deci, pentru o singura operatie, avem: $ cost(op) = cost(S) / k = (2k - 2) / k \leq 2 \Rightarrow cost(op) = 2 $
2.2. Banking method
Pentru fiecare operatie push, trebuie sa avem in vedere un viitor $ pop $ . Operatiile $ push $ vor creste creditul, iar operatiile $ pop $ si $ mpop $ il vor scadea.
Alegem:
$ \hat(c_{push}) = 2 $
$ \hat(c_{pop}) = 0 $
$ \hat(c_{mpop}) = 0 $
Aratam ca: $ cost(S) \leq \sum_{i=1}^{n}\hat{c_i} $ .
$ cost(S) = 2k - 2 $ (am vazut anterior)
$ \sum_{i=1}^{n}\hat{c_i} = 2 * (k-1) + 0 * 1 = 2k - 2 $
2.3. Potential method
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 \rightarrow ℕ $
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}} $
Stim ca: $ \hat{c_i} = c_{i} + \Phi(D_k) - \Phi(D_{k-1}) $
Deci: $ \sum_{i=1}^{n}{\hat{c_i}} = \sum_{i=1}^{n}{c_i} + \Phi(D_n) - \Phi(D_0) $
Acem de ales $ \Phi $ asftel incat $ \Phi(D_0) \leq \Phi(D_n) $ .
$ \Phi(D_0) = 0 $ (mereu)
Daca in stiva avem $ m $ elemente, acestea au “potentialul” de a fi scoase ulterior cu k operatii $ pop $ sau $ mpop(m) $ :
$ \Phi(D) = m $
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_{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 $
3. Heap
TODO
ArrayList removal
TODO
Binary Counter
TODO