В чем разница между O, Ω и Θ?

Я изучаю алгоритм анализа. У меня возникли проблемы с пониманием разницы между O, Ω и Θ.

Способ, которым они определены, выглядит следующим образом:

  • f(n) = O(g(n)) означает, что c · g(n) является верхняя граница на f(n). Таким образом, существует некоторая постоянная c такая, что f(n)всегда ≤ c · g(n), для достаточно больших n(т.е. n ≥ n0 для некоторой константы n0).
  • f(n) = Ω(g(n)) означает, что c · g(n) является нижняя граница на f(n). Таким образом, существует некоторая постоянная c такая, что f(n)всегда ≥ c · g(n), для всех n ≥ n0.
  • f(n) = Θ(g(n)) означает, что c1 · g(n) является верхней границей на f(n), а c2 · g(n) является нижняя граница на f(n), для всех n ≥ n0. Таким образом, существуют константы c1 и c2такой, что f(n) ≤ c1 ·g(n) и f(n) ≥ c2 ·g(n). Это означает, что g(n)обеспечивает хорошую, жесткую привязку к f(n).

Как я понял это:

  • O(f(n)) дает худшую сложность заданной функции/алгоритма.
  • Ω(f(n)) дает наилучшую степень сложности заданной функции/алгоритма.
  • Θ(f(n)) дает среднюю сложность случая заданной функции/алгоритма.

Пожалуйста, поправьте меня, если я ошибаюсь. Если это так, временная сложность каждого алгоритма должна быть выражена во всех трех обозначениях. Но я заметил, что он выражается либо O, Ω, либо Θ; почему не все три?

Ответ 1

Важно помнить, что обозначения, будь то O, Ω или Θ, выражают асимптотический рост функции; он не имеет ничего общего с алгоритмами как таковыми. Эта функция может быть "сложностью" (временем выполнения) алгоритма, либо наихудшим, либо наилучшим, либо средним, но нотация не зависит от того, откуда происходит функция.

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

  • O (n 2), также O (n 2 log n), O (n 3), O (n 4) и т.д., но не O (n).
  • Ω (n 2), это также Ω (n log n), Ω (n) и т.д., но не Ω (n 3).
  • Θ (п 2). Это даже не Θ (n 2 log n) или Θ (n 2/log n).

Теперь, как правило, рассматриваемая функция является наихудшей сложностью алгоритма, и какая нотация этих трех используется, зависит от того, что мы хотим сказать об этом, и от того, насколько тщательно мы проводим анализ. Например, мы можем заметить, что из-за наличия двух вложенных циклов наихудшее время работы не более O (n 2), не заботясь о том, действительно ли это достигается для некоторого ввода. (Обычно это очевидно.) Или, можно сказать, что наихудшее время работы сортировки - это Ω (n log n), потому что должны быть некоторые входы, для которых он должен принимать не менее cn (log n) шаги. Или мы можем взглянуть на конкретный алгоритм слияния и увидеть, что в худшем случае он занимает не более O (n log n) шагов, а некоторый вход заставляет его выполнять n log n шагов, поэтому наихудшее время работы Θ (n log n).

Обратите внимание, что во всех трех приведенных выше примерах все еще было то же самое (наихудшее) время выполнения, которое анализировалось. Вместо этого мы можем проанализировать случай наилучшего или среднего случая, но опять же, нотация трех, которые мы используем, зависит от того, что мы хотим сказать - хотим ли мы дать верхнюю границу, нижнюю границу или тугую границу порядка рост той же функции.

Ответ 2

Θ обозначает асимптотически плотную верхнюю и нижнюю границы.

O обозначает верхнюю границу, но эта оценка может быть или не быть плотной.
o обозначает верхнюю границу, которая не является плотной.

Ω обозначает нижнюю границу, но эта оценка может быть или не быть плотной.
ω обозначает нижнюю границу, которая не является плотной.

Ответ 4

Для чего означают эти три, см. Ответ Берка Гюдера.

Обратите также внимание, что они не имеют ничего общего с лучшим случаем, наихудшим случаем и средним случаем. Сортировка Bubble, например, является наилучшим случаем Θ (n) (поскольку, если данные уже отсортированы, необходимы только сравнения n-1), а Θ (n ^ 2) - наихудший случай. Он Θ (n ^ 2) средний случай, предполагающий случайный перетасованный ввод. Таким образом, средний случай также O (n ^ 2) и O (n ^ 3) и O (2 ^ n).

Итак, O, Θ и Ω сообщают вам, какая это связано. Они не говорят вам, что ограничение ограничено. В контексте это может быть предел в лучшем случае, худшем случае, среднем случае или алгоритме в целом (все случаи).

Конечно, если алгоритм имеет наилучший случай Ω (g), то он сам является Ω (g). Если в O (g) наихудший случай, то O (g). Так что там есть отношение. Но если у него есть средний случай (Θ (g), это почти ничего не говорит о лучших и худших случаях.

Что касается "почему не все три?".

Если ваша функция Θ (g), то она также O (g) и Ω (g). Таким образом, не так много точек, предоставляющих другие границы наряду с привязкой..

Когда вы видите одного из других в одиночку, это обычно потому, что мы заботимся только о верхней границе, или мы заботимся только о нижней границе. Таким образом, мы говорим, что все сортировочные сортировки обязательно являются Ω (n log n) наихудшим случаем, и что сортировка пузырьков является наихудшим случаем O (n ^ 2), но O (n), потому что мы не пытаемся полностью описать время сложность, мы просто выражаем границы, о которых мы заботимся в конкретном контексте.

И в любом случае большинство людей кажутся ленивыми и не хотят набирать греческие буквы. Я знаю, что знаю. Поэтому мы просто говорим, что сортировки сортировки "в лучшем случае O (n log n)". Это злоупотребление нотациями на самом деле, но это имеет смысл.

Ответ 5

Нотация Big-O часто упоминается как сложность алгоритма, поскольку она уверяет нас, что алгоритм не будет работать значительно хуже при больших n. Однако, как было справедливо отмечено ранее, Big-O дает нам асимптотическую оценку, и наш алгоритм может вести себя по-разному, когда задан некоторый вход. Например, быстрая сортировка может быть O (n ^ 2), когда массив уже отсортирован. OTOH, асимптотическая ситуация может быть улучшена на практике с опрятной реализацией.