Яка різниця між Θ (n) і O (n)?


427

Іноді я бачу Θ (n) із дивним символом with з чимось посеред нього, а іноді просто O (n). Це просто лінь вводити текст, тому що ніхто не знає, як набрати цей символ, чи це означає щось інше?


8
Це не очевидно, але це питання є дублікатом цього stackoverflow.com/questions/464078/… з вчорашнього дня.
Білл Ящірка

Відповіді:


600

Коротке пояснення:

Якщо алгоритм має значення Θ (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)

Для більш детального обговорення ви можете прочитати визначення у Вікіпедії або ознайомитися з класичним підручником, таким як Вступ до алгоритмів Кормена та ін.


1
Якщо "Якщо алгоритм дорівнює O (g (n)), це означає, що час роботи алгоритму в міру збільшення n є максимально пропорційним g (n)." Тоді як ти скажеш, що "в основному, коли ми говоримо, що алгоритм є O (n), це також O (n2), O (n1000000), O (2n)," ??
Andy897

@ Andy897 Це випливає із визначення поняття "пропорційний". З Вікіпедії: "У математиці дві змінні пропорційні, якщо зміна однієї завжди супроводжується зміною іншої, і якщо зміни завжди пов'язані з використанням постійного множника. Постійною називають коефіцієнт пропорційності або пропорційності постійний ".
Мехрдад Афшарі

Що >= \Omega(...)означає? Я розумію, якщо ми кажемо, що він є членом \Omega(...), але якщо він більший за нього? Якого сенсу це має?
Йоханнес Шауб - ліб

328

Існує простий спосіб (напевне, гадаю) запам'ятати, яка позначення означає що.

Для всіх позначень Big-O можна вважати планку.

Дивлячись на Ω, смужка знаходиться внизу, тому вона є (асимптотичною) нижньою межею.

Дивлячись на Θ, смужка, очевидно, посередині. Отже, це (асимптотичне) щільно пов'язане.

Коли ви пишете рукописний текст O, ви, як правило, закінчуєте вгорі і малюєте викрутку. Тому O (n) - верхня межа функції. Справедливості, це не працює з більшістю шрифтів, але це оригінальне виправдання імен.


5
Зазвичай я ніколи не опускаю нижче 3-4 відповідей на будь-які запитання. Це вартувало їзди. Дякуємо, що поділилися трюком. : D
неможливо

56

один великий "O"

одна - Велика Тета

http://en.wikipedia.org/wiki/Big_O_notation

Big O означає, що ваш алгоритм буде виконуватися не більше кроків, ніж у даному виразі (n ^ 2)

Велика Омега означає, що ваш алгоритм буде виконуватись не менше кроків, ніж у даному виразі (n ^ 2)

Коли обидві умови справедливі для одного виразу, ви можете використовувати великі тетані позначення ....


20
Але це неправильно! Кількість кроків обмежена вище n ^ 2, оскільки n стає дуже великим. Однак алгоритм, який працює в n ^ 2 + c кроків, займає більше n ^ 2 кроків, але все ще O (n ^ 2). Нотація Big-O описує лише асимптотичну поведінку .
ГенріР

1
Це ще не кінцеве визначення. Це лише початкова точка .... Оскільки ми говоримо про асимптотичні позначення, коли n наближається до нескінченності. Постійна С стає не фактором.
l_39217_l

1
Хоча мені подобається простота цієї відповіді, слід зазначити, що алгоритм O (n ^ 2) міг би дуже добре виконати 1 000 000 000 * n ^ 2 кроків для виконання, що, безумовно, набагато більше, ніж n ^ 2. Алгоритм, що є O (n ^ 2), просто означає, що для його виконання буде потрібно не більше k * n ^ 2 кроків, де k - деяке додатне дійсне число.
MarredCheese

38

Замість того, щоб дати теоретичне визначення, яке тут прекрасно узагальнено, я наведу простий приклад:

Припустимо, час запуску 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);
}

Що ви маєте на увазі під "асимптотичним режимом"?
чоппер намалювати lion4

1
Асимптотика в цьому контексті означає "для досить великого n". Час виконання фрагмента коду, асимптотичний час якого Θ(n)буде наростати лінійно, по мірі збільшення n, наприклад, час виконання T може бути виражений як T (n) = a * n + b. Для малих значень n (наприклад, n = 1 або 2) це може бути не найкращим способом опису поведінки - можливо, у вас є якийсь код ініціалізації, який займає набагато більше часу, ніж f (i).
kara deniz

11

Тета - це скорочений спосіб посилання на спеціальну ситуацію, де велика О і Омега однакові.

Таким чином, якщо хтось претендує 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, (тощо).


11

Діаграма може зробити попередні відповіді легше зрозуміти:

Θ-Позначення - Той самий порядок | O-Notation - Верхня межа

Θ (n) - той самий порядок O (n) - Верхня межа

Англійською,

Ліворуч зауважте, що є верхня межа та нижня межа, які мають однаковий порядок (тобто g (n) ). Ігноруйте константи, і якщо верхня і нижня межі мають однаковий порядок, можна справедливо сказати, що f (n) = Θ (g (n)) або f (n) у великій теті g (n) .

Починаючи з правого, більш простого прикладу, він говорить, що верхня межа g (n) - це просто порядок і ігнорує константу c (як і всі великі нотації O ).


Ви переплутали слова та графіки.
kushalvm

@kushalvm, дякую за чесність. Не могли б ви пояснити, що конкретно ви маєте на увазі? Заради мого навчання та інших, які можуть заплутатися у цій відповіді. :-)
Рікардо

Чи не повинен останній рядок останнього абзацу f (n) є тетою g (n)?
kushalvm

@kushalvm, дякую за уточнення. Я змінив текст останнього рядка абзацу перед останнім, щоб виправити свою англійську помилку.
Рікардо

дивіться більше на вимові
Ricardo

6

f(n)належить, O(n)якщо існує позитивний kякf(n)<=k*n

f(n)належить, Θ(n)якщо існує позитив k1, k2якk1*n<=f(n)<=k2*n

Стаття у Вікіпедії про нотацію Big O


1
Ви пропустили вирішальний момент - вони вірні лише для всіх n> n1, тобто асимптотично.
ГенріР

Що означає n> n1?
чоппер намалювати lion4

3

Використання лімітів

Розглянемо f(n) > 0і g(n) > 0для всіх n. Це нормально вважати, оскільки найшвидший реальний алгоритм має принаймні одну операцію і завершує його виконання після початку. Це спростить обчислення, оскільки ми можемо використовувати значення ( f(n)) замість абсолютного значення ( |f(n)|).

  1. 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))                 ∞
    
  2. 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
    

2

Висновок: ми розглядаємо велике 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, великий θ і великий Ω - це не те саме, що є у визначеннях, але вони є одне і те ж у нашому роті та мозку.


Чому цей вміст форматується як цитата? Це цитата із зовнішнього джерела? Якщо так, джерело повинно бути пов’язане чи іншим чином ідентифіковано. Якщо ні, форматування цитат слід видалити.
Марк Амері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.