70 likes | 242 Views
Analiza kosztu zamortyzowanego. Koszt zamortyzowany operacji - średni koszt pojedynczej operacji w najgorszym przypadku: jeśli dla każdego n pesymistyczny czas wykonania ciągu n operacji można ograniczyć przez T(n) , koszt zamortyzowany pojedynczej operacji wynosi T(n)/n .
E N D
Analiza kosztu zamortyzowanego Koszt zamortyzowany operacji - średni koszt pojedynczej operacji w najgorszym przypadku: jeśli dla każdego n pesymistyczny czas wykonania ciągu n operacji można ograniczyć przez T(n), koszt zamortyzowany pojedynczej operacji wynosi T(n)/n. Koszt zamortyzowany może okazać się znacznie mniejszy niż pesymistyczny czas działania jednej operacji. Analiza zamortyzowanego kosztu algorytmów służy do szacowania kosztu algorytmów, w których następują ciągi podobnych operacji.
Operacje na stosie PUSH(S, x) - włożenie elementu x na stos S, O(1) POP(S) - zdjęcie elementu ze stosu S,O(1) STACK-EMPTY(S) - daje w wyniku TRUE, jeśli stos jest pusty MULTIPOP(S, k) - usuwa k elementów ze stosu S lub opróżnia go, jeśli na stosie było mniej niż k elementów; min(s,k) MULTIPOP (S, k) 1 while not STACK-EMPTY(S) i k 0 2 do POP(S) 3 k := k - 1 Przeanalizujemy ciąg n operacji PUSH, POP i MULTIPOP na początkowo pustym stosie.
Analiza operacji na stosie Zwykłe podejście: Rozmiar stosu nie może przekroczyć n, więc pesymistuczny czas działania operacji MULTIPOP można ograniczyć przez O(n). Wtedy pesymistyczny koszt n operacji jest O(n2). To oszacowanie górne jest poprawne, ale można uzyskać dokładniejsze. Analiza kosztu zamortyzowanego: Każdy obiekt, po włożeniu na stos, może być zdjęty co najwyżej jeden raz. Stąd liczba wywołań POP, włączając w to wywołania wewnątrz operacji MULTIPOP, nie może być większa niż liczba operacji PUSH, która nie jest większa niż n. Dlatego dla dowolnego n łączny czas wykonania każdego ciągu n operacji PUSH, POP i MULTIPOP na początkowo pustym stosie wynosi co najwyżej O(n). Koszt zamortyzowany operacji jest równy O(n)/n = O(1)
Licznik binarny K-bitowy licznik binarny, który może przyjmować nieujemne wartości całkowite, jest reprezentowany przez tablicę bitów A[0 .. k-1], gdzie length[A] = k. Wartość Koszt INCREMENT (A) 0 0 0 0 0 1 i := 0 1 0 0 1 1 2 whilei <length[A] i A[i] = 1 2 0 1 0 3 3 do A[i] := 0 3 0 1 1 4 4 i := i + 1 4 1 0 0 7 5 ifi < length[A] 5 1 0 1 8 6 thenA[i] := 1 6 1 1 0 10 7 1 1 1 11 Przeanalizujemy ciąg n operacji INCREMENT na liczniku.
Analiza operacji INCREMENT Zwykłe podejście: Pojedyncze wykonanie procedury INCREMENT może trwać (k) w pesymistycznym przypadku (kiedy w A są samie jedynki), więc czas działania n takich operacji można ograniczyć przez O(nk). Analiza kosztu zamortyzowanego: Nie wszystkie bity są modyfikowane przy każdym wywołaniu procedury. Bit A[0] jest modyfikowany przy każdym wywołaniu procedury INCREMENT; bit A[1] - w co drugim wywołaniu, A[2] - w co czwartym i t.d. Dla i = lgn bit A[i] ulega modyfikacji n/2i razy w ciągu n operacji. Dla i > lgn bit A[i] nigdy nie jest modyfikowany. Liczba modyfikacji bitów wynosi: Czas wykonania n operacji - O(n) Zamortyzowany koszt każdej - O(1)
Powiększanie tablicy TABLE-INSERT(T, x) 1 ifsize[T] = 0 2 then przydziel 1 komórkę dla table[T] 3 size[T] := 1 4 ifnum[T] = size[T] 5 then przydziel 2size[T] komórek dla new_table 6 wstaw wszystkie elementy z table[T] do new_table 7 zwolnij table[T] 8 table[T] := new_table 9 size[T] := 2size[T] 10 wstaw x do table[T] 11 num[T] := num[T] + 1
Analiza powiększania tablicy Niech n operacji TABLE-INSERT wykonuje się na początkowo pustej tablicy. Koszt i-j operacji wynosi: jeśli i-1 jest całkowitą potęgą 2 w przeciwnym razie Całkowity koszt n-j operacji wynosi: Koszt zamortyzowany każdej operacji jest ograniczony przez 3