В чем разница между Θ (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)) тогда и только тогда, когда 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))(мало-ой) означает, что скорость роста f(x)асимптотически меньше, чем скорость роста g(x).

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

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

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


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

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

одна большая тета

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

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

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

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


20
Но это неправильно! Число шагов ограничено сверху n ^ 2, так как n становится очень большим. Тем не менее, алгоритм, который выполняется за n ^ 2 + c шагов, занимает больше, чем n ^ 2 шагов, но все равно O (n ^ 2). Система обозначений Big-O описывает только асимптотическое поведение.
HenryR

1
Это не конец всем быть всем определением. Это просто отправная точка .... Поскольку мы говорим об асимптотических обозначениях, когда n приближается к бесконечности. Константа C становится нефакторной.
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)is 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).
Кара Дениз

11

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

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


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

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

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


11

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

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

Θ (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, то есть асимптотически.
HenryR

Что значит 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. Из определения мы можем легко узнать, что small 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.