Разница между нотациями Big-Theta и Big O на простом языке

Пытаясь понять разницу между нотациями Theta и O, я наткнулся на следующее утверждение:

The Theta-notation asymptotically bounds a function from above and below. When
we have only an asymptotic upper bound, we use O-notation.

Но я этого не понимаю. Книга объясняет это математически, но она слишком сложна и становится очень скучной для чтения, когда я действительно ничего не понимаю.

Может ли кто-нибудь объяснить разницу между ними, используя простые, но убедительные примеры.


person Suhail Gupta    schedule 27.08.2012    source источник
comment
@Ash Burlaczenko Как я уже говорил, я нахожу это скучным, потому что не понимаю этого. Думаю, это очевидно!   -  person Suhail Gupta    schedule 27.08.2012
comment
@Suhail, ваш символ не отображается в моем браузере. Отредактировано   -  person UmNyobe    schedule 27.08.2012
comment
Другой пример — сортировка вставками и сортировка выбором. Они оба O (n ^ 2) в худшем случае, но в лучшем случае сортировка вставками выполняется за O (n), а сортировка выбором — O (n ^ 2) для всех случаев. Мы скажем, что сортировка вставками — это O (n ^ 2), а сортировка выбором — Theta (n ^ 2) (нижняя граница = верхняя граница).   -  person nhahtdh    schedule 27.08.2012
comment
@nhahtdh: Ваш пример вводит в заблуждение. лучший случай и худший случай не имеют ничего общего с большой нотацией O/Theta. Это (большие O/Theta) математические наборы, включающие функции. Алгоритм не называется Theta(f(n)), если наихудший случай и наилучший случай идентичны, мы говорим, что это Theta(f(n)) наихудший случай (например), если наихудший случай одновременно O(f(n)) и Omega(f(n)), независимо от поведение в лучшем случае.   -  person amit    schedule 27.08.2012
comment
@amit: это не имеет ничего общего с обозначениями, но имеет какое-то отношение к тому, как люди определяют сложность. Моя точка зрения такова: верхняя и нижняя границы сортировки выбором одинаковы (она не обращает внимания на ввод), поэтому мы можем сказать, что алгоритм имеет сложность Theta (n ^ 2), в то время как мы можем только сказать, что алгоритм сортировки вставками равен O(n^2), так как он всегда ограничен сверху квадратичной функцией.   -  person nhahtdh    schedule 27.08.2012
comment
@nhahtdh: это неправильно. Наихудший случай сортировки вставками — Theta(n^2), так как вы можете указать нижнюю границу того, сколько операций потребуется для наихудшего случая ввода (массив с обратным порядком), и он будет квадратичным по количеству элементы. Нет смысла говорить о сложности алгоритма, не указывая, по какому анализу он рассчитывается. Обычно, когда анализ опускается - это неявно означает, что сложность вычисляется при анализе наихудшего случая. Если мы используем это соглашение, сортировка вставками будет Theta(n^2) [в этом утверждении подразумевается анализ наихудшего случая].   -  person amit    schedule 27.08.2012
comment
@nhahtdh: я не понимаю вопроса. Не существует правильного метода расчета анализа. Это зависит от ваших потребностей. Иногда наиболее важен худший случай (например, приложения реального времени, такие как системы наведения ракет), а иногда вам нужен средний или даже амортизированный случай (обычно, когда основной проблемой является пропускная способность). Пример: вставка хеш-таблицы — Theta(n) наихудший случай и Theta(1) средний [для простоты предполагается, что повторное хеширование не требуется]   -  person amit    schedule 27.08.2012


Ответы (6)


Большой O дает только верхнюю асимптотическую границу, в то время как большой Theta также дает нижнюю границу.

Все, что Theta(f(n)), также является O(f(n)), но не наоборот.
T(n) называется Theta(f(n)), если одновременно O(f(n)) и Omega(f(n))

По этой причине нотация big-Theta более информативна, чем нотация big-O, поэтому, если мы можем сказать, что что-то является big-Theta, обычно это предпочтительнее. Однако доказать, что что-то является большим Тета, труднее, чем доказать, что это большое О.

Например, пример, сортировка слиянием имеет одновременно O(n*log(n)) и Theta(n*log(n)), но также O(n2), так как n2 асимптотически "больше" его. Однако это НЕ тета (n2), поскольку алгоритм НЕ является омега (n2).


Omega(n) — это асимптотическая нижняя граница. Если T(n) равно Omega(f(n)), это означает, что из определенного n0 существует константа C1 такая, что T(n) >= C1 * f(n). В то время как big-O говорит, что существует константа C2 такая, что T(n) <= C2 * f(n)).

Все три (Omega, O, Theta) дают только асимптотическую информацию ("для больших входных данных"):

  • Большой O дает верхнюю границу
  • Большая Омега дает нижнюю границу и
  • Big Theta дает как нижнюю, так и верхнюю границу

Обратите внимание, что это обозначение не связано с анализом алгоритмов в наилучшем, наихудшем и среднем случаях. Каждый из них может быть применен к каждому анализу.

person amit    schedule 27.08.2012
comment
f(n) равно theta g(n), когда f(n) is O(n) и f(n) is omega(n). Я понимаю, что omega(n) говорит мне о наихудшем случае (так ли это?) и O(n) говорит мне о поведении функция с некоторыми большими входами, против времени. Что theta(n) изображает / рассказывает? - person Suhail Gupta; 27.08.2012
comment
@SuhailGupta: Omega(n) - асимптотическая нижняя граница. Если T(n) равно Omega(f(n)), это означает, что из определенного n0 существует константа C, такая как T(n) >= C * f(n) (где большой-O говорит, что существует константа C2 такая, что T(n) <= C2 * f(n))). Все три (Omega,O,Theta) дают только асимптотическую информацию (для больших входных данных), большой O дает верхнюю границу, большой Omega дает нижнюю границу, а большой Theta дает и то, и другое. . Обратите внимание, что это обозначение НЕ связано с анализом алгоритмов в наилучшем/худшем/среднем случае. Каждый из них может быть применен к каждому анализу. - person amit; 27.08.2012
comment
Я совершенно уверен, что понимаю, что означают обозначения (в математическом смысле). Но когда вы упоминаете об этом (и когда я читаю какую-то статью в Википедии о сортировке), я немного смущен тем, как обозначения используются в анализе худшего/лучшего/среднего случая: почему они назначают тета-нотацию в случае цикла sort, но они используют нотацию O для случая сортировки выбором. - person nhahtdh; 27.08.2012
comment
@nhahtdh: авторы этих статей сами могут быть не уверены. (Помните, что Википедия не всегда редактируется профессиональным CS, это может быть статья, созданная/отредактированная сбитым с толку студентом UG). Обратите внимание, что большие O/Theta/Omega — это классы функций, а не алгоритмов. (наихудший/лучший/средний/.. анализ случая на самом деле является функцией, которая преобразует алгоритм в функцию). Также обратите внимание: не неправильно утверждать, что функция Theta(n^2) является O(n^2) — таким образом, утверждения википедии — хотя и неточные — не ошибочны. - person amit; 27.08.2012
comment
У меня есть алгоритм «Алг», для которого определены омега, тета, большой О. Объясните мне очень простым языком, что каждый из них скажет мне об алгоритме «Алг»? Используйте псевдоним для нижней или верхней границы или объясните их. - person Suhail Gupta; 27.08.2012
comment
@SuhailGupta: Что это конкретно, чего ты не понимаешь? Вы понимаете, что такое асимптотическая оценка? асимптота в целом? Пожалуйста, укажите, в чем именно заключается ваша трудность, чтобы я мог сосредоточиться на ней. - person amit; 27.08.2012
comment
Я не понимаю, что каждый из них означает. Я понимаю, что такое асимптота. Я также понимаю математические определения нижней асимптотической границы и верхней асимптотической границы. - person Suhail Gupta; 27.08.2012
comment
Хорошо. Тогда говорят, что функция равна O(f(n)), если она имеет f(n) в качестве верхней асимптотической границы. это Omega(g(n)), если g(n) является нижней асимптотической границей. Оба относятся к функциям, а не к алгоритмам. Сказать, что алгоритм имеет большой O (например), неточны, мы должны сказать на самом деле: Алгоритм 'alg' находится O(f(n)) при анализе наихудшего случая. Анализ в худшем случае дает нам, сколько операций алгоритм выполняет для каждого n, в худшем случае — и, следовательно, функцию. Пока ясно? - person amit; 27.08.2012
comment
давайте продолжим это обсуждение в чате - person Suhail Gupta; 27.08.2012

Я просто приведу цитату из TAOCP Кнута, том 1 — стр. 110 (у меня есть индийское издание). Я рекомендую прочитать страницы 107-110 (раздел 1.2.11 Асимптотические представления)

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

На странице 107,

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 = O (n ^ 4) и

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 = O (n ^ 3) и

1^2 + 2^2 + 3^2 + ... + n^2 = (1/3) n^3 + O(n^2)

Big-Oh для приближений. Это позволяет вам заменить ~ на знак равенства =. В приведенном выше примере для очень большого n мы можем быть уверены, что количество останется ниже n ^ 4 и n ^ 3 и (1/3) n ^ 3 + n ^ 2 [а не просто n ^ 2]

Большая омега предназначена для нижних границ. Алгоритм с омега (n ^ 2) будет не таким эффективным, как алгоритм с O (N logN) для больших N. Однако мы не знаем, при каких значениях N (в этом смысле мы знаем примерно)

Большая тета предназначена для точного порядка роста, как нижней, так и верхней границы.

person rjha94    schedule 06.06.2013

Если время выполнения выражено в виде большого O, вы знаете, что время выполнения не будет медленнее заданного выражения. Он выражает наихудший сценарий.

Но с тета-нотацией вы также знаете, что это не будет быстрее. То есть не существует наилучшего сценария, при котором алгоритм будет перестраиваться быстрее.

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

person faester    schedule 08.09.2015

Вот моя попытка:

Функция f(n) есть O(n) тогда и только тогда, когда существует константа c, такая что f(n) <= c*g(n).

Используя это определение, можем ли мы сказать, что функция f(2^(n+1)) есть O(2^n)?

  1. Другими словами, существует ли константа 'c' такая, что 2^(n+1) <= c*(2^n)? Обратите внимание, что вторая функция (2^n) — это функция после большой O в приведенной выше задаче. Меня это сначала смутило.

  2. Итак, тогда используйте свои базовые навыки алгебры, чтобы упростить это уравнение. 2^(n+1) разбивается на 2 * 2^n. При этом у нас остается:

    2 * 2^n <= c(2^n)

  3. Теперь все просто, уравнение выполняется для любого значения c, где c >= 2. Итак, да, мы можем сказать, что f(2^(n+1)) это O(2^n).

Big Omega работает так же, за исключением того, что она оценивает f(n) >= c*g(n) для некоторой константы 'c'.

Итак, упростив вышеуказанные функции таким же образом, у нас осталось (обратите внимание на >= сейчас):

2 * 2^n >= c(2^n)

Итак, уравнение работает для диапазона 0 <= c <= 2. Итак, мы можем сказать, что f(2^(n+1)) — это Большая Омега (2^n).

Теперь, поскольку ОБЕ из них выполняются, мы можем сказать, что это функция Big Theta (2^n). Если один из них не будет работать для константы 'c', то это не Big Theta.

Приведенный выше пример был взят из «Руководства по проектированию алгоритмов» Скиены, фантастической книги.

Надеюсь, это поможет. Это действительно сложная концепция для упрощения. Не зацикливайтесь на том, что такое 'c', просто разбейте его на более простые термины и используйте свои базовые навыки алгебры.

person sma    schedule 04.08.2013

Я собираюсь использовать пример, чтобы проиллюстрировать разницу.

Пусть функция f(n) определена как

if n is odd f(n) = n^3
if n is even f(n) = n^2

Из CLRS

Функция f(n) принадлежит множеству Θ(g(n)), если существуют положительные константы c1 и c2 такие, что ее можно «зажать» между c1g(n) и c2g(n) при достаточно больших n.

И

O(g(n)) = {f(n): существуют положительные константы c и n0 такие, что 0 ≤ f(n) ≤ cg(n) для всех n ≥ n0}.

И

Ω(g(n)) = {f(n): существуют положительные константы c и n0 такие, что 0 ⩽ cg(n) ⩽ f(n) для всех n ⩾ n0}.

Верхняя граница f(n) равна n^3. Итак, наша функция f(n) явно равна O(n^3).

Но это Θ (n ^ 3)?

Чтобы f(n) находилась в Θ(n^3), она должна быть зажата между двумя функциями, одна из которых образует нижнюю границу, а другая — верхнюю границу, обе из которых выросли при n^3. В то время как верхняя граница очевидна, нижняя граница не может быть n ^ 3. Нижняя граница на самом деле n ^ 2; f(n) равно Ω(n^2)

Из CLRS

Для любых двух функций f(n) и g(n) имеем f(n) = Θ(g(n)) тогда и только тогда, когда f(n) = O(g(n)) и f(n) = Ω(g(n)).

Следовательно, f (n) не находится в Θ (n ^ 3), а находится в O (n ^ 3) и Ω (n ^ 2)

person VSOverFlow    schedule 28.08.2012

На очень простом языке разница будет такой:

Обозначение Big O используется для анализа алгоритма в наихудшем случае. Big Omega используется для анализа алгоритма в наилучшем случае. Big Theta используется для анализа алгоритма, когда анализ наилучшего и наихудшего случаев одинаков.

Допустим, вы ищете число в отсортированном массиве, используя алгоритм двоичного поиска.

[1 2 3 4 5 6 7] 

В худшем случае, например, когда целью является 1, он должен выполнить log(n) разделенных проверок, что в нашем случае составляет log(7). Это может быть выражено как O (n).

В лучшем случае, например, когда цель равна 3, выполняется только одна операция. Его можно выразить как Ω(1)

person Elyor    schedule 21.04.2019