2020-04-22
Koszt zamortyzowany (zamortyzowana złożoność obliczeniowa) operacji jest jej średnim kosztem w najgorszym przypadku.
Określa się górne ograniczenie na całkowitą złożoność obliczeniową (w pesymistycznym przypadku) ciągu badanych operacji. Koszt zamortyzowany każdej operacji rozumiemy wtedy przez .
Rozpatrując ciąg operacji, zawyżamy koszt operacji znajdujących się na początku ciągu. Nadpłaty te zostają potem zużyte na „zapłacenie” za operacje, których złożoność jest mniejsza niż faktycznie poniesione koszty.
Podobnie jak w metodzie księgowania, przypisujemy większy koszt wcześniejszym operacjom, aby skompensować późniejsze nadmierne wydatki. W metodzie potencjału „kredyt” jest reprezentowany jako „energia potencjalna” całej struktury danych i nie jest związana z pojedynczymi obiektami (jak to ma miejsce w metodzie księgowania).
Skupimy się na metodzie potencjału.
Będziemy rozpatrywali ciąg struktur , gdzie będzie strukturą danych powstałą ze struktury po wykonaniu -tej operacji.
Rozważmy funkcją potencjału przyporządkowującą każdej strukturze liczbę rzeczywistę nazywaną potencjałem struktury .
Dla każdego niech oznacza faktyczną złożoność obliczeniową -tej operacji, a oznacza koszt zamortyzowany dla -tej operacji i definiujemy go jako .
Zatem po prostych przekształceniach koszt zamortyzowany ciągu operacji wynosi: Zwykle dla wygody definiuje się . Jeśli jesteśmy w stanie pokazać, że dla każdego wówczas koszt zamortyzowany ciąg operacji (dla dowolnego ) ogranicza z góry koszt faktyczny ciąg operacji:
Koszt zamortyzowany zdefiniowany jak powyżej zależy od wybory funkcji potencjału . Używając różnych funkcji potencjału, można otrzymać różne koszty zamortyzowane i mimo wszystko otrzymać górne ograniczenie faktycznej złożoności obliczeniowej ciągu operacji.
IncrementW celu zilustrowania obliczania kosztu zamortyzowanego posłużymy się przykładem bitowego licznika binarnego, który zlicza od za pomocą operacji Increment. Licznik jest przetrzymywany w tablicy bitów długości . Najmniej znaczący bit występuje w , a najbardziej znaczący w , zatem jeśli licznik przechowuje liczbę to Licznik inicjalizujemy ustawiając bit w każdej komórce tablicy . Aby zwiększyć wartość licznika o (modulo ), używamy wcześniej wspomnianej procedury:
Increment(A):
i = 0
while i < k and A[i] == 1:
A[i] = 0
i++
if i < k:
A[i] = 1
Operacja ta dokonuje zmiany odpowiednich bitów (zaczynając od najmniej znaczących): i po natrafieniu na najmniej znaczący bit zerowy zamienia go na .
Koszt (złożoność obliczeniowa) każdej operacji Increment jest równy liczbie zmienionych bitów. Analizując złożoność obliczeniową pojedynczej operacji Increment w worst case scenario, widzimy, że asymptotycznie wynosi ona , bo w najgorszym przypadku w tablicy wszystkie bity będą ustawione na i będziemy musieli je wyzerować lub wszystkie bity poza najbardziej znaczącym zostaną one wyzerowane, a bit zostanie ustawiony na .
Zauważmy natomiast, że w innych przypadkach liczba modyfikowanych bitów będzie mniejsza, więc istnieje szansa, że da się ograniczyć pesymistyczną złożoność ciągu operacji Increment przez coś mniejszego niż .
Wykorzystajmy metodę potencjału do obliczenia kosztu zamortyzowanego operacji Increment.
Wybór funkcji potencjału: będzie liczbą jedynek w liczniku po -tej operacji.
Załóżmy, że -ta operacja Increment zeruje bitów. Faktyczny koszt tej operacji jest więc ograniczony przez , ponieważ oprócz zerowania bitów może ona przypisać wartość co najwyżej jednemu bitowi.
Z poprzedniego punktu możemy uzyskać ograniczenie na wyżej zdefiniowaną funkcję potencjału:
Stąd koszt zamortyzowany -tej operacji możemy wyliczyć w następujący sposób: Jeśli zaczynamy zliczać za pomocą licznika od zera, to .
Ponieważ dla każdego , to koszt zamortyzowany ciągu operacji Increment jest górnym ograniczeniem kosztu faktycznego, co daje pesymistyczny koszt ciągu operacji równy .
Za pomocą metody potencjału łatwo jest również dokonać analizy w przypadku gdy licznik nie startuje od .
Załóżmy, że początkowo było zer oraz po wykonaniu razy operacji Increment mamy jedynek., gdzie , wówczas: Mamy . Skoro oraz , całkowity koszt wykonania razy operacji Increment wynosi Należy zauważyć, że jeśli to co daje nam całkowity koszt równy .
Oznacza to tyle, że jeśli wykonamy przynajmniej razy operację Increment całkowity koszt zawsze będzie złożoności niezależnie od początkowego stanu licznika.