Іноді я бачу Θ (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)) iff 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)) 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 (x) = Θ (g (x)) iff 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))
(велика омега) означає, що швидкість росту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))
(theta) означає, що швидкість ростуf(x)
асимптотично дорівнює швидкості ростуg(x)
Для більш детального обговорення ви можете прочитати визначення у Вікіпедії або ознайомитися з класичним підручником, таким як Вступ до алгоритмів Кормена та ін.
>= \Omega(...)
означає? Я розумію, якщо ми кажемо, що він є членом \Omega(...)
, але якщо він більший за нього? Якого сенсу це має?
Існує простий спосіб (напевне, гадаю) запам'ятати, яка позначення означає що.
Для всіх позначень Big-O можна вважати планку.
Дивлячись на Ω, смужка знаходиться внизу, тому вона є (асимптотичною) нижньою межею.
Дивлячись на Θ, смужка, очевидно, посередині. Отже, це (асимптотичне) щільно пов'язане.
Коли ви пишете рукописний текст O, ви, як правило, закінчуєте вгорі і малюєте викрутку. Тому O (n) - верхня межа функції. Справедливості, це не працює з більшістю шрифтів, але це оригінальне виправдання імен.
один великий "O"
одна - Велика Тета
http://en.wikipedia.org/wiki/Big_O_notation
Big O означає, що ваш алгоритм буде виконуватися не більше кроків, ніж у даному виразі (n ^ 2)
Велика Омега означає, що ваш алгоритм буде виконуватись не менше кроків, ніж у даному виразі (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);
}
Θ(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 ніг". то випливає, що: Big O - правда ("У цієї тварини менше ніж 5 рівних ніжок") і Omega - це правда ("У цієї тварини більше ніж 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 і малим 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, великий θ і великий Ω - це не те саме, що є у визначеннях, але вони є одне і те ж у нашому роті та мозку.