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.
Increment
W 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.