Maybaygiare.org

Blog Network

Analiza amortizată

matrice dinamică

analiza amortizată a operației de împingere pentru o matrice dinamică

luați în considerare o matrice dinamică care crește în dimensiune pe măsură ce i se adaugă mai multe elemente, cum ar fi ArrayList în Java sau std::vector în C++. Dacă am începe cu o matrice dinamică de dimensiunea 4, am putea împinge 4 elemente pe ea și fiecare operație ar dura un timp constant. Cu toate acestea, împingerea unui al cincilea element pe acea matrice ar dura mai mult, deoarece matricea ar trebui să creeze o nouă matrice de dublu dimensiunea curentă (8), să copieze elementele vechi pe noua matrice și apoi să adauge noul element. Următoarele trei operații de împingere ar dura în mod similar un timp constant, iar apoi adăugarea ulterioară ar necesita o altă dublare lentă a dimensiunii matricei.

în general, dacă luăm în considerare un număr arbitrar de împingeri n + 1 la o matrice de dimensiune n, observăm că operațiunile de împingere durează constant, cu excepția ultimei care ia timpul de dublare a mărimii ( n ) {\displaystyle \Theta (n)}

\Theta (n)

pentru a efectua operația de dublare a mărimii. Din moment ce au existat N + 1 Total operațiuni putem lua media acestui și pentru a găsi că împingând elemente pe matrice dinamică ia: N ( 1) + (N ) N + 1 = (1 ) {\displaystyle {\tfrac {n\Theta (1)+\Theta (n)}{N+1}}=\Theta (1)}

{\displaystyle {\tfrac {n\Theta (1)+\Theta (n)}{n+1}}=\Theta (1)}

, timp constant.

QueueEdit

prezentat este o implementare Ruby a unei cozi, o structură de date FIFO:

class Queue def initialize @input = @output = end def enqueue(element) @input << element end def dequeue if @output.empty? while @input.any? @output << @input.pop end end @output.pop endend

operațiunea enqueue împinge doar un element pe matricea de intrare; această operație nu depinde de lungimile de intrare sau de ieșire și, prin urmare, rulează în timp constant.

cu toate acestea, operațiunea dequeue este mai complicată. Dacă matricea de ieșire are deja unele elemente în ea, atunci dequeue rulează în timp constant; în caz contrar, dequeue ia O ( n ) {\displaystyle o(n)}

o(n)

timp pentru a adăuga toate elementele pe matricea de ieșire din matricea de intrare, unde n este lungimea curentă a matricei de intrare. După copierea n elemente de la intrare, putem efectua n operații dequeue, fiecare luând timp constant, înainte ca matricea de ieșire să fie din nou goală. Astfel, putem efectua o secvență de n operații dequeue numai în O ( n ) {\displaystyle o(n)}

o(n)

timp, ceea ce implică faptul că timpul amortizat al fiecărei operații dequeue este O ( 1 ) {\displaystyle o(1)}

O(1)

Lasă un răspuns

Adresa ta de email nu va fi publicată.