Разница между примечаниями Big-O и Little-O

В чем разница между нотами Big-O O(n) и Маленькая-O нотация O(n)?

Ответ 1

f ∈ O (g) говорит, по существу,

Для по крайней мере одного выбора константы k > 0 вы можете найти константу a такую, что неравенство 0 <= f (x) <= kg (x) выполняется для всех х > а.

Заметим, что O (g) - множество всех функций, для которых выполняется это условие.

f ∈ o (g) говорит, по существу,

Для каждого выбора константы k > 0 вы можете найти константу a такую, что неравенство 0 <= f (x) < k g (x) выполняется для всех x > a.

Еще раз отметим, что o (g) - множество.

В Big-O необходимо только найти определенный множитель k, для которого выполняется неравенство за пределами некоторого минимума x.

В Little-o должно быть, что существует минимум x, после которого выполняется неравенство, независимо от того, насколько мало вы делаете k, если оно не отрицательно или равно нулю.

Оба они описывают верхние границы, хотя несколько контр-интуитивно, Little-o - более сильное утверждение. Существует гораздо больший разрыв между темпами роста f и g, если f ∈ o (g), чем если f ∈ O (g).

Одна из отличий заключается в следующем: f ∈ O (f) истинно, но f ∈ o (f) неверно. Поэтому Big-O можно считать "f ∈ O (g) означает, что f асимптотический рост не быстрее g", тогда как "f ∈ o (g) означает, что f асимптотический рост строго медленнее g". Это как <= по сравнению с <.

В частности, если значение g (x) является константой, кратной значению f (x), то f ∈ O (g) истинно. Вот почему вы можете сбросить константы при работе с нотами с большими выводами.

Однако, если f ∈ o (g) истинно, то g должна включать в свою форму более высокую степень x, и поэтому относительное разделение между f (x) и g (x) должно фактически увеличиваться по мере x становится больше.

Использовать чисто математические примеры (а не ссылаться на алгоритмы):

Для Big-O верны следующие значения, но это не так, если вы использовали little-o:

  • x ^ 2 ∈ O (x ^ 2)
  • x ^ 2 ∈ O (x ^ 2 + x)
  • x ^ 2 ∈ O (200 * x ^ 2)

Для little-o верно следующее:

  • x ^ 2 ∈ o (x ^ 3)
  • x ^ 2 ∈ o (x!)
  • ln (x) ∈ o (x)

Заметим, что если f ∈ o (g), то это означает, что f ∈ O (g). например x ^ 2 ∈ o (x ^ 3), то также верно, что x ^ 2 ∈ O (x ^ 3) (опять-таки, полагаем O как <= и o как <)

Ответ 2

Big-O - мало, а - <. Big-O является инклюзивной верхней границей, в то время как little-o является строгой верхней границей.

Например, функция f(n) = 3n:

  • в O(n^2), O(n^2) и O(n)
  • не в O(lg n), O(lg n), или O(n)

Аналогично, число 1 равно:

  • ≤ 2, < 2 и ≤ 1
  • not ≤ 0, < 0 или < 1

Вот таблица, показывающая общую идею:

Big o table

(Примечание: таблица является хорошим руководством, но ее определение предела должно быть в терминах верхнего предела вместо нормального предела. Например, 3 + (n mod 2) навсегда колеблется между 3 и 4. Он находится в O(1), несмотря на отсутствие нормального предела, поскольку он все еще имеет lim sup: 4.)

Я рекомендую запомнить, как нотация Big-O преобразуется в асимптотические сравнения. Сравнение легче запомнить, но менее гибко, потому что вы не можете сказать такие вещи, как n^O(1) = P.

Ответ 3

Я нахожу, что, когда я не могу концептуально понять что-то, подумав о том, зачем использовать X, полезно понять X. (Не сказать, что вы этого не пробовали, я просто настраиваю сцену.)

[материал, который вы знаете]. Обычный способ классификации алгоритмов - это время выполнения, и, ссылаясь на сложность алгоритма Big-Oh, вы можете получить довольно хорошую оценку, какая из них "лучше" - в зависимости от того, наименьшая "функция в O! Даже в реальном мире O (N) "лучше", чем O (N ^ 2), запрещая глупые вещи, такие как супермассивные константы и т.д. [/Материал, который вы знаете]

Скажем, есть алгоритм, который работает в O (N). Довольно хорошо, да? Но позвольте сказать, что вы (вы блестящий человек, вы) придумали алгоритм, который работает в O (N/loglogloglogN). УРА! Быстрее! Но вы будете глупо писать это снова и снова, когда будете писать свою диссертацию. Поэтому вы пишете его один раз, и вы можете сказать: "В этой статье я доказал, что алгоритм X, ранее вычислимый во времени O (N), на самом деле вычисляется в o (n)."

Таким образом, каждый знает, что ваш алгоритм быстрее - насколько он неясен, но он знает его быстрее. Теоретически.:)