В чем разница между Θ(n) и O(n)?
иногда я вижу Θ(n) со странным symbol символом с чем-то посередине, а иногда просто O (n). Это просто лень печатать, потому что никто не знает, как ввести этот символ, или это означает что-то другое?
9 ответов:
краткое описание:
если алгоритм имеет значение Θ(g (n)), это означает, что время работы алгоритма, когда n(входной размер) становится больше, пропорционально g (n).
если алгоритм имеет O(g (n)), это означает, что время работы алгоритма по мере увеличения n равно максимум пропорционально g (n).
обычно, даже когда люди говорят о O(g (n)) они на самом деле имеют в виду Θ (g (n) ) но технически, есть разница.
более технически:
O (n) представляет верхнюю границу. Θ (n) означает крепко связанный. Ω (n) представляет нижнюю границу.
Ф(Х) = Θ(г(х)), МКФ F(х) = O(g(x)) и f(x) = Ω(g (x))
в основном, когда мы говорим, что алгоритм имеет O(n), это также O (n2), O (n1000000), O (2n),... но алгоритм Θ(n) - это не Θ (n2).
на самом деле, поскольку F(n) = Θ(g(n)) означает для достаточно больших значений n, f(n) может быть связано в пределах c1g (n) и c2g (n) для некоторых значений c1 и c2, т. е. скорость роста f асимптотически равна g: g может быть нижней границей и и верхняя граница f. это непосредственно означает, что f может быть нижней границей и верхней границей g. Следовательно,
f (x) = Θ(g(x)) iff 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(Х) = О(Г(х)) и G(Х) = О(Ф(Х))
есть также мало-ой и мало-омега (
ω
) обозначения, представляющие свободные верхние и свободные нижние границы функции.подведем итоги:
f(x) = O(g(x))
(big-oh) означает, что темпы ростаf(x)
is асимптотически меньше или равно к к темпам ростаg(x)
.
f(x) = Ω(g(x))
(big-omega) означает что темпы ростаf(x)
is асимптотически больше или равно темпы ростаg(x)
f(x) = o(g(x))
(little-oh) означает, что темпы ростаf(x)
is асимптотически меньше в темп ростаg(x)
.
f(x) = ω(g(x))
(чуть-омега) означает что темпы ростаf(x)
is асимптотически больше в темп ростаg(x)
f(x) = Θ(g(x))
(тета) означает, что темпы ростаf(x)
is асимптотически равна в темпы ростаg(x)
для более детального обсуждения, вы можете прочитайте определение в Википедии или обратитесь к классическому учебнику, такому как введение в алгоритмы Cormen et al.
есть простой способ (трюк, я думаю), чтобы помнить, какие обозначения означает то, что.
все обозначения Big-O можно считать имеющими бар.
при взгляде на Ω бар находится внизу, поэтому он является (асимптотической) нижней границей.
при взгляде на Θ, бар, очевидно, находится в середине. Таким образом, это (асимптотическая) плотная граница.
когда почерк O, вы обычно заканчиваете в верхней части, и нарисовать закорючку. Поэтому O (n) является верхним предел функции. Справедливости ради, это не работает с большинством шрифтов, но это оригинальное обоснование имен.
один большой "О"
один большой тета
http://en.wikipedia.org/wiki/Big_O_notation
Big O означает, что ваш алгоритм будет выполняться не более чем в заданном выражении (n^2)
Big Omega означает, что ваш алгоритм будет выполняться не меньше шагов, чем в данном выражении(n^2)
когда оба условия истинны для одного и того же выражения, вы можете использовать большую тета-нотацию....
вместо того, чтобы дать теоретическое определение, которое прекрасно обобщено здесь уже, я приведу простой пример:
предположим, что время выполнения
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); }
тета-это сокращенный способ ссылки на специальную ситуацию, где большая О и Омега-это одно и то же.
таким образом, если кто-то утверждает
The Theta is expression q
, то они также обязательно утверждая, чтоBig O is expression q
иOmega is expression q
.
грубая аналогия:
Если: Тета утверждает: "у этого животного 5 ног." тогда получается, что: Большое О верно ("это животное имеет меньше или равно 5 ног.") и Омега истинна ("это животное имеет больше или равно 5 ноги.")
это только грубая аналогия, потому что выражения не обязательно являются конкретными числами, а вместо этого функциями различных порядков величины, таких как log(n), n, n^2, (и т. д.).
A диаграммы могли сделать предыдущие ответы легче понять:
Θ-нотация-тот же порядок / o-нотация-верхняя граница
На Английском Языке
слева, обратите внимание, что есть верхняя граница и нижняя граница, что и тот же порядок (т. е. g (n)). Игнорируйте константы, и если верхняя граница и нижняя граница имеют одинаковый порядок величины, можно достоверно сказать f (n) = Θ(g(n)) или f (n) находится в большой тете g(n).
начиная с правого, более простого примера, он говорит верхнюю границу g (n) это просто порядок величины и игнорирует константу c (как и все big O нотация делает).
f(n)
принадлежитO(n)
если существует положительныйk
какf(n)<=k*n
f(n)
принадлежитΘ(n)
если существует положительныйk1
,k2
какk1*n<=f(n)<=k2*n
вывод: мы рассматриваем big O, big θ и big Ω как одно и то же.
почему? Я расскажу причину ниже:
во-первых, я поясню одно неверное утверждение, некоторые люди думают, что мы просто заботимся о худшей сложности времени, поэтому мы всегда используем big O вместо big θ. Я скажу, что этот человек-чушь собачья. Верхняя и нижняя границы используются для описания одной функции, а не для описания временной сложности. Худшая функция времени имеет свой верхний и Нижний граница; лучшая функция времени имеет свою верхнюю и нижнюю границу тоже.
чтобы ясно объяснить отношение между большим О и большим θ, я сначала объясню отношение между большим О и малым о. Из определения мы можем легко узнать, что малый 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), Т(п)=о(N^4) верны для небольших часов. Избыточные Т(П)=О(N^2) - это что? Это большой θ!
Как правило, мы говорим, что big O - Это O(n^2), вряд ли можно сказать T(n)=O(n^3), T(n)=O (n^4). Зачем? Потому что мы рассматриваем большое О как большое θ подсознательно.
аналогично, мы также рассматриваем большой Ω как большой θ подсознательно.
одним словом, big O, big θ и big Ω-это не одно и то же из определений, но это одно и то же в нашем рту и мозг.
используя пределы
рассмотрим
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