Co to jest amortyzowana analiza algorytmów? [Zamknięte]

85

Czym różni się od analizy asymptotycznej? Kiedy go używasz i dlaczego?

Przeczytałem kilka artykułów, które wydają się być dobrze napisane, na przykład te:

ale nadal nie rozumiem w pełni tych pojęć.

Czy ktoś może mi to uprościć?

GrowinMan
źródło
5
Prawdopodobnie należy do programmers.stackexchange.com
lanzz
2
@lanzz Może teraz należałoby do cs.stackexchange.com
nbro
Świetny wątek na temat znaczenia stałego amortyzowanego czasu .
RBT

Odpowiedzi:

87

Analiza amortyzowana nie mnoży naiwnie liczby wywołań z najgorszym przypadkiem dla jednego wywołania.

Na przykład w przypadku tablicy dynamicznej, której rozmiar podwaja się w razie potrzeby, normalna analiza asymptotyczna wykazałaby tylko, że dodanie do niej elementu kosztuje O (n), ponieważ może być konieczne powiększenie i skopiowanie wszystkich elementów do nowej tablicy. Analiza zamortyzowana bierze pod uwagę, że aby musieć rosnąć, n / 2 pozycji musiało zostać dodanych bez powodowania wzrostu od poprzedniego wzrostu, więc dodanie pozycji zajmuje tak naprawdę tylko O ​​(1) (koszt O (n) wynosi amortyzowane ponad n / 2 działań).

Analiza amortyzowana to nie to samo, co „średnia wydajność” - analiza zamortyzowana daje twardą gwarancję tego, co się stanie, jeśli wykonasz tyle działań.

harold
źródło
1
„Analiza amortyzowana bierze pod uwagę, że aby musieć rosnąć, n / 2 pozycji musiało zostać dodanych bez powodowania wzrostu od poprzedniego wzrostu, więc dodanie pozycji zajmuje naprawdę tylko O ​​(1) (koszt O (n) amortyzuje się od n / 2 działań). " To było dość zagmatwane i niejasne.
AleksandrH
@AleksandrH jakaś konkretna część tego?
harold
Tak, trudno jest podążać za matematyką bez wyjaśnienia, skąd pochodzą liczby
AleksandrH
44

Jest wiele odpowiedzi na pytanie „co”, ale nie ma żadnej na pytanie „dlaczego”.

Jak wszyscy powiedzieli, analiza asymptotyczna dotyczy tego, jak wydajność danej operacji skaluje się do dużego zbioru danych. Analiza amortyzowana dotyczy tego, jak skaluje się średnia wyników wszystkich operacji na dużym zestawie danych. Analiza amortyzowana nigdy nie daje gorszych granic niż asymptotyczne, a czasami daje znacznie lepsze.

Jeśli obawiasz się całkowitego czasu pracy dłuższej pracy, prawdopodobnie zależy Ci na lepszych granicach amortyzowanej analizy. Dlatego języki skryptowe (na przykład) często chętnie powiększają tablice i tablice mieszające o jakiś czynnik, mimo że jest to kosztowna operacja. (Uprawa może być O(n)operacją, ale amortyzowana jest O(1)dlatego, że robisz to rzadko).

Jeśli programujesz w czasie rzeczywistym (poszczególne operacje muszą zostać zakończone w przewidywalnym czasie), wtedy lepsze granice amortyzowanej analizy nie mają znaczenia. Nie ma znaczenia, czy operacja była średnio szybka, czy nie udało się jej zakończyć na czas, aby wrócić i wyregulować piłę taśmową, zanim przecięła za daleko ...

To, co ma znaczenie w twoim przypadku, zależy dokładnie od tego, jaki jest twój problem programistyczny.

btilly
źródło
1
„Wzrost może być operacją O (n), ale amortyzacja wynosi O (1), ponieważ robisz to rzadko”. Myślę, że to stwierdzenie naprawdę wymaga ścisłego dowodu matematycznego.
nbro
„Jeśli programujesz w czasie rzeczywistym…”, powinieneś być bardziej precyzyjny i dokładnie wyjaśnić, dlaczego ten akapit należy traktować jako „prawdziwy”.
nbro
1
@nbro Jak myślisz, dlaczego „należy”? Pytanie dotyczy tego, jak amortyzowana analiza różni się od asymptotycznej i kiedy chcesz użyć każdej z nich. Zawiera linki do artykułów wyjaśniających, jak to zrobić. Zatem analiza matematyczna wydaje się zbędna. Jeśli chodzi o programowanie czasu rzeczywistego, ja nie wyjaśnić. Programowanie w czasie rzeczywistym to programowanie, w którym poszczególne operacje muszą zakończyć się w przewidywalnym czasie. Typowym przykładem jest programowanie wbudowane, w którym trzeba coś monitorować w regularnych odstępach czasu. Takich jak sterowanie maszynami. W tym przypadku sporadyczne powolne operacje są niedopuszczalne.
btilly
26

Analiza asymptotyczna

Termin ten odnosi się do analizy wydajności algorytmu przy założeniu, że dane, na których działa algorytm (dane wejściowe ), są, mówiąc laikiem, „na tyle duże, że powiększenie ich nie zmieni wniosku”. Chociaż dokładna wielkość wkładu nie musi być określona (musimy tylko górną granicę), dane postawiła sobie ma zostać określona.

Zwróć uwagę, że do tej pory rozmawialiśmy tylko o metodzie analizy; nie sprecyzowaliśmy, jaką dokładnie wielkość analizujemy (złożoność czasowa? złożoność przestrzeni?), ani nie określiliśmy, która miara nas interesuje (najgorszy przypadek? najlepszy przypadek? średnia?).

W praktyce termin analiza asymptotyczna powszechnie odnosi się do górnej granicy złożoności czasowej algorytmu, tj. Wydajności w najgorszym przypadku mierzonej całkowitym czasem wykonywania, który jest reprezentowany przez notację duże-Oh (np. Algorytm sortowania O(nlogn)).

Analiza zamortyzowana

Termin ten odnosi się do analizy wydajności algorytmu opartej na określonej sekwencji operacji, która jest ukierunkowana na najgorszy scenariusz - to znaczy, zamortyzowana analiza oznacza, że ​​metryka jest wydajnością w najgorszym przypadku (chociaż nadal nie mówi, która wielkość jest mierzona ). Aby wykonać tę analizę, musimy określić rozmiar danych wejściowych, ale nie musimy przyjmować żadnych założeń co do jego formy.

Mówiąc prościej, zamortyzowana analiza polega na wybieraniu dowolnego rozmiaru danych wejściowych, a następnie „przegrywaniu” algorytmu. Zawsze, gdy trzeba podjąć decyzję zależną od wkładu, obrana jest najgorsza ścieżka¹. Po zakończeniu działania algorytmu dzielimy obliczoną złożoność przez rozmiar danych wejściowych, aby otrzymać ostateczny wynik.

¹ Uwaga: Dokładniej mówiąc, najgorsza ścieżka, jaka jest teoretycznie możliwa . Jeśli masz wektor, który dynamicznie podwaja swój rozmiar za każdym razem, gdy jego pojemność się wyczerpie, „najgorszy przypadek” nie oznacza, że ​​będzie on musiał podwoić się po każdym wstawieniu, ponieważ wstawienia są przetwarzane jako sekwencja. Możemy (a nawet musimy) używać znanego stanu, aby matematycznie wyeliminować jak najwięcej „jeszcze gorszych” przypadków, nawet jeśli dane wejściowe pozostają nieznane.

Najważniejsza różnica

Krytyczna różnica między analizą asymptotyczną i amortyzowaną polega na tym, że pierwsza jest zależna od samego wejścia, podczas gdy druga jest zależna od sekwencji operacji, które wykona algorytm.

W związku z tym:

  • Analiza asymptotyczna pozwala stwierdzić, że złożoność algorytmu, gdy otrzyma najlepsze / najgorsze / średnie dane wejściowe o wielkości zbliżającej się do N, jest ograniczona przez jakąś funkcję F (N) - gdzie N jest zmienną
  • analiza zamortyzowana pozwala stwierdzić, że złożoność algorytmu, gdy otrzyma dane wejściowe o nieznanej charakterystyce, ale znanej wielkości N, nie jest gorsza niż wartość funkcji F (N) - gdzie N jest znaną wartością
Jon
źródło
7
Powyższa odpowiedź pokazuje, dlaczego ludzie nie powinni ślepo głosować za długimi odpowiedziami wysoko ocenianych osób.
btilly,
2
@btilly: Twoja opinia byłaby o wiele bardziej przydatna, gdyby była praktyczna - to znaczy, czy możesz mi powiedzieć, co dokładnie jest nie tak z tą odpowiedzią i jak ją poprawić?
Jon
7
gdzie zacząć? Źle zdefiniowałeś oba terminy i podałeś wiele wyjaśniających szczegółów, które również były błędne. Dla przypadkowego przykładu amortyzowana analiza nie zawsze jest najgorszym przypadkiem. W przeciwnym razie nie moglibyśmy powiedzieć, że amortyzowana wydajność wstawiania do wartości skrótu o dynamicznie zmienianym rozmiarze wynosi O(1).
btilly
@btilly CLRS strona 451 mówi: „... zamortyzowana analiza gwarantuje średnią wydajność każdej operacji w najgorszym przypadku”.
Glen Selle,
1
@GlenSelle Amortized analysis to technika matematyczna. Może być używany do różnych celów, w tym wydajności w najgorszym przypadku. Jednak nie musi to być najgorszy przypadek. W twoim przypadku najwyraźniej został użyty w najgorszym przypadku. W przypadku haszowania tak nie było.
btilly
14

Odpowiedź na to zwięźle definiuje pierwsze zdanie rozdziału Analiza zamortyzowana w książce - Wprowadzenie do algorytmów:

W analizie amortyzowanej czas wymagany do wykonania sekwencji operacji na strukturze danych jest uśredniany ze wszystkich wykonanych operacji.

Przedstawiamy złożoność rozwoju programu za pomocą analizy asymptotycznej - która polega na ograniczaniu wzrostu programu przez funkcję i określaniu najgorszego, najlepszego lub przeciętnego przypadku.

Ale może to być mylące w przypadkach, gdy istnieje tylko jeden przypadek, w którym złożoność programu osiąga szczyt, ale ogólnie program nie wymaga wielu obliczeń.

Dlatego bardziej sensowne jest uśrednianie kosztu w ramach sekwencji operacji, nawet jeśli pojedyncza operacja może być kosztowna. To jest analiza zamortyzowana!

Analiza zamortyzowana jest alternatywą dla techniki asymptotycznej używanej do obliczania złożoności. Pomaga nam obliczyć bardziej prawdziwą złożoność pod względem praktycznym, aby porównać i wybrać między dwoma lub więcej algorytmami.

Kunal Vyas
źródło
5

Najlepsze odniesienie, jakie do tej pory znalazłem, aby zrozumieć zamortyzowaną analizę algorytmów, znajduje się w książce Wprowadzenie do algorytmów , wydanie trzecie, rozdział 17: „Analiza zamortyzowana”. To wszystko jest tam, wyjaśnione znacznie lepiej niż to, co można znaleźć w poście Stack Overflow. Książkę znajdziesz w bibliotece każdego porządnego uniwersytetu.

Óscar López
źródło
Tak. Czytanie o algorytmie amortyzacji ze wspomnianej książki było lepsze i wreszcie dało jasność.
Rajesh Mappu
2

Regularna analiza asymptotyczna patrzy na wykonanie pojedynczej operacji asymptotycznie, jako funkcję rozmiaru problemu. Notacja O () jest tym, co wskazuje na analizę asymptotyczną.

Analiza zamortyzowana (która jest również analizą asymptotyczną) sprawdza całkowitą wydajność wielu operacji na współużytkowanej strukturze danych .

Różnica polega na tym, że zamortyzowana analiza zwykle dowodzi, że całkowite obliczenia wymagane dla operacji M mają lepszą gwarancję wydajności niż M razy najgorszy przypadek dla pojedynczej operacji.

Na przykład pojedyncza operacja na drzewie typu splay o rozmiarze N może zająć do O (N) czasu. Jednak sekwencja M operacji na drzewie o rozmiarze N jest ograniczona przez O (M (1 + log N) + N log N) czas, który w przybliżeniu wynosi O (log N) na operację. Należy jednak zauważyć, że analiza zamortyzowana jest znacznie bardziej rygorystyczna niż analiza „przeciętnego przypadku”: dowodzi, że każda możliwa sekwencja operacji spełni asymptotyczny najgorszy przypadek.

nadchodząca burza
źródło
1

Analiza zamortyzowana dotyczy całkowitego kosztu w wielu przebiegach procedury i korzyści, jakie można z tego uzyskać. Na przykład wyszukiwanie nieposortowanej tablicy n elementów dla pojedynczego dopasowania może wymagać do n porównań, a zatem jest o (n) złożoności. Jeśli jednak wiemy, że ta sama tablica będzie przeszukiwana pod kątem m pozycji, powtórzenie całego zadania miałoby wówczas złożoność O (m * n). Jeśli jednak posortujemy tablicę z wyprzedzeniem, koszt wyniesie O (n log (n)), a kolejne wyszukiwania zajmą tylko O ​​(log (n)) dla posortowanej tablicy. Zatem całkowity zamortyzowany koszt dla m elementów przy tym podejściu wynosi O (n * log (n) + m * log (n)). Jeśli m> = n, to równa się O (n log (n)) przez sortowanie wstępne w porównaniu z O (n ^ 2) w przypadku braku sortowania. Dzięki temu zamortyzowany koszt jest tańszy.

Krótko mówiąc, wydając trochę więcej na początku, możemy dużo zaoszczędzić później.

SmacL
źródło