Иногда я вижу Θ (n) со странным символом Θ с чем-то посреди него, а иногда просто O (n). Это просто лень печатать, потому что никто не знает, как набирать этот символ, или это означает что-то другое?
В чем разница между Θ (n) и O (n)?
Ответ 1
Краткое объяснение:
Если алгоритм имеет значение Θ (g (n)), это означает, что время работы алгоритма с ростом n (размер ввода) пропорционально g (n).
Если алгоритм имеет O (g (n)), это означает, что время работы алгоритма при увеличении n больше не более, пропорционального g (n).
Обычно, даже когда люди говорят о O (g (n)), они фактически означают Θ (g (n)), но технически, есть разница.
Более технически:
O (n) представляет верхнюю границу. Θ (n) означает жесткую привязку. Ω (n) представляет собой нижнюю границу.
f (x) = Θ (g (x)), если f (x) = O (g (x)) и f (x) = Ω (g (x))
Например, верхняя граница наивного рекурсивного подхода для вычисления последовательности Фибоначчи:
Fib (x) = O (2 n)
но плотная оценка
Fib (x) = Θ (F n), где F n - последовательность Фибоначчи.
который также является допустимой верхней границей.
В основном, когда мы говорим, что алгоритм имеет O (n), он также O (n 2), O (n 1000000), O (2 n),... но алгоритм Θ (n) не Θ (n 2).
Действительно, поскольку f (n) = Θ (g (n)) означает, что для достаточно больших значений n, f (n) может быть связано с c 1 g (n) и c 2 g (n) для некоторых значений c 1 и c 2, т.е. скорость роста f асимптотически равна g: g может нижняя граница и и верхняя граница f. Это непосредственно означает, что f может быть нижней границей и верхней границей g. Следовательно,
f (x) = Θ (g (x)), если g (x) = Θ (f (x))
Аналогично, чтобы показать f (n) = Θ (g (n)), достаточно показать, что g является верхней границей f (т.е. f (n) = O (g (n))), а f является нижняя грань g (т.е. f (n) = Ω (g (n)), что является тем же самым, что g (n) = O (f (n))). Лаконично,
f (x) = Θ (g (x)), если f (x) = O (g (x)) и g (x) = O (f (x))
Существуют также небольшие о-о и малые омега (ω
), обозначающие свободные верхние и свободные нижние границы функции.
Подводя итог:
f(x) = O(g(x))
(big-oh) означает, что скорость ростаf(x)
равна асимптотически меньше или равно до к скорости ростаg(x)
.
f(x) = Ω(g(x))
(big-omega) означает что скорость ростаf(x)
равна асимптотически больше или равной темпам ростаg(x)
f(x) = O(g(x))
(small-oh) означает, что скорость ростаf(x)
равна асимптотически меньшескорость ростаg(x)
.
f(x) = ω(g(x))
(малая омега) означает что скорость ростаf(x)
равна асимптотически больше, чемскорость ростаg(x)
f(x) = Θ(g(x))
(theta) означает, что скорость ростаf(x)
равна асимптотически , равнымскорость ростаg(x)
Для более подробного обсуждения вы можете прочитать определение в Википедии или обратиться к классическому учебнику, например "Введение в алгоритмы" Cormen и др.
Ответ 2
Есть простой способ (трюк, я думаю), чтобы помнить, какая нотация означает что.
Все нотации Big-O можно считать имеющими планку.
При взгляде на Ω бар находится внизу, поэтому это (асимптотическая) нижняя граница.
При взгляде на Θ панель, очевидно, посередине. Так что это (асимптотическая) плотная граница.
Когда почерк O, вы обычно заканчиваете вверху и рисуете дрожание. Поэтому O (n) - верхняя граница функции. Справедливости ради, этот не работает с большинством шрифтов, но это оригинальное обоснование имен.
Ответ 3
один - это большой "O"
один - Большая Тета
http://en.wikipedia.org/wiki/Big_O_notation
Big O означает, что ваш алгоритм будет выполняться не более, чем в заданном выражении (n ^ 2)
Big Omega означает, что ваш алгоритм будет выполняться не меньше шагов, чем в данном выражении (n ^ 2)
Если оба условия истинны для одного и того же выражения, вы можете использовать большую тета-нотацию....
Ответ 4
Вместо того, чтобы давать теоретическое определение, которое здесь прекрасно описано здесь, я приведу простой пример:
Предположим, что время выполнения f(i)
равно O(1)
. Ниже приведен фрагмент кода, асимптотическое время выполнения которого Θ(n)
. Он всегда вызывает функцию f(...)
n
раз. Как нижняя, так и верхняя граница n.
for(int i=0; i<n; i++){
f(i);
}
Второй фрагмент кода ниже имеет асимптотическое время выполнения O(n)
. Он вызывает функцию f(...)
не более n
раз. Верхняя граница равна n, но нижняя граница может быть Ω(1)
или Ω(log(n))
, в зависимости от того, что происходит внутри f2(i)
.
for(int i=0; i<n; i++){
if( f2(i) ) break;
f(i);
}
Ответ 5
A график мог бы облегчить понимание предыдущих ответов:
Θ-Обозначение - тот же порядок | O-Notation - верхняя граница
На английском языке
Слева отметим, что существует верхняя граница и нижняя граница, которые имеют одинаковый порядок величины (т.е. g(n)
). Игнорируем константы, и если верхняя граница и нижняя граница имеют один и тот же порядок величины, можно с уверенностью сказать, что g(n)
является Theta
of f(n)
.
Начиная с правого, более простого примера, он говорит, что верхняя граница (т.е. big O
) f(n)
равна g(n)
. Заметим, что g(n)
является просто порядком величины и игнорирует константу c
(как и все обозначения big O
).
Ответ 6
Думайте сказать Theta = afunction
как ярлык, говоря Big-O = afunction
AND Omega = afunction
Когда большой O функции и Омега функции одинаковы, Theta является сокращенным способом ссылки на эту особую ситуацию.
Таким образом, если вы скажете Theta = some expression
, то все равно правильно сказать O = some expression
и Omega = some expression
. Единственное отличие состоит в том, что выражение Theta = some expression
содержит больше информации.
Грубая аналогия:
O говорит, что "животное имеет меньше или равно 5 ногам". Омега говорит, что "животное имеет больше или равно 5 препятствий".
Тета похожа на то, что "животное имеет 5 ног".
Другими словами, если у животного 5 ног (Theta), то и следующие утверждения верны:
- у животного 5 или менее ножек. (О)
- у животного 5 или более ножек. (Omega)
Просто имейте в виду, что выражения не обязательно являются конкретными числами, а функциями разных порядков величины (log (n), n, n ^ 2 и т.д.).
Ответ 7
f(n)
принадлежит O(n)
, если существует положительный k
как f(n)<=k*n
f(n)
принадлежит Θ(n)
, если существует положительный k1
, k2
как k1*n<=f(n)<=k2*n
Ответ 8
Использование пределов
Рассмотрим f(n) > 0
и g(n) > 0
для всех n
. Это нормально, потому что самый быстрый алгоритм имеет хотя бы одну операцию и завершает ее выполнение после запуска. Это упростит исчисление, потому что вместо абсолютного значения (|f(n)|
) мы можем использовать значение (f(n)
).
-
f(n) = O(g(n))
Общие:
f(n) 0 ≤ lim ──────── < ∞ n➜∞ g(n)
Для
g(n) = n
:f(n) 0 ≤ lim ──────── < ∞ n➜∞ n
<сильные > Примеры:
Expression Value of the limit ------------------------------------------------ n = O(n) 1 1/2*n = O(n) 1/2 2*n = O(n) 2 n+log(n) = O(n) 1 n = O(n*log(n)) 0 n = O(n²) 0 n = O(nⁿ) 0
Контрпримеры:
Expression Value of the limit ------------------------------------------------- n ≠ O(log(n)) ∞ 1/2*n ≠ O(sqrt(n)) ∞ 2*n ≠ O(1) ∞ n+log(n) ≠ O(log(n)) ∞
-
f(n) = Θ(g(n))
Общие:
f(n) 0 < lim ──────── < ∞ n➜∞ g(n)
Для
g(n) = n
:f(n) 0 < lim ──────── < ∞ n➜∞ n
<сильные > Примеры:
Expression Value of the limit ------------------------------------------------ n = Θ(n) 1 1/2*n = Θ(n) 1/2 2*n = Θ(n) 2 n+log(n) = Θ(n) 1
Контрпримеры:
Expression Value of the limit ------------------------------------------------- n ≠ Θ(log(n)) ∞ 1/2*n ≠ Θ(sqrt(n)) ∞ 2*n ≠ Θ(1) ∞ n+log(n) ≠ Θ(log(n)) ∞ n ≠ Θ(n*log(n)) 0 n ≠ Θ(n²) 0 n ≠ Θ(nⁿ) 0
Ответ 9
Заключение: мы рассматриваем большие O, большие θ и большие Ω как одно и то же.
Почему? Я объясню причину ниже:
Во-первых, я уточню одно неправильное утверждение, некоторые люди думают, что нам просто нужна худшая временная сложность, поэтому мы всегда используем большой O вместо большого θ. Я скажу, что этот человек дерьмо. Верхняя и нижняя границы используются для описания одной функции, не используемой для описания временной сложности. Наихудшая функция времени имеет свою верхнюю и нижнюю границу; лучшая функция времени также имеет верхнюю и нижнюю границы.
Чтобы четко объяснить связь между большими O и большими θ, я объясню связь между большими O и малыми o в первую очередь. Из определения легко понять, что малый o является подмножеством большого O. Например:
T (n) = n ^ 2 + n, можно сказать, что T (n) = O (n ^ 2), T (n) = O (n ^ 3), T (n) = O (n ^ 4). Но при малых o T (n) = o (n ^ 2) не удовлетворяет определению малой o. Так что просто T (n) = o (n ^ 3), T (n) = o (n ^ 4) верны при малых o. Резервный T (n) = O (n ^ 2) - это что? Это большой θ!
В общем случае, мы говорим, что большой O является O (n ^ 2), вряд ли T (n) = O (n ^ 3), T (n) = O (n ^ 4). Зачем? Потому что мы рассматриваем большой O как большой θ подсознательно.
Аналогично, мы также рассматриваем большую Ω как большую θ подсознательно.
Одним словом, большие O, большие θ и большие Ω - не то же самое из определений, но они одно и то же в нашем рту и мозгу.