Иногда я вижу Θ (n) со странным символом with с чем-то посередине, а иногда просто O (n). Это просто лень печатать, потому что никто не знает, как печатать этот символ, или это означает что-то другое?
Иногда я вижу Θ (n) со странным символом with с чем-то посередине, а иногда просто O (n). Это просто лень печатать, потому что никто не знает, как печатать этот символ, или это означает что-то другое?
Ответы:
Если алгоритм имеет Θ (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))
В основном, когда мы говорим, что алгоритм имеет 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))
Существуют также ω
нотации little-oh и little-omega ( ), представляющие свободные верхние и нижние нижние границы функции.
Обобщить:
f(x) = O(g(x))
(big-oh) означает, что скорость ростаf(x)
асимптотически меньше или равна скорости ростаg(x)
.
f(x) = Ω(g(x))
(большой омега) означает, что скорость ростаf(x)
асимптотически больше или равна скорости ростаg(x)
f(x) = o(g(x))
(мало-ой) означает, что скорость ростаf(x)
асимптотически меньше, чем скорость ростаg(x)
.
f(x) = ω(g(x))
(маленький омега) означает, что скорость ростаf(x)
асимптотически больше, чем скорость ростаg(x)
f(x) = Θ(g(x))
(тета) означает, что скорость ростаf(x)
асимптотически равна скорости ростаg(x)
Для более подробного обсуждения вы можете прочитать определение в Википедии или проконсультироваться с классическим учебником, таким как Введение в алгоритмы от Cormen et al.
>= \Omega(...)
значит? Я понимаю, если мы говорим, что это член \Omega(...)
, но если это больше, чем это? Какой смысл это имеет?
Есть простой способ (уловка, я полагаю), чтобы запомнить, какая запись означает, что.
Все обозначения Big-O можно считать имеющими планку.
Если смотреть на Ω, столбик находится внизу, поэтому он является (асимптотическим) нижней границей.
Если смотреть на Θ, то планка явно посередине. Так что это (асимптотическая) жесткая граница.
Когда почерк O, вы обычно заканчиваете вверху и рисуете загогулины. Следовательно, O (n) является верхней границей функции. Чтобы быть справедливым, этот не работает с большинством шрифтов, но это оригинальное обоснование имен.
один большой "о"
одна большая тета
http://en.wikipedia.org/wiki/Big_O_notation
Большой O означает, что ваш алгоритм будет выполняться не более, чем в заданном выражении (n ^ 2)
Большая Омега означает, что ваш алгоритм будет выполняться не менее, чем в заданном выражении (n ^ 2)
Когда оба условия выполняются для одного и того же выражения, вы можете использовать большую тета-нотацию ....
Вместо того, чтобы дать теоретическое определение, которое здесь уже кратко изложено, я приведу простой пример:
Предположим, время выполнения f(i)
is 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);
}
Θ(n)
будет расти линейно при увеличении n, например, время выполнения T может быть выражено как T (n) = a * n + b. Для небольших значений n (например, n = 1 или 2) это может быть не лучшим способом описания поведения - возможно, у вас есть некоторый код инициализации, который занимает намного больше времени, чем f (i).
Тета - это краткий способ обозначения особой ситуации, когда большие О и Омега одинаковы.
Таким образом, если кто-то утверждает The Theta is expression q
, то они также обязательно утверждают, что Big O is expression q
и Omega is expression q
.
Грубая аналогия:
Если: Тета заявляет: «У этого животного 5 ног». из этого следует, что: «Большой О» истинен («У этого животного меньше или равно 5 ногам».), а Омега истинен («У этого животного больше или равно 5 ногам».)
Это только грубая аналогия, потому что выражения не обязательно являются конкретными числами, а вместо этого функциями различного порядка, такими как log (n), n, n ^ 2 и т. Д.
Диаграмма может сделать предыдущие ответы легче понять:
На английском,
Слева обратите внимание, что есть верхняя граница и нижняя граница, которые имеют одинаковый порядок величины (т.е. g (n) ). Не обращайте внимания на константы, и если верхняя граница и нижняя граница имеют одинаковый порядок величины, можно с уверенностью сказать, что f (n) = Θ (g (n)) или f (n) находится в большой тэте g (n) .
Начиная с правого, более простого примера, он говорит, что верхняя граница g (n) - это просто порядок величины и игнорирует постоянную c (так же, как и все большие обозначения O ).
f(n)
принадлежит, O(n)
если существует положительный, k
какf(n)<=k*n
f(n)
принадлежит, Θ(n)
если существует положительное k1
, k2
какk1*n<=f(n)<=k2*n
Давайте рассмотрим 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
Вывод: мы рассматриваем большие O, большие θ и большие Ω как одно и то же.
Почему? Я расскажу причину ниже:
Во-первых, я поясню одно неверное утверждение: некоторые люди думают, что нас волнует наихудшая сложность времени, поэтому мы всегда используем большое О вместо большого θ. Я скажу, что этот человек дерьмо. Верхняя и нижняя границы используются для описания одной функции, а не для описания сложности времени. Функция наихудшего времени имеет верхнюю и нижнюю границы; функция лучшего времени также имеет верхнюю и нижнюю границы.
Чтобы четко объяснить связь между большим O и большим θ, сначала я объясню связь между большим O и малым o. Из определения мы можем легко узнать, что small 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, большие θ и большие Ω - это не одно и то же из определений, но это одно и то же для нашего рта и мозга.