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