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

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

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)) iff f (x) = 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 (x) = Θ(g(x)) если f(x) = O(g(x)) и g(x) = O(f(x))


есть также мало-О и мало-омега (ω) обозначения, представляющие свободные верхние и свободные нижние границы функции.

подведем итоги:

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)) (little-omega) означает что темпы роста f(x) is асимптотически больше в темп роста g(x)

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

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


есть простой способ (трюк, я думаю), чтобы помнить, какие обозначения означает, что.

все обозначения 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 раза. Нижняя и верхняя граница Н.

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);
}

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

таким образом, если кто-то утверждает The Theta is expression q, тогда они также обязательно утверждают, что Big O is expression q и Omega is expression q.


грубая аналогия:

Если: Тета утверждает: "у этого животного 5 ног." из этого следует, что: Большое О верно ("у этого животного меньше или равно 5 ногам.") и Омега истинна ("это животное имеет больше или равно 5 ноги.")

это только грубая аналогия, потому что выражения не обязательно являются конкретными числами, а вместо этого функциями различных порядков величины, таких как log(n), n, n^2, (и т. д.).


A диаграммы могли сделать предыдущие ответы легче понять:

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

Θ(n) - Same orderO(n) - Upper bound

На Английском Языке

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

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


f(n) принадлежит O(n) если существует положительный k as f(n)<=k*n

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

статья Википедии о Big O Notation


заключение: мы рассматриваем большой O, большой θ и большой Ω как одно и то же.

почему? Я скажу причину ниже:

во-первых, я уточню одно неправильное утверждение, некоторые люди думают, что мы просто заботимся о худшей сложности времени, поэтому мы всегда используем big O вместо big θ. Я скажу, что этот человек несет чушь. Верхняя и нижняя границы используются для описания одной функции, а не для описания временной сложности. Худшая функция времени имеет свои верхние и нижние граница; лучшая функция времени также имеет верхнюю и нижнюю границы.

чтобы ясно объяснить отношение между большим 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). Почему? Потому что мы рассматриваем большое О как большое θ подсознательно.

аналогично, мы также рассматриваем большой Ω как большой θ подсознательно.

одним словом, big O, big θ и big Ω-это не одно и то же из определений, но они одинаковы у нас во рту и мозг.


используя пределы

рассмотрим 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)
    

    For 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