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.
ArrayList - cazul generic
Fie capacitatea initiala = 1, ci = costul inserarii, cd = costul stergerii.
Stim ca:
- ci = 1 pentru cazul fara copiere
- ci + m cazul pentru copiere si inserare
- cd = 1 pentru cazul fara copiere
- cd + m pentru cazul stergerii si copierii
- nfinal = k - p numarul final de elemente (elemente inserare - elemente sterse)
- nroperatii = k + p
⇒ ĉi = Ctotal / (k + p) = (Cins + Cdel) / (k + p)
Am stabilit precedent ca:
- costul tuturor copierilor la inserare este de 2k
- costul tuturor inserarilor efective este k
- ⇒ Cins = 3k
De asemenea:
- costul tuturor copierilor la stergere este de p
- costul tuturor stergerilor efective este tot p
- ⇒ Cdel = 2p
⇒ ĉi = (3k + 2p) / (k + p)
Interpretare:
- pentru p = 0, avem ĉi = 3 (adevarat, asta este costul doar inserarilor)
- pentru k = 0 (presupunem ca avem deja un array), ĉi = 2 (adevarat, costul stergerii)
- pentru k = p, avem ĉi = 2.5
- ⇒ costul amortizat este mai apropiat de 3 pentru mai multe inserari, dar mai apropiat de 2 pentru mai multe stergeri.
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
ĉ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