Maybaygiare.org

Blog Network

Analiza amortyzowana

Dynamic arrayEdit

amortyzowana analiza operacji push dla dynamicznej tablicy

rozważmy dynamiczną tablicę, która rośnie w rozmiarze ponieważ dodawane są do niego kolejne elementy, takie jak ArrayList w Javie lub std::vector w C++. Gdybyśmy zaczęli od dynamicznej tablicy wielkości 4, moglibyśmy na nią wcisnąć 4 elementy, a każda operacja zajęłaby stały czas. Jednak wciśnięcie piątego elementu na tę tablicę zajęłoby więcej czasu, ponieważ tablica musiałaby utworzyć nową tablicę o podwójnym rozmiarze (8), skopiować stare elementy do nowej tablicy, a następnie dodać nowy element. Kolejne trzy operacje push zajęłyby podobnie stały czas, a kolejne dodanie wymagałoby kolejnego powolnego podwojenia rozmiaru tablicy.

ogólnie, jeśli weźmiemy pod uwagę dowolną liczbę push n + 1 do tablicy o rozmiarze n, zauważymy, że operacje push zajmują stały czas, z wyjątkiem ostatniej, która zajmuje Θ ( n ) {\displaystyle \Theta (n)}

\Theta (n)

czas na wykonanie operacji podwojenia rozmiaru. Ponieważ było n + 1 operacji razem możemy wziąć średnią z tego i stwierdzić, że pchanie elementów na tablicę dynamiczną trwa: 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)}

, czas stały.

QueueEdit

pokazana jest implementacja kolejki w języku Ruby, struktura danych 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

operacja enqueue po prostu przesuwa element na tablicę wejściową; operacja ta nie zależy od długości wejścia ani wyjścia i dlatego działa w stałym czasie.

jednak operacja dequeue jest bardziej skomplikowana. Jeśli macierz wyjściowa zawiera już pewne elementy, to dequeue działa w stałym czasie; w przeciwnym razie, dequeue przyjmuje O (n) {\displaystyle O(n)}

O (N)

Czas dodania wszystkich elementów do macierzy wyjściowej z tablicy wejściowej, gdzie n jest bieżącą długością tablicy wejściowej. Po skopiowaniu n elementów z wejścia, możemy wykonać N operacji dequeue, z których każda zajmuje stały czas, zanim wyjściowa tablica będzie ponownie pusta. W ten sposób możemy wykonać sekwencję N operacji dequeue tylko w O ( n ) {\displaystyle O(N)}

O(N)

czasie, co oznacza, że zamortyzowanym czasem każdej operacji dequeue jest O ( 1 ) {\displaystyle O(1)}

O(1)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.