Tutaj poprzez analizę asymptotyczną zakładam, że mamy na myśli zachowanie algorytmu, gdy wielkość danych wejściowych przechodzi w nieskończoność.
Powodem, dla którego stosujemy analizę asymptotyczną jest to,
że jest ona przydatna w przewidywaniu zachowania algorytmów w praktyce . Prognozy pozwalają nam podejmować decyzje, np. Kiedy mamy różne algorytmy dla problemu, którego należy użyć? (Bycie użytecznym nie oznacza, że zawsze jest poprawne).
To samo pytanie można zadać na temat dowolnego uproszczonego modelu świata rzeczywistego. Dlaczego używamy uproszczonych modeli matematycznych realnego świata?
Pomyśl o fizyce. Klasyczna fizyka newtonowska nie jest tak dobra jak fizyka relatywistyczna w przewidywaniu świata rzeczywistego. Ale jest to wystarczająco dobry model do budowy samochodów, wieżowców, łodzi podwodnych, samolotów, mostów itp. Są przypadki, w których nie jest wystarczająco dobry, np. Jeśli chcemy zbudować satelitę lub wysłać sondę kosmiczną do Plutona lub przewidzieć ruch masywnych obiektów niebieskich, takich jak gwiazdy i planety, lub obiektów o bardzo dużej prędkości, takich jak elektrony.
Ważne jest, aby wiedzieć, jakie są granice modelu.
Zazwyczaj jest to wystarczająco dobre przybliżenie realnego świata.
W praktyce często widzimy, że algorytm z lepszą analizą asymptotyczną działa lepiej w praktyce. Rzadko zdarza się, że algorytm ma lepsze zachowanie asymptotyczne. Więc jeśli dane wejściowe mogą być wystarczająco duże, wówczas zazwyczaj możemy polegać na analizie asymptotycznej jako pierwszej prognozie zachowania algorytmów. Nie jest tak, jeśli wiemy, że nakłady będą niewielkie. W zależności od wymaganej wydajności możemy potrzebować dokładniejszej analizy, np. Jeśli mamy informacje o rozkładzie danych wejściowych, otrzymamy algorytm, możemy przeprowadzić dokładniejszą analizę, aby osiągnąć wyznaczone cele (np. Szybko na 99 % nakładów). Chodzi o to, że analiza asymptotyczna pierwszego kroku jest dobrym punktem wyjścia. W praktyce powinniśmy również przeprowadzać testy wydajności, ale należy pamiętać, że ma to również swoje własne problemy.
AAAma lepszą asymptotyczną złożoność. Które z nich nie są lepsze od innych we wszystkich danych wejściowych? To staje się trudniejsze i zależy od tego, na czym nam zależy. Czy zależy nam na dużych nakładach czy małych nakładach? Jeśli zależy nam na dużych nakładach, nie jest powszechne, że algorytm ma lepszą złożoność asymptotyczną, ale zachowuje się gorzej na dużych wejściach, na których nam zależy. Jeśli bardziej zależy nam na małych nakładach, analiza asymptotyczna może nie być tak przydatna. Powinniśmy porównać czas działania algorytmów na wejściach, na których nam zależy. W praktyce w przypadku skomplikowanych zadań o skomplikowanych wymaganiach analiza asymptotyczna może nie być tak przydatna. W przypadku prostych podstawowych problemów, które opisują podręczniki algorytmów, jest to całkiem przydatne.
Krótko mówiąc, złożoność asymptotyczna jest względnie łatwym do obliczenia przybliżeniem faktycznej złożoności algorytmów dla prostych podstawowych zadań (problemy w podręczniku algorytmów). Gdy budujemy bardziej skomplikowane programy, wymagania dotyczące wydajności zmieniają się i stają się bardziej skomplikowane, a analiza asymptotyczna może nie być tak przydatna.
Warto porównać analizę asymptotyczną z innymi podejściami do przewidywania wydajności algorytmów i ich porównywania. Jednym z powszechnych podejść są testy wydajności w odniesieniu do danych losowych lub danych porównawczych. Jest to powszechne, gdy obliczanie złożoności asymptotycznej jest trudne lub niewykonalne, np. Gdy używamy heurystyki, jak na przykład rozwiązywania SAT. Kolejny przypadek ma miejsce, gdy wymagania są bardziej skomplikowane, np. Gdy wydajność programu zależy od czynników zewnętrznych, a naszym celem może być posiadanie czegoś, co kończy się w pewnych ustalonych terminach (np. Pomyśl o aktualizacji interfejsu pokazanego użytkownikowi) na 99% wejścia.
Pamiętaj jednak, że analiza wydajności ma również swoje problemy. Nie zapewnia on matematycznych dotacji na wydajność, ponieważ w rzeczywistości uruchamiamy test wydajności na wszystkich danych wejściowych, które zostaną podane algorytmowi (często nie do obliczenia) (i często nie jest możliwe zdecydowanie, że niektóre dane wejściowe nigdy nie zostaną podane). Jeśli testujemy na przeciwko próbie losowej lub benchmarku jesteśmy niejawnie zakładając pewne prawidłowości
dotyczące wykonywania algorytmów, czyli algorytm wykona podobnie na innych środków, które nie były częścią testu wydajności.
Drugi problem z testami wydajności polega na tym, że zależą one od środowiska testowego. Tzn. Wydajność programu nie zależy od samych danych wejściowych, ale od czynników zewnętrznych (np. Typ maszyny, system operacyjny, wydajność kodowanego algorytmu, wykorzystanie procesora, czasy dostępu do pamięci itp.), Z których niektóre mogą się różnić w zależności od różnych przebiegów test na tej samej maszynie. Ponownie zakładamy, że określone środowiska, w których przeprowadzany jest test wydajności, są podobne do rzeczywistego środowiska, chyba że wykonujemy testy wydajności we wszystkich środowiskach, w których możemy uruchomić program (i jak możemy przewidzieć, na jakich komputerach ktoś może uruchomić sortowanie algorytm włączony za 10 lat?).
Θ(nlgn)Θ(n2)Θ(lgn)O(n)