Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
aa:lab:11 [2022/01/17 15:53] dmihai |
aa:lab:11 [2025/01/23 14:09] (current) dmihai |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Abstract Datatypes ====== | + | ===== Analiza amortizata ===== |
- | 1. Definiți constructori pentru un arbore binar ce poate conține ca elemente numere întregi. | + | Utilizați metoda agregării, metoda contabilizării și metoda potențialelor pentru a găsi costul amortizat în situațiile prezentate mai jos. |
- | 2. Definiți axiome pentru următorii operatori: | + | $ \DeclareMathOperator{\push}{push} \DeclareMathOperator{\pop}{pop} \DeclareMathOperator{\mpop}{mpop} \DeclareMathOperator{\key}{key} \DeclareMathOperator{\cost}{cost} $ |
- | * ''size : BTree → Integer'' (numărul total de valori din arbore) | + | === 1. Stack === |
- | * ''height : BTree → Integer'' (numărul de nivele al arborelui) | + | |
- | * ''mirror : BTree → BTree'' (arborele oglindit pe verticală, i.e. pentru orice nod, copilul stâng devine copilul drept și vice-versa) | + | |
- | * ''flatten : BTree → List'' (lista cu toate elementele din arbore; observați că există mai multe ordini posibile) | + | |
- | 3. Definiți constructori pentru o coadă (tip ''FIFO'') ce poate conține elemente de un tip arbitrar ''E''. | + | Presupunând că avem o implementare a unei stive care permite operațiile $ \pop - O(1) $, $ \push - O(1) $ si $ \mpop(k) - O(k) $, |
+ | demonstrați că pentru o secvență arbitrară $ S $ de $ n $ operatii, $ \cost(S) = O(n) $ | ||
+ | și că fiecare operație are un cost amortizat $ \cost(op) = O(1) $. | ||
- | 4. Definiți axiome pentru următorii operatori pe coadă: | + | **Exemplu:** $ \push, \pop, \push, \push, \push, \mpop(2), \push, \pop, \push $ |
- | * ''deque : FIFO → FIFO'' (coada fără primul element adăugat, i.e. cel mai vechi) | + | === 2. Heap === |
- | * ''top : FIFO → E'' (primul, cel mai vechi adăugat, element) | + | |
- | * ''length : FIFO → Integer'' (numărul de elemente din coadă) | + | |
- | 5. Definiți constructori pentru un ''Map'' cu chei de tip ''K'' și valori de tip ''V''. | + | Un max-heap este un arbore binar aproape complet - toate nivelurile, cu excepția ultimului, sunt complete, iar ultimul este completat de la stânga la dreapta. Fiecare două noduri AA și BB, unde BB este fiu al lui AA, satisfac relația: |
+ | $ \key(B) \leq \key(A) $ | ||
- | 6. Definiți axiome pentru următorii operatori pe ''Map'': | + | Un max-heap se poate stoca sub formă de array, unde $ a[i] $ are |
+ | copiii $ a[2i] $ si $ a[2i+1] $. | ||
- | * ''get : Map × K → V'' (elementul asociat cu o cheie dată) | + | Adăugarea unui element constă în următorii pași: |
- | * ''update : Map × K × V → Map'' (un Map cu o nouă asociere cheie:element) | + | - adaugă un element în prima poziție liberă de pe ultimul nivelele |
- | * ''exists : Map × K → Bool'' (verifică dacă cheia dată are o valoare asociată) | + | - compară elementul adăugat cu părintele și interschimbă-i dacă e cazul |
- | * ''delete : Map × K → Map'' (șterge cheia și valoarea asociată) | + | - repetă pasul anterior până nodul respectă proprietatea în raport cu părintele lui sau a devenit rădăcina |
+ | Arătați că fiecare inserare are un cost agregat de $ \cost(op) = O(\log n) $. | ||
+ | |||
+ | === 3. Binary Counter === | ||
+ | |||
+ | Presupunând că avem un contor binar implementat folosind o listă de \( k \) biți, acesta permite doar operația \( increment \), care adaugă \( 1 \) la contor. Această operație are complexitate temporală \( O(k) \) în cel mai rău caz. Arătați însă că operația are un cost amortizat constant. | ||
+ | |||
+ | <note> | ||
+ | Soluțiile acestui laborator se găsesc [[https://ocw.cs.pub.ro/ppcarte/doku.php?id=aa:lab:sol:11|aici]] | ||
+ | </note> | ||