Jaka jest różnica między Big-O notacji O(n)
i Little-O notacji o(n)
?
Jaka jest różnica między Big-O notacji O(n)
i Little-O notacji o(n)
?
Odpowiedzi:
f ∈ O (g) mówi zasadniczo
Dla co najmniej jednego wyboru stałej k > 0, można znaleźć stałą takie, że nierówność 0 <= f (x) <= kg (x) zachodzi dla wszystkich x> a.
Zauważ, że O (g) jest zbiorem wszystkich funkcji, dla których ten warunek obowiązuje.
f ∈ o (g) mówi zasadniczo
Dla każdego wyboru stałej k > 0, można znaleźć stałą takie, że nierówność 0 <= f (x) <kg (x) zachodzi dla wszystkich x> a.
Jeszcze raz zauważ, że o (g) jest zbiorem.
W Big-O konieczne jest tylko znalezienie konkretnego mnożnika k, dla którego nierówność utrzymuje się powyżej pewnego minimum x .
W Little-o musi być tak, że istnieje minimum x, po którym nierówność się utrzymuje, bez względu na to, jak małe jest k , pod warunkiem, że nie jest ujemne ani zerowe.
Oba opisują górne granice, choć nieco sprzeczne z intuicją, Little-o jest silniejszym stwierdzeniem. Istnieje znacznie większa różnica między szybkościami wzrostu f i g, jeśli f ∈ o (g) niż jeśli f ∈ O (g).
Jedną z ilustrujących tę różnicę jest: f ∈ O (f) jest prawdą, ale f ∈ o (f) jest fałszem. Dlatego Big-O można odczytać jako „f ∈ O (g) oznacza, że asymptotyczny wzrost f nie jest szybszy niż g's”, podczas gdy „f ∈ o (g) oznacza, że asymptotyczny wzrost f jest ściśle wolniejszy niż g's”. To jak <=
kontra <
.
Mówiąc dokładniej, jeśli wartość g (x) jest stałą wielokrotnością wartości f (x), wówczas f ∈ O (g) jest prawdziwe. Dlatego możesz upuścić stałe podczas pracy z notacją big-O.
Jednak, aby f ∈ o (g) było prawdziwe, to g musi uwzględniać wyższą moc x we wzorze, a zatem względne oddzielenie między f (x) ig (x) musi faktycznie wzrosnąć, gdy x się powiększy.
Aby użyć przykładów czysto matematycznych (zamiast odwoływania się do algorytmów):
Poniższe są prawdziwe dla Big-O, ale nie byłyby prawdziwe, gdybyś użył little-o:
Następujące są prawdziwe dla little-o:
Zauważ, że jeśli f ∈ o (g), oznacza to f ∈ O (g). np. x² ∈ o (x³), więc prawdą jest również, że x² ∈ O (x³), (ponownie, myśl o O jako <=
i o jako <
)
a
jest k
, że: ...”, to jest „dla każdego k
istnieje a
, że: ...”
Big-O jest za mało-tak jak ≤
jest <
. Big-O jest włączającą górną granicą, podczas gdy little-o jest ścisłą górną granicą.
Na przykład funkcja f(n) = 3n
to:
O(n²)
, o(n²)
iO(n)
O(lg n)
, o(lg n)
lubo(n)
Analogicznie liczba 1
to:
≤ 2
, < 2
i≤ 1
≤ 0
, < 0
lub< 1
Oto tabela przedstawiająca ogólny pomysł:
(Uwaga: tabela jest dobrym przewodnikiem, ale jej definicja limitu powinna być wyrażona w kategoriach górnego limitu zamiast normalnego limitu. Na przykład 3 + (n mod 2)
oscyluje między 3 a 4. na zawsze. Jest w nim O(1)
pomimo tego, że nie ma normalnego limitu, ponieważ wciąż ma a lim sup
: 4.)
Polecam zapamiętanie, w jaki sposób notacja Big-O przekształca się w asymptotyczne porównania. Porównania są łatwiejsze do zapamiętania, ale mniej elastyczne, ponieważ nie można powiedzieć rzeczy takich jak n O (1) = P.
Uważam, że kiedy nie mogę pojęć koncepcyjnie, myślenie o tym, dlaczego ktoś użyłby X, pomaga zrozumieć X. (Nie mówiąc już, że tego nie próbowałeś, po prostu przygotowuję scenę).
. w O! Nawet w prawdziwym świecie O (N) jest „lepsze” niż O (N²), wykluczając głupie rzeczy, takie jak super-masywne stałe i tym podobne. [/ Rzeczy, które znasz]
Powiedzmy, że jest jakiś algorytm działający w O (N). Całkiem dobrze, co? Ale powiedzmy, że ty (ty błyskotliwa osoba) wymyślisz algorytm działający w O ( N ⁄ loglogloglogN ). TAK! Jest szybsze! Ale czułbyś się głupio, pisząc to w kółko, pisząc swoją tezę. Więc piszesz to raz i możesz powiedzieć: „W tym artykule udowodniłem, że algorytm X, wcześniej obliczalny w czasie O (N), w rzeczywistości jest obliczalny w o (n)”.
Zatem wszyscy wiedzą, że twój algorytm jest szybszy - o ile niejasny, ale wiedzą, że jest szybszy. Teoretycznie :)