В чем разница между Θ (n) и O (n)?

Иногда я вижу Θ (n) со странным символом Θ с чем-то посередине, а иногда просто O (n). Это просто лень печатать, потому что никто не знает, как набрать этот символ, или он означает что-то другое?


person martinus    schedule 22.01.2009    source источник
comment
Это не очевидно, но этот вопрос дублирует этот stackoverflow.com/questions/464078/ со вчерашнего дня.   -  person Bill the Lizard    schedule 23.01.2009
comment
Возможный дубликат ​​Разница между нижней границей и жесткой границей?   -  person Damjan Pavlica    schedule 29.03.2018


Ответы (9)


Краткое объяснение:

Если алгоритм имеет Θ (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)) (little-oh) означает, что скорость роста f(x) асимптотически меньше скорости роста g(x).

f(x) = ω(g(x)) (маленькая омега) означает, что скорость роста f(x) асимптотически больше, чем скорость роста g(x)

f(x) = Θ(g(x)) (тета) означает, что скорость роста f(x) асимптотически равна скорости роста g(x)

Для более подробного обсуждения вы можете прочитать определение в Википедии или обратиться к классическому учебнику, например, «Введение в Алгоритмы Cormen et al.

person Community    schedule 22.01.2009
comment
Если алгоритм имеет O (g (n)), это означает, что время работы алгоритма при увеличении n максимально пропорционально g (n). Тогда как вы скажете, что в основном, когда мы говорим, что алгоритм имеет O (n), это также O (n2), O (n1000000), O (2n), ?? - person Andy897; 19.01.2015
comment
@ Andy897 Это следует из определения пропорционального. Из Википедии: В математике две переменные пропорциональны, если изменение одной всегда сопровождается изменением другой, и если изменения всегда связаны с помощью постоянного множителя. Константа называется коэффициентом пропорциональности или константой пропорциональности. - person mmx; 20.01.2015
comment
Что значит >= \Omega(...)? Я понимаю, если мы говорим, что он член \Omega(...), но если он больше? Какой в ​​этом смысл? - person Johannes Schaub - litb; 30.06.2016
comment
Неясно, имеют ли в норме, даже когда люди говорят о O (g (n)), они на самом деле имеют в виду Θ (g (n)). Например, Quicksort - это O (n ^ 2) и Θ (n), и, следовательно, не иметь тесную связь. См. Обсуждение на softwareengineering.stackexchange.com/questions/99372/ - person xji; 10.08.2020

Есть простой способ (я полагаю, уловка) запомнить, какие обозначения что означают.

Можно считать, что все нотации Big-O имеют черту.

При взгляде на Ω полоса находится внизу, так что это (асимптотическая) нижняя граница.

Если смотреть на Θ, очевидно, что полоса находится посередине. Так что это (асимптотическая) точная оценка.

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

person Andrei Krotkov    schedule 23.01.2009
comment
Я обычно никогда не опускаю ниже 3-4 ответов ни на один вопрос. Поездка стоила того. Спасибо, что поделились трюком. : D - person impossible; 31.08.2018
comment
Мне это нравится. Но можете ли вы поделиться источником, поскольку это оригинальное обоснование названий? - person Kelly Bundy; 10.02.2021

один большой "О"

один - Большая Тета

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

Большой O означает, что ваш алгоритм будет выполняться не более, чем в заданном выражении (n ^ 2)

Big Omega означает, что ваш алгоритм будет выполняться не меньше, чем в заданном выражении (n ^ 2)

Когда оба условия верны для одного и того же выражения, вы можете использовать большую тета-нотацию ....

person l_39217_l    schedule 22.01.2009
comment
Но ошибается! Количество шагов ограничено сверху значением n ^ 2, поскольку n становится очень большим. Однако алгоритм, который выполняется за n ^ 2 + c шагов, занимает более n ^ 2 шагов, но по-прежнему O (n ^ 2). Обозначение Big-O описывает только асимптотическое поведение. - person HenryR; 23.01.2009
comment
Это еще не конец. Это просто отправная точка ... Поскольку мы говорим об асимптотических обозначениях, когда n стремится к бесконечности. Константа C становится нефакторной. - person l_39217_l; 23.01.2009
comment
Хотя мне нравится простота этого ответа, следует отметить, что алгоритм O (n ^ 2) вполне может потребовать 1000000000 * n ^ 2 шагов для выполнения, что, безусловно, намного больше, чем n ^ 2. Алгоритм O (n ^ 2) просто означает, что для его выполнения потребуется не более k * n ^ 2 шагов, где k - некоторое положительное действительное число. - person MarredCheese; 09.12.2017

Вместо того, чтобы давать теоретическое определение, которое уже здесь красиво резюмировано, я приведу простой пример:

Предположим, что время выполнения 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);
}
person kara deniz    schedule 27.09.2012
comment
Что вы имеете в виду под асимптотической средой выполнения? - person chopper draw lion4; 04.10.2014
comment
Асимптотика в этом контексте означает достаточно большое n. Время выполнения фрагмента кода, асимптотическое время выполнения которого равно Θ(n), будет линейно расти с увеличением n, например время выполнения T может быть выражено как T (n) = a * n + b. Для небольших значений n (например, n = 1 или 2) это может быть не лучший способ описания поведения - возможно, у вас есть код инициализации, который занимает намного больше времени, чем f (i). - person kara deniz; 06.10.2014

диаграмма может облегчить понимание предыдущих ответов:

Θ-обозначение - тот же порядок | О-нотация - верхняя граница

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

На английском,

Обратите внимание, что слева есть верхняя и нижняя границы одного порядка величины (т. Е. g (n)). Не обращайте внимания на константы, и если верхняя и нижняя границы имеют одинаковый порядок величины, можно справедливо сказать f (n) = Θ (g (n)) или f (n) находится в большой тэте g (n).

Начиная с правого, более простого примера, он говорит, что верхняя граница g (n) является просто порядком величины, и игнорирует константу c (как и все большая буква O).

person Ricardo    schedule 20.05.2015
comment
Вы перепутали слова и графики. - person HalfWebDev; 09.07.2018
comment
@kushalvm, спасибо за честность. Не могли бы вы объяснить, что конкретно вы имеете в виду? Ради моего обучения и других, которые могут запутаться с этим ответом. :-) - person Ricardo; 21.07.2018
comment
Разве последняя строка последнего абзаца не должна быть f (n) - это тета для g (n)? - person HalfWebDev; 21.07.2018
comment
@kushalvm, спасибо за разъяснения. Я изменил текст последней строки абзаца перед последним, чтобы исправить свою ошибку в английском. - person Ricardo; 24.07.2018
comment
см. подробнее о произношении - person Ricardo; 24.07.2018
comment
Здесь больше об асимптотической нотации ???? youtu.be/OpebHLAf99Y Нет термина под названием большая тета. - person HalfWebDev; 24.07.2018
comment
Извините, я не получил комментарий по поводу произношения выше. Вы говорите мне? ???? - person HalfWebDev; 24.07.2018
comment
Хорошо, вы тоже этому учитесь и помогаете другим в этом процессе. Хотя, не рекомендую вам зацикливаться на тривиальных вещах. В любом случае моя работа сделана, и надеюсь, что будущие читатели не запутаются, читая ваш ответ сейчас :) - person HalfWebDev; 25.07.2018

Тета - это сокращенный способ обозначить особую ситуацию, в которой большие О и Омега - одно и то же.

Таким образом, если кто-то заявляет 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 и т. Д.

person ahnbizcad    schedule 07.01.2015

f(n) принадлежит O(n), если существует положительное значение k как f(n)<=k*n

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

Статья в Википедии о нотации Big O

person user54579    schedule 22.01.2009
comment
Вы упустили важный момент - это верно только для всех n ›n1, т.е. асимптотически. - person HenryR; 23.01.2009
comment
Что означает n ›n1? - person chopper draw lion4; 05.10.2014

Использование лимитов

Рассмотрим 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
    
person Elrond_EGLDer    schedule 27.01.2016

Вывод: мы рассматриваем большой 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, большие θ и большие Ω - это не одно и то же из определений, но это одно и то же в нашем рту и в мозгу.

person haibo cu    schedule 30.11.2016
comment
Почему это содержание отформатировано как цитата? это цитата из внешнего источника? Если это так, источник должен быть связан или иным образом идентифицирован. В противном случае форматирование цитаты следует удалить. - person Mark Amery; 01.09.2019