Prolog: Duża notacja jest klasycznym przykładem potęgi i niejednoznaczności niektórych notacji jako części języka kochanego przez ludzki umysł. Bez względu na to, jak wiele zamieszania to spowodowało, wybór zapisu stanowi przekazanie pomysłów, które możemy łatwo zidentyfikować i na które zgodzimy się skutecznie.O
Całkowicie rozumiem, co oznacza duża notacjaMój problem polega na tym, że mówimy , gdzie jest czasem działania algorytmu na wejściu wielkości .OT(n)=O(f(n))T(n)n
Przepraszamy, ale nie masz problemu, jeśli rozumiesz znaczenie dużej notacjiO
Rozumiem semantykę tego. Ale i to dwie różne rzeczy. jest dokładną liczbą, ale nie jest funkcją, która wyrzuca liczbę, więc technicznie nie możemy powiedzieć, że równa się , jeśli ktoś zapyta Ci co to jest wartość od , jaka byłaby twoja odpowiedź? Nie ma odpowiedzi.T(n)O(f(n))T(n)O(f(n))T(n) O ( f ( n ) ) O ( f ( n ) ) O(f(n))O(f(n))
Ważna jest semantyka . Ważne jest (jak) ludzie mogą łatwo zgodzić się na jedną z jej precyzyjnych interpretacji, które opisają asymptotyczne zachowanie lub złożoność czasu lub przestrzeni, którymi jesteśmy zainteresowani. Domyślna precyzyjna interpretacja / definicja , zgodnie z tłumaczeniem z Wikipedii ,T(n)=O(f(n))
T jest funkcją o wartości rzeczywistej lub zespolonej, a jest funkcją o wartościach rzeczywistych, obie zdefiniowane w pewnym nieograniczonym podzbiorze rzeczywistych liczb dodatnich, tak że jest ściśle dodatnie dla wszystkich wystarczająco dużych wartości . Dla wszystkich wystarczająco dużych wartości wartość bezwzględna jest co najwyżej dodatnią stałą wielokrotnością . Oznacza to, że istnieje dodatnia liczba rzeczywista i liczba rzeczywista taka, żeff(n)nnT(n)f(n)Mn0
for all n≥n0,|T(n)|≤Mf(n) for all n≥n0.
Uwaga: ta interpretacja jest uważana za definicję . Wszelkie inne interpretacje i zrozumienia, które mogą ci bardzo pomóc na różne sposoby, są wtórne i następcze. Wszyscy (cóż, przynajmniej każdy tutaj odpowiadający) zgadza się na tę interpretację / definicję / semantykę. Tak długo, jak możesz zastosować tę interpretację, prawdopodobnie jesteś dobry przez większość czasu. Zrelaksuj się i bądź wygodny. Nie chcesz za dużo myśleć, tak jak nie myślisz za dużo o nieregularności języka angielskiego, francuskiego lub większości języków naturalnych. Wystarczy użyć zapisu według tej definicji.
T(n)O ( f ( n ) ) T ( n ) O ( f ( n ) ) O ( f ( n ) ) jest dokładną liczbą, ale nie jest funkcją, która wyrzuca liczbę, więc technicznie nie możemy powiedzieć, że równa się , jeśli ktoś zapyta Ci co to jest wartość od , jaka byłaby twoja odpowiedź? Nie ma odpowiedzi.O(f(n))T(n) O(f(n))O(f(n))
Rzeczywiście, nie ma odpowiedzi, ponieważ pytanie jest źle postawione. nie oznacza dokładnej liczby. Ma oznaczać funkcję o nazwie i której parametrem formalnym jest (co jest w pewnym sensie ograniczone do in ). Jest to tak samo poprawne, a tym bardziej, jeśli napiszemy . Jeśli jest funkcją odwzorowującą do a jest funkcją odwzorowującą do , konwencjonalne jest również zapisywanie lubT(n)Tnnf(n)T=O(f)Tnn2fnn3f(n)=O(n3)n2=O(n3)O. Należy również pamiętać, że definicja nie mówi, że jest funkcją, czy nie. Nie mówi wcale, że lewa strona powinna być w ogóle równa prawej stronie! Masz rację, podejrzewając, że znak równości nie oznacza równości w jej zwykłym znaczeniu , w którym możesz zmienić obie strony równości i powinna być poparta równoważną relacją. (Innym jeszcze bardziej znanym przykładem nadużycia znaku równości jest użycie znaku równości w celu przypisania w większości języków programowania, zamiast bardziej kłopotliwego, jak w niektórych językach).O:=
Jeśli martwimy się tylko o tę jedną równość (również zaczynam nadużywać języka. To nie jest równość ; jednak jest to równość, ponieważ w zapisie znajduje się znak równości lub można ją interpretować jako pewien rodzaj równości ), , ta odpowiedź jest gotowa.T(n)=O(f(n))
Jednak pytanie faktycznie trwa. Co to znaczy, na przykład, ? Ta równość nie jest objęta powyższą definicją. Chcielibyśmy wprowadzić kolejną konwencję, konwencję zastępczą . Oto pełne oświadczenie o konwencji zastępczej, jak podano w Wikipedii .f(n)=3n+O(logn)
W bardziej skomplikowanym użyciu może występować w różnych miejscach równania, nawet kilka razy z każdej strony. Na przykład następujące są prawdziwe dla .O(⋯)n→∞
(n+1)2=n2+O(n)
(n+O(n1/2))(n+O(logn))2=n3+O(n5/2)
nO(1)=O(en)
Znaczenie takich instrukcji jest następujące: dla wszystkich funkcji, które spełniają każde po lewej stronie, są pewne funkcje spełniające każde po prawej stronie, takie jak podstawienie wszystkich tych funkcji do równania wyrównuje obie strony. Na przykład trzecie równanie powyżej oznacza: „Dla dowolnej funkcji istnieje funkcja taka, że . ”O(⋯)O(⋯)f(n)=O(1)g(n)=O(en)nf(n)=g(n)
Możesz tu sprawdzić inny przykład konwencji symbolu zastępczego w akcji.
Być może zauważyliście już, że nie użyłem teoretycznego wyjaśnienia dużej adnotacji. Wszystko, co zrobiłem, to po prostu pokazać, nawet bez wyjaśnienia teoretycznego, takiego jak „ jest zbiorem funkcji”, wciąż możemy w pełni i doskonale zrozumieć dużą adnotację. Jeśli uznasz, że to teoretyczne wyjaśnienie jest przydatne, idź dalej.OO(f(n))O
Możesz sprawdzić sekcję „notacja asymptotyczna” CLRS, aby uzyskać bardziej szczegółowy wzorzec analizy i użycia dla rodziny notacji dla zachowania asymptotycznego, takiego jak duże , , małe , małe , użycie wielu zmiennych i więcej. Wpis Wikipedia jest także całkiem dobre referencje.ΘΩoω
Wreszcie istnieje pewna niejednoznaczność / kontrowersje związane z dużą notacją z wieloma zmiennymi 1 i 2 . Możesz zastanowić się dwa razy, kiedy ich używasz.O