Разница между обозначениями Big-O и Little-O
в чем разница между Big-O обозначение O(n)
и Маленький-O обозначение o(n)
?
3 ответов
f ∈ O (g) говорит, по существу
на по крайней мере один выбор константы k > 0, вы можете найти константу a такое, что неравенство 0 a.
обратите внимание, что O (g) - это набор всех функций, для которых выполняется это условие.
f ∈ o (g) говорит, по существу
на выбор константы k > 0, вы можете найти постоянную a такое, что неравенство 0 a.
еще раз обратите внимание, что o(g) - это набор.
в Big-O необходимо только найти конкретный множитель k для которого неравенство имеет место за пределами некоторого минимума x.
в Little-o, должно быть, есть минимум x после чего неравенство сохраняется независимо от того, насколько вы малы make k, пока он не отрицательный или нулевой.
они оба описывают верхние границы, хотя несколько контр-интуитивно, Little-o является более сильным утверждением. Существует гораздо больший разрыв между темпами роста f и g, если f ∈ o(g), чем если f ∈ O(g).
<= и<
.
более конкретно, если значение g(x) является постоянным кратным значению f(x), то F ∈ O (g) истинно. Вот почему вы можете бросить константы при работе с большой-о нотации.
однако, чтобы F ∈ o(g) было истинным, тогда g должен включать более высокий сила x в его формуле, и поэтому относительное разделение между f (x) и g (x) должно фактически получить больше, чем x становится больше.
использовать чисто математические примеры (а не ссылаться на алгоритмы):
следующее верно для Big-O, но не было бы верно, если бы вы использовали little-o:
- x2 ∈ O (x2)
- x2 ∈ O (x2 + x)
- x2 ∈ O (200 * x2)
для little-o верно следующее:
- x2 ∈ o (x3)
- x2 ∈ o(x!)
- ln (x) ∈ o (x)
обратите внимание, что если f ∈ o (g), это означает f ∈ O(g). например, x2 ∈ o(x3), поэтому также верно, что x2 ∈ O (x3), (опять же, подумайте о O как <=
и o as <
)
Big-O для little-o как ≤
Это <
. Big-O-инклюзивная верхняя граница, в то время как little-o-строгая верхняя граница.
например, функция f(n) = 3n
- это:
- на
O(n²)
,o(n²)
иO(n)
- не в
O(lg n)
,o(lg n)
илиo(n)
аналогично, количество 1
- это:
-
≤ 2
,< 2
и≤ 1
- не
≤ 0
,< 0
, или< 1
Вот таблица, показывающая общую идею:
(Примечание: таблица является хорошим руководством, но его определение предела должно быть в терминах верхнего предела вместо нормального предела. Например, 3 + (n mod 2)
колеблется между 3 и 4 навсегда. Это в O(1)
несмотря на отсутствие нормального предела, потому что она все еще имеет lim sup
: 4.)
Я рекомендую запоминать, как обозначение Big-O преобразуется в асимптотические сравнения. Сравнения легче запомнить, но менее гибкие, потому что вы не можете сказать такие вещи, как nO (1) = П.
Я нахожу, что когда я не могу концептуально понять что-то, думая о зачем использовать X полезно понять X. (Не сказать, что вы этого не пробовали, я просто устанавливаю сцену.)
[вещи вы знаете]общий способ классификации алгоритмов по времени выполнения, и, ссылаясь на большие-о сложности алгоритма, можно получить достаточно хорошую оценку, какой из них "лучше" -- в зависимости от того, имеет "маленький" функция в o! Даже в реальном мире O (N) "лучше", чем O(N2), за исключением глупых вещей, таких как сверхмассивные константы и тому подобное.[/вещи, которые вы знаете]
предположим, что есть некоторый алгоритм, который работает в O (N). Неплохо, да? Но предположим, вы (вы блестящий человек, вы) придумаете алгоритм, который работает в O (N⁄loglogloglogN). УРА! Быстрее! Но вы чувствовали бы себя глупо писать это снова и снова, когда вы пишете свою диссертацию. Итак, вы пишете это один раз, и вы можете сказать: "в этой статье я доказал этот алгоритм X, ранее вычисляемый во времени O(N), фактически вычисляется в o (n)."
таким образом, все знают, что ваш алгоритм быстрее --- на сколько неясно, но они знают его быстрее. Теоретически. :)