Edit this page Backlinks This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ===== Exercitiul 1 ===== ==== Metoda Agregatelor ==== === ArrayList - inserare === Raspuns: ĉ<sub>i</sub> = 3 Explicatie: Incepem cu un array cu capacitate 1 si 0 elemente (vom nota cost insert = c<sub>i</sub>, copiere n elemente = cpy<sub>n</sub>. * insert1: c = c<sub>i</sub> = 1 * insert2: c = cpy<sub>1</sub> + c<sub>i</sub> = 2 * insert3: c = cpy<sub>2</sub> + c<sub>i</sub> = 3 * insert4: c = c<sub>i</sub> = 1 * insert5: c = cpy<sub>4</sub> + c<sub>i</sub> = 5 * insert6: c = c<sub>i</sub> = 1 * insert7: c = c<sub>i</sub> = 1 * insert8: c = c<sub>i</sub> = 1 * insert9: c = cpy<sub>8</sub> + c<sub>i</sub> = 9 Observam ca numarul de copieri este cpy<sub>1</sub> + cpy<sub>2</sub> + cpy<sub>4</sub> + cpy<sub>8</sub> + ... + cpy<sub>n</sub> = 2 * n (suma geometrica). (1) De asemenea, au avut loc n insert-uri, care au c = n. (2) Din (1) si (2) => ĉ<sub>i</sub> = T(n) / n = (2 * n + n) / n = 3. === ArrayList - stergere === Raspuns = ĉ<sub>i</sub> = 2. Presupunem cel mai rau caz: capacitate = 4 * n, nr. elemente = n + 1 (delete va cauza o copiere, deoarece la primul delete ajungem la 1/4 din capacitate) * delete1: cpy<sub>n/2</sub> + c<sub>delete</sub> = n/2 + 1 -> capacitatea devine 2 * n * delete2: c<sub>delete</sub> = 1 * delete3: c<sub>delete</sub> = 1 * ... * delete(n/2): cpy<sub>n/4</sub> + c<sub>delete</sub> = n/4 + 1 -> capacitatea devine n Observam ca numarul de copieri este cpy<sub>n/2</sub> + cpy<sub>n/4</sub> + cpy<sub>n/8</sub> + ... = n. (1) Numarul de stergeri efective este n. (2) Din (1) si (2) => ĉ<sub>i</sub> = T(n) / n = (n + n) / n = 2. ==== Metoda bancherului ==== (pentru insertion: 3 bani -> 1 inserare, 1 banut atribuit inseratiei curente, 1 banut atribuit altei inseratii din bucata copiata precedent) Idee de rezolvare: impartim array-ul in 2 bucati, bucata care se va copia la resize iar bucata care se va sterge fara impact. Cand facem o stergere, avem cost 1 pentru stergerea efectiva, dar atribuim un banut unui element (care nu se va sterge) pentru copierea sa ulterioara. Astfel, la timpul unui resize, vom avea banutii exacti necesari pentru copiere. ==== Metoda potentialelor ==== ĉ<sub>i</sub> = c<sub>i</sub> + Φ(D<sub>i</sub>) - Φ(D<sub>i-1</sub>). Definim n = elemente curente, m = capacitate: Fie Φ(n,m) = 2n - m, daca n >= m/2 = m/2 - n, altfel 1. Cazul stergerii in cazul in care capacitatea nu se schimba: * c<sub>i</sub> = 1 * ΔΦ = Φ(n - 1, m) - Φ(n, m): * caz 1, n >= 2m: ΔΦ = 2n - 2 - m - 2n + m = -2 => ĉ<sub>i</sub> = -1 * caz 2, n < m: ΔΦ = m/2 - n - (m/2 - n - 1) = 1 => ĉ<sub>i</sub> = 2 Aflam ca pentru un load factor de peste 1/2 (suntem aproape de capacitatea maxima) avem cost amortizat -1, iar 2 daca ne apropiem de injumatatire. 2. Cazul stergerii in care capacitatea se schimba: * Perechea (n, m) este de fapt (n + 1, 4 * n) -> (n, 2 * n) * ΔΦ = Φ(n, 2 * n) - Φ(n + 1, 4 * n) = (2 * n - 2 * n) - (4 * n / 2 - n - 1) = 1 - n * c<sub>i</sub> = 1 + n (deletion + copiere) * ĉ<sub>i</sub> = 1 + n + (1 - n) = 2