This is an old revision of the document!


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 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