This is an old revision of the document!
Exercitiul 1
Metoda Agregatelor
ArrayList - inserare
Raspuns: ĉi = 3
Explicatie: Incepem cu un array cu capacitate 1 si 0 elemente (vom nota cost insert = ci, copiere n elemente = cpyn.
- insert1: c = ci = 1
- insert2: c = cpy1 + ci = 2
- insert3: c = cpy2 + ci = 3
- insert4: c = ci = 1
- insert5: c = cpy4 + ci = 5
- insert6: c = ci = 1
- insert7: c = ci = 1
- insert8: c = ci = 1
- insert9: c = cpy8 + ci = 9
Observam ca numarul de copieri este cpy1 + cpy2 + cpy4 + cpy8 + … + cpyn = 2 * n (suma geometrica). (1)
De asemenea, au avut loc n insert-uri, care au c = n. (2)
Din (1) si (2) ⇒ ĉi = T(n) / n = (2 * n + n) / n = 3.
ArrayList - stergere
Raspuns = ĉi = 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: cpyn/2 + cdelete = n/2 + 1 → capacitatea devine 2 * n
- delete2: cdelete = 1
- delete3: cdelete = 1
- …
- delete(n/2): cpyn/4 + cdelete = n/4 + 1 → capacitatea devine n
Observam ca numarul de copieri este cpyn/2 + cpyn/4 + cpyn/8 + … = n. (1)
Numarul de stergeri efective este n. (2)
Din (1) si (2) ⇒ ĉi = 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 pentru copiere ulterioara. Astfel, la timpul unui resize, vom avea banutii exacti necesari pentru copiere.
Metoda potentialelor
ĉi = ci + Φ(Di) - Φ(Di-1).
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:
- ci = 1
- ΔΦ = Φ(n - 1, m) - Φ(n, m):
- caz 1, n >= 2m: ΔΦ = 2n - 2 - m - 2n + m = -2 ⇒ ĉi = -1
- caz 2, n < m: ΔΦ = m/2 - n - (m/2 - n - 1) = 1 ⇒ ĉi = 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
- ci = 1 + n (deletion + copiere)
- ĉi = 1 + n + (1 - n) = 2