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

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

Ответ 1

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

Если алгоритм имеет значение Θ (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))

Например, верхняя граница наивного рекурсивного подхода для вычисления последовательности Фибоначчи:

Fib (x) = O (2 n)

но плотная оценка

Fib (x) = Θ (F n), где F n - последовательность Фибоначчи.

который также является допустимой верхней границей.

В основном, когда мы говорим, что алгоритм имеет 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))


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

Подводя итог:

f(x) = O(g(x)) (big-oh) означает, что скорость роста f(x) равна асимптотически меньше или равно до к скорости роста g(x).

f(x) = Ω(g(x)) (big-omega) означает что скорость роста f(x) равна асимптотически больше или равной темпам роста g(x)

f(x) = O(g(x)) (small-oh) означает, что скорость роста f(x) равна асимптотически меньшескорость роста g(x).

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

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

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

Ответ 2

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

Все нотации Big-O можно считать имеющими планку.

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

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

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

Ответ 3

один - это большой "O"

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

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

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

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

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

Ответ 4

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

Предположим, что время выполнения 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);
}

Ответ 5

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

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

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

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

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

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

Ответ 6

Думайте сказать Theta = afunction как ярлык, говоря Big-O = afunction AND Omega = afunction

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

Таким образом, если вы скажете Theta = some expression, то все равно правильно сказать O = some expression и Omega = some expression. Единственное отличие состоит в том, что выражение Theta = some expression содержит больше информации.


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

O говорит, что "животное имеет меньше или равно 5 ногам". Омега говорит, что "животное имеет больше или равно 5 препятствий".

Тета похожа на то, что "животное имеет 5 ног".

Другими словами, если у животного 5 ног (Theta), то и следующие утверждения верны:

  • у животного 5 или менее ножек. (О)
  • у животного 5 или более ножек. (Omega)

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

Ответ 7

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

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

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

Ответ 8

Использование пределов

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

Ответ 9

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