Notacja Big O jest jednostkowym środkiem pomiaru zmienności wydajności, a zatem jest nieprzepuszczalna dla względnych kosztów prymitywów obliczeniowych.
W skrócie:
notacja Big O jest jednostkowym, względnym rodzajem pomiaru (w przeciwieństwie do pomiaru bezwzględnego). Może mierzyć tylko zmienność wydajności, a nie wydajność absolutną, dla której stałe mają duże znaczenie. Zaletą jest to, że czyni to w dużej mierze niezależnym od implementacji, umożliwiając prostszą analizę, która może ignorować względne koszty operacji elementarnych, o ile koszty te mają dodatnią stałą górną i dolną granicę. Ale konsekwencją jest to, że stałe czynniki nie mają znaczenia . Mimo to, nawet pod kątem zamierzonego celu, asymptotyczna analiza złożoności może być kwestionowana na innych podstawach i należy ją rozpatrywać ostrożnie. Na przykład surowy rozmiar wejściowy może nie być właściwym parametrem do rozważenia.
Pierwsza uwaga jest taka, że twoje pytanie nie jest dokładnie określone. Kiedy zaniedbujesz stałą w , rzeczywiście następuje „trzykrotna zmiana”, ale obie zmieniają się w tym samym tempie i nie możesz twierdzić, że „[jedna] rzecz zmienia się 3 razy szybciej niż inna”.3 n33n
Dobrym powodem do zignorowania stałej w notacji Landau jest to, że nie mamy jednostki, na której można polegać. Kiedy ktoś twierdzi, że A mieszka dwa razy dalej od ciebie niż B, ma to znaczenie niezależnie od dowolnej jednostki. Możemy się z tym zgodzić, nawet jeśli mierzysz odległości w calach, a ja robię to w latach świetlnych. Ale bezwzględny pomiar odległości wymaga podania jednostek, a jego sformułowanie liczbowe zależy od wybranej jednostki.
Rzeczywisty czas potrzebny algorytmowi zależy od czasu wykonywania operacji elementarnych, który jest bardzo zależny od maszyny. Można policzyć liczbę operacji elementarnych, ale nie ma powodu, aby sądzić, że wszystkie zajmują ten sam czas, i zawsze można połączyć kilka operacji w jedną lub odwrotnie, rozłożyć operację na mniejsze, aby liczba operacji nie ma większego znaczenia, chyba że zgadzasz się na referencyjną maszynę wirtualną. Zaletą jest niezależność od odniesień.
Innym poglądem na korzyść tego podejścia jest to, że w analizie liczy się tylko liczba operacji elementarnych, o ile ich koszt ma górną granicę i dodatnią dolną granicę. Nie musisz się martwić o indywidualne koszty.
Jednak cena za tę korzyść polega na tym, że ocena kosztów obliczeń jest podawana z nieokreśloną jednostką, a czas obliczeń może na przykład być nanosekundą lub tysiącleciem - nawet nie próbujemy tego wiedzieć. Innymi słowy, współczynniki stałe są bez znaczenia, ponieważ zmiana jednostek jest nierozerwalnie związana ze zmianą współczynnika stałego i nie stosuje się jednostek odniesienia.
Jak zauważył Patrick87 , to wystarczy, aby zrozumieć, jak algorytm skaluje się w odniesieniu do wielkości wejściowej, ale nie da absolutnej miary wydajności, bez polegania na jednostce odniesienia. Odłączenie wspólnej referencyjnej maszyny abstrakcyjnej można zrobić, gdy rzeczywiście chce się porównać wydajność różnych algorytmów, ale trudniej jest upewnić się, że porównanie nie jest stronnicze ze względu na szczegóły realizacji. W asymptotycznej złożoności tego ryzyka unika się, ponieważ porównujesz algorytm z samym sobą.
W każdym razie tylko naiwny programista polegałby wyłącznie na asymptotycznej złożoności przy wyborze algorytmu. Istnieje wiele innych kryteriów, w tym niezliczona stała i faktyczny koszt operacji elementarnych. Ponadto złożoność najgorszego przypadku może być złym wskaźnikiem, ponieważ źródło złożoności najgorszego przypadku może występować rzadko, a na fragmentach danych wejściowych na tyle małe, że ma ograniczony wpływ. Na przykład ogólne parsery gramatyki przylegającej do drzewa mają teoretyczną złożoność i są całkiem użyteczne w praktyce. Najgorszym przypadkiem, jaki znam, jest
wnioskowanie o typie polimorficznym typu Damas-Hindley-MilnerO(n6)algorytm zastosowany dla ML, który ma wykładniczą najgorszą złożoność. Ale to nie przeszkadza użytkownikom ML ani nie zapobiega pisaniu bardzo dużych programów w ML. Liczy się coś więcej niż stała. W rzeczywistości analiza asymptotyczna wiąże miarę kosztu obliczeń z pewną miarą złożoności danych wejściowych. Ale surowy rozmiar może nie być właściwym miernikiem.
Złożoność jest jak rozstrzygalność, może być teoretycznie zła, ale może to nie mieć znaczenia dla większości przestrzeni danych ... czasami. Analiza asymptotycznej złożoności jest dobrym i dobrze zaprojektowanym narzędziem, z jego zaletami i ograniczeniami, jak wszystkie narzędzia. Z wyjaśnieniem stałej lub bez niej, co może być bez znaczenia, konieczne jest użycie osądu.