Обозначение Big O

редактировать
Обозначение, описывающее ограничивающее поведение Пример записи Big O: f (x) ∈ O (g (x)) as существует c>0 (например, c = 1) и x 0 (например, x 0 = 5) такие, что f (x) ≤ cg (x) всякий раз, когда x ≥ x 0.

Нотация Big O - это математическая запись, которая имеет ограничивающее поведение функции , когда аргумент стремится к определенному значению или бесконечности. Big O является членом семейства нотаций, изобретенных Полом Бахманном, Эдмундом Ландау и другими, которые в совокупности ас именуются нотацией Бахмана - Ландау или>имптотическими нотациями .

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

Нотация Big O соответствует функциям с одинаковой скоростью роста O.

Буква O используется, потому что скорость роста также называется порядком функции . Описание функций в терминах нотации большого O обычно дает только верхнюю границу скорости функции роста. С обозначением большого количества связанных обозначений, в которых используются символы o, Ω, ω и Θ для описания других видов ограничений на асимптотические скорости роста.

Обозначение Big O также используется во многих других областях получения аналогичных оценок.

Содержание

  • 1 Формальное определение
  • 2 Пример
  • 3 Использование
    • 3.1 Бесконечная асимптотика
    • 3.2 Бесконечная асимптотика
  • 4 Свойства
    • 4.1 Продукт
    • 4.2 Сумма
    • 4.3 Умножение на константу
  • 5 Несколько чисел
  • 6 Обозначения
    • 6.1 Знак равенства
    • 6.2 Другие арифметические операторы
      • 6.2.1 Пример
    • 6.3 Многократное использование
    • 6.4 Набор текста
  • 7 Порядки общих функций
  • 8 Связанные асимптотические обозначения
    • 8.1 Малые обозначения
    • 8.2 Обозначения Big Omega
      • 8.2.1 Определение Харди - Литтлвуда
        • 8.2.1.1 Простые примеры
      • 8.2.2 Определение К
    • 8.3 Семейство нотаций Бахмана - Ландау
    • 8.4 Использование в информатике
    • 8.5 Другие нотации
    • 8.6 Расширения нотаций Бахмана - Ландау
  • 9 Обобщения и связанные с ними употребления
  • 10 История (обозначения Бахмана - Ландау, Харди и Виноградова)
  • 11 См.
  • 12 Ссылки и примечания
  • 13 Дополнительная литература
  • 14 Внешние ссылки

Формальное определение

Пусть f будет вещественным или комплексная значная функция и g вещественнозначная функция. Пусть обе функции на некотором некотором неограниченном подмножестве положительных вещественных чисел и g (x) {\ displaystyle g (x)}g (x) будет строго положительным для всех достаточно больших значений x. Один записывает

f (x) = O (g (x)) как x → ∞ {\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)} \ quad {\ text { as}} x \ to \ infty}{\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)} \ quad {\ text {as}} x \ to \ infty}

, если абсолютное значение из f (x) {\ displaystyle f (x)}е (х) является не более чем положительной константой кратное g (x) {\ displaystyle g (x)}g (x) для всех достаточно больших значений x. То есть f (x) = O (g (x)) {\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)}}{\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)}} , если есть существует положительное действительное число M и действительное число x 0 такие, что

| f (x) | ≤ M g (x) для всех x ≥ x 0. {\ displaystyle | f (x) | \ leq Mg (x) \ quad {\ text {for all}} x \ geq x_ {0}.}{\ displaystyle | f (x) | \ leq Mg (x) \ quad {\ text {для всех}} x \ geq x_ {0}.}

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

f (x) = O (g (x)). {\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)}.}{\ displaystyle f ( х) = О {\ bigl (} г (х) {\ bigr)}.}

Обозначение также может быть для описания поведения около некоторого действительного числа a (часто a = 0): мы говорим

f (x) = O (g (x)) как x → a {\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)} \ quad {\ text {as} } x \ to a}{\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)} \ quad {\ text {as}} x \ to a}

, если существуют положительные числа δ {\ displaystyle \ delta}\ delta и M такие, что для всех x с 0 < | x − a | < δ {\displaystyle 0<|x-a|<\delta }{\ displaystyle 0 <| xa | <\ delta} ,

| f (x) | ≤ M g (x). {\ displaystyle | f (x) | \ leq Mg (x).}{\ displaystyle | е (х) | \ leq Mg (x).}

График g (x) выбрано ненулевым для значений x , достаточно близких к a, оба из этих определений можно объединить с помощью верхнего предела :

f (Икс) = О (г (Икс)) как Икс → a {\ Displaystyle F (х) = О {\ bigl (} г (х) {\ bigr)} \ quad {\ text {as}} х \ к a}{\ displaystyle f (x) = O {\ bigl (} g (x) {\ bigr)} \ quad {\ text {as}} x \ to a}

, если

lim sup x → a | f (x) | g (x) < ∞. {\displaystyle \limsup _{x\to a}{\frac {\left|f(x)\right|}{g(x)}}<\infty.}{\ displaystyle \ limsup _ {x \ to a} {\ frac {\ left | f (x) \ right |} {g (x)}} <\ infty.}

Пример

В типичном обозначении обозначения O является асимптотическим, то есть относится к очень большим x. В этом случае вкладыш терминов, которые растут «наиболее быстро», в конечном итоге сделает другие неуместными. Сделать следующие правила упрощения:

  • Если f (x) является суммой нескольких элементов, если есть одно наибольшее количество скорости роста, его, все остальные опустить.
  • Если f (x) является произведением нескольких факторов, любые константы (члены зависят в произведении, которые не от x) могут быть опущены.

Например, пусть f (x) = 6x - 2x + 5, предположим, что мы хотим упростить эту функцию, используя обозначение O, чтобы описать скорость ее роста по мере приближения x к бесконечности. Эта функция является суммой трех членов: 6x, −2x и 5. Из этих трех членов один с наибольшей скоростью имеет наибольший показатель степени как функция x, а именно 6x. Теперь можно применить второе правило: 6x - это произведение 6 и x, в котором первый множитель не зависит от x. Отсутствие этого множителя приводит к упрощенной форме x. Таким образом, мы говорим, что f (x) - это «большой O» x. Математически мы можем написать f (x) = O (x). Этот расчет можно использовать, используя формальное определение: пусть f (x) = 6x - 2x + 5 и g (x) = x. Применяя формальное определение сверху, утверждение, что f (x) = O (x) эквивалентно его расширению,

| f (x) | ≤ М Икс 4 {\ Displaystyle | f (x) | \ leq Mx ^ {4}}{\ displaystyle | f (x) | \ leq Mx ^ {4}}

для подходящего выбора из x 0 и M и для всех x>x 0. Чтобы доказать это, пусть x 0 = 1 и M = 13. Тогда для всех x>x 0:

| 6 х 4 - 2 х 3 + 5 | ≤ 6 х 4 + | 2 х 3 | + 5 ≤ 6 x 4 + 2 x 4 + 5 x 4 = 13 x 4 {\ displaystyle {\ begin {align} | 6x ^ {4} -2x ^ {3} +5 | \ leq 6x ^ {4} + | 2x ^ {3} | +5 \\ \ leq 6x ^ {4} + 2x ^ {4} + 5x ^ {4} \\ = 13x ^ {4} \ end {align}}}{\ displaystyle {\ begin {align} | 6x ^ {4} -2x ^ {3} +5 | \ leq 6x ^ {4} + | 2x ^ {3} | +5 \\ \ leq 6x ^ {4} + 2x ^ {4} + 5x ^ {4} \\ = 13x ^ {4} \ end {align}}}

так

| 6 х 4 - 2 х 3 + 5 | ≤ 13 х 4. {\ displaystyle | 6x ^ {4} -2x ^ {3} +5 | \ leq 13x ^ {4}.}{\ displaystyle | 6x ^ {4} -2x ^ {3} +5 | \ leq 13x ^ {4}.}

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

Нотация Big O имеет две основные области применения:

. В обоих приложениях функция g (x), обычно выбираемая внутри O (...), обычно выбрано как можно более общие, опуская постоянные множители и члены более низкого порядка.

Есть два формально близких, но выделяющихся, использование этой нотации:

Это различие только в применении, а не в принципе, однако - формальное определение «большого О» одинаково для каждого случая, только с разными ограничениями для аргумента функции.

Бесконечная асимптотика

Графики функций, обычно используемых при анализе алгоритмов, показывающие количество операций в зависимости от размера ввода для каждой функции

Нотация Big O полезна при анализамов для эффективность. Например, время (или количество шагов), необходимое для решения задачи размера n, может оказаться равным T (n) = 4n - 2n + 2. По мере увеличения n член n станет доминирующим, так что всеми остальными членами можно пренебречь - например, когда n = 500, член 4n в 1000 раз больше член 2n. Игнорирование произвольного незначительного влияния на значение выражения для большинства целей. Кроме того, коэффициенты становятся неактуальными при сравнении с другими порядком выражения, например, выражением, содержащим термин n или n. Даже если T (n) = 1000000n, если U (n) = n, последнее всегда будет больше, чем 1000000 (T (1000000) = 1000000 = U (1000000)). Кроме того, количество шагов зависит от деталей модели машины, на которой работает алгоритм, разные типы машин обычно различаются лишь на постоянный коэффициент количества шагов, необходимых для выполнения алгоритма. Таким образом, большая нотация O фиксирует то, что осталось: мы пишем либо

T (n) = O (n 2) {\ displaystyle T (n) = O (n ^ {2})}{\ Displaystyle Т (п) = O (п ^ {2})}

, либо

T (n) ∈ O (n 2) {\ displaystyle T (n) \ in O (n ^ {2})}{\ displaystyle T (n) \ in O ( n ^ {2})}

и скажем, что алгоритм имеет временную сложность порядка n. Знак «=» не предназначенный для выражения «равно» в его обычном математическом смысле, скорее для более разговорного «есть», поэтому второе выражение иногда считается более точным (см. «Знак равенства " обсуждение ниже), Наиболее термины записываются важные функции. в то время как первый вариант как злоупотребление нотацией.

Бесконечно малые асимптотики

Big O также может сообщить ошибки для описания термина в приближение к математической функции. явно, а наименования действующие значимые термины суммируются в один большой член О. Рассмотрим, например, экспоненциальный ряд и два его выражения, которые могут быть, когда x мало:

ex = 1 + x + x 2 2 ! + х 3 3! + х 4 4! + ⋯ для всех x = 1 + x + x 2 2 + O (x 3) при x → 0 = 1 + x + O (x 2) при x → 0 {\ displaystyle {\ begin {align} e ^ {x} = 1 + x + {\ frac {x ^ {2}} {2!}} + {\ Frac {x ^ {3}} {3!}} + {\ Frac {x ^ {4}} {4!}} + \ Dotsb {\ text {для всех}} x \\ = 1 + x + {\ frac {x ^ {2}} {2}} + O (x ^ {3}) {\ text {as}} x \ to 0 \\ = 1 + x + O (x ^ {2}) { \ text {as}} x \ to 0 \\\ end {align}}}{\ displaystyle {\ begin {align} e ^ {x} = 1 + x + {\ frac {x ^ {2}} {2!}} + {\ frac {x ^ {3}} {3! }} + {\ frac {x ^ {4}} {4!}} + \ dotsb {\ text {для всех}} x \\ = 1 + x + {\ frac {x ^ {2}} {2 }} + O (x ^ {3}) {\ text {as}} x \ to 0 \\ = 1 + x + O (x ^ {2}) {\ text {as}} x \ to 0 \\\ конец {выровнен}}}

Второе выражение (с O (x)) означает, что абсолютное значение e - (1 + x + x / 2) не больше нескольких постоянных времен | х | когда x достаточно близко к 0.

Свойства

Если функция f может быть записана как конечная сумма других функций, то самая быстрорастущая из них определяет порядок f (n). Например,

f (n) = 9 log ⁡ n + 5 (log ⁡ n) 4 + 3 n 2 + 2 n 3 = O (n 3) при n → ∞. {\ displaystyle f (n) = 9 \ log n + 5 (\ log n) ^ {4} + 3n ^ {2} + 2n ^ {3} = O (n ^ {3}) \ qquad {\ text { as}} n \ to \ infty.}{\ displaystyle f (n) = 9 \ log n + 5 (\ log n) ^ {4} + 3n ^ {2} + 2n ^ {3} = O (n ^ {3}) \ qquad {\ text {as}} n \ to \ infty.}

В частности, если функция может быть ограничена полиномом от n, тогда, когда n стремится к бесконечности, можно не использовать члены более низкого порядка полинома. Наборы O (n) и O (c) очень разные. Если c больше единицы, то последнее растет намного быстрее. Функция, которая растет быстрее для любого c, называется суперполиномиальной. Функция, которая растет медленнее, чем любая экспоненциальная функция вида c, называется субэкспоненциальной. Для алгоритма может потребоваться время, которое является суперполиномиальным, так и субэкспоненциальным; Примеры этого включают самые быстрые из алгоритмов целочисленной факторизации и функцию n.

Мы игнорируем любую степень внутри логарифмов. Набор O (log n) точно такой же, как O (log (n)). Логарифмы различаются только постоянным множителем (поскольку log (n) = c log n), и, таким образом, большая нотация игнорирует это. Точно так же бревна с разными постоянными основаниями эквивалентны. С другой стороны, экспоненты с разных основаниями не одного порядка. Например, 2 и 3 не одного порядка.

Изменение положения может или не может повлиять на порядок результирующего алгоритма. Изменение эквивалентно умножению форм на константу, где бы она ни появлялась. Например, если алгоритм выполняется в порядке n, замена n на cn означает, что выполняется в порядке cn, а нотация большого O игнорирует константу c. Это можно записать как cn = O (n). Однако, если алгоритм работает в порядке 2, замена n на cn дает 2 = (2). Это не эквивалентно 2 в целом. Изменение размера также может повлиять на порядок результирующего алгоритма. Например, если время выполнения алгоритма равно O (n) при измерении в терминах числа n цифр входного числа x, то его время выполнения равно O (log x) при измерении как функция самого входного числа x., поскольку n = O (журнал x).

Продукт

f 1 = O (g 1) и f 2 = O (g 2) ⇒ f 1 f 2 = O (g 1 g 2) {\ displaystyle f_ {1} = O ( g_ {1}) {\ text {и}} f_ {2} = O (g_ {2}) \ Rightarrow f_ {1} f_ {2} = O (g_ {1} g_ {2})}{\ displaystyle f_ {1} = O (g_ {1}) {\ text {и}} f_ {2} = O (g_ {2}) \ Rightarrow f_ {1} f_ {2} = O (g_ {1} g_ {2})}
е ⋅ O (g) знак равно O (fg) {\ displaystyle f \ cdot O (g) = O (fg)}f \ cdot O (g) = O (fg)

Sum

f 1 = O (g 1) и f 2 = O (g 2) ⇒ f 1 + f 2 = O (max (g 1, g 2)) {\ displaystyle f_ {1} = O (g_ {1}) {\ text {and}} f_ {2} = O (g_ { 2}) \ Rightarrow f_ {1} + f_ {2} = O (\ max (g_ {1}, g_ {2}))}{\ displaystyle f_ {1} = O (g_ {1}) {\ text {и}} f_ {2} = O (g_ {2}) \ Rightarrow f_ {1} + f_ {2} = O (\ max (g_ {1}, g_ {2}))}

Отсюда следует f 1 = O (g) и f 2 Знак равно O (g) ⇒ е 1 + f 2 ∈ O (g) {\ displaystyle f_ {1} = O (g) {\ text {и}} f_ {2} = O (g) \ Rightarrow f_ {1 } + f_ {2} \ in O (g)}f_ {1} = O (g) {\ text {и}} f_ {2} = O (g) \ Rightarrow f_ {1} + f_ {2} \ in O (g) , что означает, что O (g) {\ displaystyle O (g)}O (g) является выпуклым конусом.

Умножение на константу

Пусть k будет постоянным. Тогда:
O (| k | g) = O (g) {\ displaystyle O (| k | g) = O (g)}{\ Displaystyle О (| К | г) = О (г)} , если k не равно нулю.
f = O (ж) ⇒ kf = O (g). {\ displaystyle f = O (g) \ Rightarrow kf = O (g).}{\ displaystyle f = O (g) \ Rightarrow kf = O (g).}

Несколько чисел

Большое O (и маленькое o, Ω и т. д.) также можно использовать с переменными. Чтобы формально определить большой O для нескольких чисел, предположим, что f {\ displaystyle f}f и g {\ displaystyle g}г - две функции, отсутствие в некотором подмножестве Р n {\ displaystyle \ mathbb {R} ^ {n}}\ mathbb {R} ^ {n} . Мы говорим, что

f (x →) равно O (g (x →)), когда x → → ∞ {\ displaystyle f ({\ vec {x}}) {\ text {is}} O (g ({\ vec {x}})) \ quad {\ text {as}} {\ vec {x}} \ to \ infty}{\ displaystyle f ({\ vec {x}}) {\ text {- это }} O (г ({\ vec {x}})) \ quad {\ text {as}} {\ vec {x}} \ to \ infty}

тогда и только тогда, когда

∃ M ∃ C>0 такой, что для всех x → с xi ≥ M для некоторого i, | f (x →) | ≤ C | g (x →) |. {\ displaystyle \ exists M \ exists C>0 ~ {\ text {такой, что для всех}} ~ {\ vec {x}} ~ {\ text {with}} ~ x_ {i} \ geq M ~ {\ текст {для некоторых}} ~ i, | f ({\ vec {x}}) | \ leq C | g ({\ vec {x}}) | ~.}{\displaystyle \exists M\exists C>0 ~ {\ text {такое, что для всех}} ~ {\ vec {x}} ~ {\ text {with}} ~ x_ {i} \ geq M ~ {\ text {для некоторых}} ~ я, | f ({\ vec {x}}) | \ leq C | g ({\ vec {x}}) | ~.}

Эквивалентно условие, что xi ≥ M {\ displaystyle x_ {i} \ geq M}x_ {i} \ geq M для некоторых i {\ displaystyle i}i можно заменить условием, что ‖ x → ‖ ∞ ≥ M {\ displaystyle \ | {\ vec {x}} \ | _ {\ infty} \ geq M}{\ displaystyle \ | {\ vec {x}} \ | _ {\ infty} \ geq M} , где ‖ x → ‖ ∞ {\ displaystyle \ | {\ vec {x}} \ | _ {\ infty}}{\ displaystyle \ | { \ vec {x}} \ | _ {\ infty}} обозначает норму Чебышева. Например, выражение

f (n, m) = n 2 + m 3 + О (n + m) как n, m → ∞ {\ displaystyle f (n, m) = n ^ {2} + m ^ {3} + O (n + m) \ quad {\ text {as}} n, m \ to \ infty}{\ displaystyle f (n, m) = n ^ {2} + m ^ {3} + O (n + m) \ quad {\ text {as}} n, m \ to \ infty}

утверждает, что существует константы C и M такие, что

∀ ‖ (n, m) ‖ ∞ ≥ M: | g (n, m) | ≤ C | п + м | {\ displaystyle \ forall \ | (n, m) \ | _ {\ infty} \ geq M: \ quad | g (n, m) | \ leq C | n + m | ~}{\ displaystyle \ forall \ | (n, m) \ | _ {\ infty} \ geq M: \ quad | g (n, m) | \ leq C | n + m | ~}

где g ( n, m) определяется как

f (n, m) = n 2 + m 3 + g (n, m). {\ displayst yle f (n, m) = n ^ {2} + m ^ {3} + g (n, m) ~.}{\ displaystyle f (n, m) = n ^ {2} + m ^ {3} + g (n, m) ~.}

Это определение допускает все координаты x → {\ displaystyle ~ {\ vec { x}} ~}{\ displaystyle ~ {\ vec {x}} ~} для увеличения до бесконечности. В частности, выражение

f (n, m) = O (nm) как n, m → ∞ {\ displaystyle f (n, m) = O (n ^ {m}) \ quad {\ text {as} } n, m \ to \ infty ~}{\ displaystyle f (n, m) = O (n ^ {m}) \ quad {\ text {as}} n, m \ to \ infty ~}

(т.е. ∃ C ∃ M ∀ n ∀ m… {\ displaystyle \ exists C \ exists M \ forall n \ forall m \ dots}{\ displaystyle \ exists C \ exists M \ forall n \ forall m \ dots} ) сильно отличается от

∀ m: f (n, m) = O (nm) при n → ∞ {\ displaystyle \ forall m \ двоеточие ~ f (n, m) = O (n ^ { m}) \ quad {\ text {as}} n \ to \ infty}{\ Displaystyle \ forall m \ двоеточие ~ f (n, m) = O (n ^ {m}) \ quad { \ text {as}} n \ to \ infty}

(т.е. ∀ m ∃ C ∃ M ∀ n… {\ displaystyle \ forall m \ exists C \ exists M \ forall n \ point}{\ displaystyle \ forall m \ exists C \ exists M \ forall n \ точек} ).

Согласно определению, подмножество, на котором определена функция, имеет значение при обобщении операторов от одного параметра до многомерного. Например, если f (n, m) = 1 {\ displaystyle ~ f (n, m) = 1 ~}{\ displaystyle ~ f (n, м) = 1 ~} и g (n, m) = n {\ displaystyle ~ g (n, m) = n ~}{\ Displaystyle ~ г (п, т) = п ~} , затем f (n, m) = O (g (n, m)) {\ displaystyle ~ f (n, m) = O ( g (n, m)) ~}{\ displaystyle ~ f (n, m) = O (g (n, m)) ~} , если мы ограничим f {\ displaystyle f}f и g {\ displaystyle g}г на [1, ∞) 2 {\ displaystyle ~ [1, \ infty) ^ {2} ~}{\ displaystyle ~ [1, \ infty) ^ {2} ~} , но не, если они устойчивые [0, ∞) 2 { \ displaystyle [0, \ infty) ^ {2} ~}{\ displaystyle [0, \ infty) ^ {2} ~} .

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

Обозначения

Знак равенства

Выражение «f (x) равно O (g (x))», как определено выше, обычно записывается как f (x) = O (г (х)). Некоторые считают, что это использование обозначения, поскольку знак равенства может вводить в заблуждение, так как предполагает симметрию, которая нет в этом утверждении. Как говорит де Брюйн, O (x) = O (x) истинно, а O (x) = O (x) - нет. Кнут представил такие утверждения как «односторонние равенства», поскольку если бы стороны могли быть поменяны местами, «мы могли бы вывести нелепые вещи вроде n = n из тождеств n = O (n) и n = O ( n) ".

По этим причинам это было бы более точно использовать обозначение набора и писать f (x) ∈ O (g (x)), считая O (g (x)) классом всех функций h (x), что | h (x) | ≤ C | g (x) | для некоторой константы C. Однако обычно используется знак равенства. «Is» на английском языке: Аристотель - человек, но человек не обязательно Аристотель ».

Другие арифметические операторы

Обозначение Big O может также служить вместе с другими арифметическими операторами в более сложных уравнениях., h (x) + O (f (x)) обозначает набор функций, имеющих рост h (x) плюс часть, рост которой ограничен ростом f (x). Таким образом,

g (x) = h (x) + O (е (х)) {\ displayst yle g (x) = h (x) + O (f (x))}{\ displaystyle g (x) = h (x) + O (f (x))}

выражает то же самое, что

g (x) - h (x) = O (f (x)). {\ displaystyle g (x) -h (x) = O (f (x)).}{\ displaystyle g (x) -h ( х) = О (е (х)).}

Пример

Предположим, что алгоритм разрабатывается для работы с набором n элементов. Его разработчики предлагают в поиске функции T (n), которая определяет, сколько времени алгоритму для выполнения (в некотором произвольном измерении времени) с точки зрения количества элементов во входном наборе. Алгоритм работает, сначала вызывая подпрограмму для сортировки элементов в наборе, а затем свои собственные операции. Сортировка имеет известную временную сложность O (n), и после запуска подпрограммы алгоритм должен сделать еще 55n + 2n + 10 шагов, прежде чем он завершится. Таким образом, общая временная сложность алгоритма может быть выражена как T (n) = 55n + O (n). Здесь члены 2n + 10 включены в быстрорастущий O (n). Опять же, это использование игнорирует некоторые формальные символы символов «=», но позволяет использовать нотацию большой буквы O в качестве удобного заполнителя.

Многократное использование

В более сложном использовании O (...) может появляться в разных местах уравнения, даже несколько раз с каждой стороны. Например, для n → ∞ {\ displaystyle n \ to \ infty}п \ к \ infty

(n + 1) 2 = n 2 + O (n) {\ displaystyle (n + 1) ^ { 2} = n ^ {2} + O (n)}{\ displaystyle (n + 1) ^ {2} = n ^ {2} + O (n)}
(n + O (n 1/2)) (n + O (log ⁡ n)) 2 = n 3 + O (n 5/2) {\ Displaystyle (п + О (п ^ {1/2})) (п + О (\ журнал п)) ^ {2} =п ^ {3} + О (п ^ {5/2})}{\ displaystyle (n + O (n ^ {1/2})) (n + O ( \ log n)) ^ {2} = n ^ {3} + O (n ^ {5/2})}
п O (1) = O (en). {\ displaystyle n ^ {O (1)} = O (e ^ {n}).}{\ displaystyle n ^ {O (1)} = O (e ^ {n}).}

Смысл таких операторов следующие: для любых функций, которые удовлетворяют каждому O (...) в левой части, есть некоторые функции, так что подстановка всех этих функций в уравнение уравнивает две стороны, O (...) с правой стороны. Например, третье уравнение выше означает: «Для любой функции f (n) = O (1) существует некоторая функция g (n) = O (e) такая, что n = g (n)». В терминах "обозначения числа" выше, это означает, что класс функций, представленный левой стороной, является подмножеством класса функций, представленной правой стороной. В этом случае "=" является формальным символом, который отличается от обычного использования "=" не является симметричным отношением. Таким образом, например, n = O (e) не подразумевает ложное утверждение O (e) = n

Набор текста

Big O состоит только из прописной буквы «O». В отличие от обозначений Бахмана - Ландау с греческими именами, он не требует специальных символов. Тем не менее, часто используются варианты каллиграфии, такие как O {\ displaystyle {\ mathcal {O}}}{\ mathcal {O}} , доступны в LaTeX и производных системах набора.

Порядки общих функций

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

ОбозначениеИмяПример
O (1) {\ displaystyle O (1)}O (1) константа Определение четности или нечетности двоичного числа; Вычисление (- 1) n {\ displaystyle (-1) ^ {n}}(-1)^{n}; Использование таблицы поиска постоянного размера
O (log ⁡ log ⁡ n) {\ displaystyle O (\ log \ log n)}O (\ log \ log n) двойной логарифмическийКоличество сравнений, проведенных для поиска элемента с Использование поиск с интерполяцией в отсортированном массиве равномерно распределенных значений
O (log ⁡ n) {\ displaystyle O (\ log n)}O (\ log n) логарифмический Поиск элемента в отсортированном массиве с двоичным поиском или сбалансированным деревом поиска , а также все операции в биномиальной куче
O ((log ⁡ n) c) {\ displaystyle O ((\ log n) ^ {c})}{\ displaystyle O ((\ log n) ^ {c})} . c>1 {\ displaystyle \ scriptstyle c>1}{\displaystyle \scriptstyle c>1} полилогарифмический упорядочение цепочки матриц может быть решено за полилогарифмическое время на <304c O (n ^ {c}) . 0 < c < 1 {\displaystyle \scriptstyle 0{\ displaystyle \ scriptstyle 0 <c <1} дробная степеньпоиск в дереве kd
O (n) {\ displaystyle O (n)}O (n) линейный Нахождение элемента в несортированном списке или в несортированном массиве; сложение двух n-битных целых чисел с помощью переноса пульсации
O (n log ∗ ⁡ n) {\ displaystyle O (n \ log ^ {*} n)}{\ displaystyle O (n \ log ^ {*} n)} n log-star nВыполнение триангуляция Простое многоугольника с использованием алгоритма Зейделя или алгоритма объединения-поиска. Обратите внимание, что log ∗ ⁡ (n) = {0, если n ≤ 1 1 + log ∗ ⁡ (log ⁡ n), если n>1 {\ displaystyle \ log ^ {*} (n) = { \ begin {case} 0, {\ text {if}} n \ leq 1 \\ 1+ \ log ^ {*} (\ log n), {\ text {if}} n>1 \ end {case }}}\log ^{*}(n)={\begin{cases}0,{\text{if }}n\leq 1\\1+\log ^{*}(\log n),{\text{if }}n>1 \ end {cases}}
O (n log ⁡ n) = O (log ⁡ n!) {\ Displaystyle O (n \ log n) = O (\ log n!)}{\ displaystyle O (n \ log n) = O (\ log n!)} нофмический, логлинейный, квазилинейный или "n log n"Выполнение быстрого преобразования Фурье ; максимально быстрая сравнительная сортировка ; heapsort и сортировка слиянием
O (n 2) {\ displaystyle O (n ^ {2})}O (n ^ {2}) квадратичная Умножение двух n-значных чисел простого алгоритма; простые алгоритмы сортировки, такие как пузырьковая сортировка, сортировка выбора и вставка сортировки ; (худший случай) привязаны к некоторым обычно более быстрым алгоритам сортировки, таким как quicksort, Shellsort и сортировка по
O (nc) {\ displaystyle O (n ^ {c})}O (n ^ {c}) многочлен или алгебраическийграмматика, примыкающая к дереву синтаксический анализ; максимальное соответствие для двудольных графов ; нахождение определителя с помощью разложения LU
L n [α, c] = e (c + o (1)) (ln ⁡ n) α (ln ⁡ ln ⁡ n) 1 - α {\ Displaystyle L_ {п} [\ альфа, с] = е ^ {(с + о (1)) (\ пер п) ^ {\ альфа} (\ пер \ пер п) ^ {1- \ альфа} }}{\ displaystyle L_ {n} [ \ alpha, c] = e ^ {(c + o (1)) (\ ln n) ^ {\ alpha} (\ ln \ ln n) ^ {1- \ alpha}}} . 0 < α < 1 {\displaystyle \scriptstyle 0<\alpha <1}{\ displaystyle \ scriptstyle 0 <\ alpha <1}L-нотация или субэкспоненциальная Факторизация числа с использованием квадратного сита или сита числового поля
O (cn) {\ displaystyle O ( c ^ {n})}O(c^{n}). c>1 {\ displaystyle \ scriptstyle c>1}{\displaystyle \scriptstyle c>1} экспоненциальное Поиск (точного) решения коммивояжера с помощью >; определение эквивалентности двух логических операторов с помощью перебора
O (n!) {\ Displaystyle O (n!)}O (n!) факториала Решение задача коммивояжера с помощью пере; генерация всех неограниченных перестановок poset ; поиск детерминант с разложением Лапласа ; перечисление всех разделов набора

Оператор f (n) = O (n!) {\ displaystyle f (n) = O (n!)}{\ displaystyle f (n) = O (n!)} иногда ослабляется в f (n) = O (nn) {\ displaystyle f (n) = O \ left (n ^ {n} \ right)}{\ displaystyle f (n) = O \ left (n ^ {n} \ right)} , чтобы получить более простые формулы для асимптотической сложности. Для любого k>0 {\ displaystyle k>0}k>0 и c>0 {\ displaystyle c>0}c>0 , O (nc (log ⁡ n) k) {\ displaystyle O (n ^ {c} ( \ log n) ^ {k})}О (п ^ {с} (\ журнал п) ^ {к}) является подмножеством O (nc + ε) {\ displaystyle O (n ^ {c + \ varepsilon})}{\ displaystyle O (n ^ {c + \ varepsilon})} для любого ε>0 {\ displaystyle \ varepsilon>0}{\displaystyle \varepsilon>0} , поэтому его можно рассматривать как полином большего порядка.

Связанные асимптотические обозначения

Big O - наиболее часто используемая асимптотика для сравнения. функций. Вместе с другими другими связанными обозначениями он образует семейство y обозначений Бахмана - Ландау.

Небольшое обозначение

Интуитивно, утверждение «f (x) есть o (g (x))» (читается «f (x) мало-o от g (x)» ") означает, что g (x) растет намного быстрее, чем f (x). Как и раньше, f будет вещественной или комплексной функцией, а g - вещественная функция, обе на некотором неограниченном подмножестве положительных вещественных чисел, так что g (x) строго положительна для всех достаточно больших значений Икс. Один записывает

f (x) = o (g (x)) как x → ∞ {\ displaystyle f (x) = o (g (x)) \ quad {\ text {as}} x \ to \ infty}{\ displaystyle f ( x) = o (g (x)) \ quad {\ текст {as}} x \ to \ infty}

, если для любой положительной константы ε существует такая константа N, что

| f (x) | ≤ ε g (x) для всех x ≥ N. {\ displaystyle | f (x) | \ leq \ varepsilon g (x) \ quad {\ text {for all}} x \ geq N.}{\ displaystyle | f (x) | \ leq \ varepsilon g (x) \ quad {\ text {для всех}} x \ geq N.}

Например, у одного есть

2 x знак равно о (Икс 2) {\ Displaystyle 2x = о (х ^ {2})}{\ displaystyle 2x = о (х ^ {2})} и 1 / х = о (1). {\ Displaystyle 1 / х = о (1).}{\ displaystyle 1 / x = o (1). }

Разница между предыдущим определением для обозначен Первая по крайней мере одна константы M, последняя должна быть какой-либо положительной константы ε, какой бы малой она ни была. Таким образом, нотация small-o делает более сильное утверждение, чем соответствующая нотация big-O: каждая функция, которая является big-O для g, также является большой-O для g, но не каждая функция, которая big-O для g, также является мало-о г. Например, 2 x 2 = O (x 2) {\ displaystyle 2x ^ {2} = O (x ^ {2})}{\ displaystyle 2x ^ {2} = O (x ^ {2})} но 2 x 2 ≠ o (x 2). {\ displaystyle 2x ^ {2} \ neq o (x ^ {2}).}{\ displaystyle 2x ^ {2} \ neq o (x ^ {2}).}

Буква g (x) отличен от нуля или, по крайней мере, становится ненулевым после стандартной точки, отношение f (x) знак равно о (г (х)) {\ displaystyle f (x) = o (g (x))}{\ displaystyle f (x) = o (g (x))} эквивалентно

lim x → ∞ f (x) g (x) = 0 {\ displaystyle \ lim _ {x \ to \ infty} {\ frac {f (x)} {g (x)}} = 0}{\ displaystyle \ lim _ {x \ to \ infty} {\ frac { е (х)} {г (х)}} = 0} (именно так Ландау установлен определил маленькую -o нотация).

Мало-о соблюдает ряд арифметических операций. Например,

, если c - ненулевая константа и f = o (g) {\ displaystyle f = o (g)}{\ displaystyle f = o (g)} , то c ⋅ f = o (g) {\ displaystyle c \ cdot f = o (g)}{\ displaystyle c \ cdot f = o (g)} и
, если f = o (F) {\ displaystyle f = o (F)}{\ displaystyle f = o (F)} и g = o (G) {\ displaystyle g = o (G)}{\ displaystyle g = o (G)} , затем f ⋅ g = o (F ⋅ G). {\ displaystyle f \ cdot g = o (F \ cdot G).}{\ displaystyle f \ cdot g = o (F \ cdot G).}

Он также удовлетворяет действию транзитивности :

если f = o (g) {\ displaystyle f = о (g)}{\ displaystyle f = o (g)} и g = o (h) {\ displaystyle g = o (h)}{\ displaystyle g = o (h)} , f = o (h). {\ displaystyle f = o (h).}{\ displaystyle f = o (h).}

Обозначение Big Omega

Еще одно асимптотическое обозначение - Ω {\ displaystyle \ Omega}\ Omega , читается как «big Omega ». К сожалению, есть два широко распространенных и несовместимых определения выражения

f (x) = Ω (g (x)) {\ displaystyle f (x) = \ Omega (g (x))}f (x) = \ Omega (g (x)) как x → a, {\ displaystyle x \ rightarrow a,}{\ displaystyle x \ rightarrow a,} ,

где a - некоторое действительное число, ∞ или −∞, где f и g - действующие функции, условия в окрестности a, и где g положительна в этой окрестности.

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

Определение Харди - Литтлвуда

В 1914 году Годфри Гарольд Харди и Джон Эденсор Литтлвуд представили новый символ Ω {\ displaystyle \ Omega }\ Omega , который определяется следующим образом:

f (x) = Ω (g (x)) {\ displaystyle f (x) = \ Omega (g (x))}{\ displaystyle f (x) = \ Omega (g (x))} как x → ∞ {\ displaystyle x \ rightarrow \ infty}x\rightarrow\inftyесли lim sup x → ∞ | f (x) g (x) |>0. {\ displaystyle \ limsup _ {x \ to \ infty} \ left | {\ frac {f (x)} {g (x)}} \ right |>0.}{\displaystyle \limsup _{x\to \infty }\left|{\frac {f(x)}{g(x)}}\right|>0.}

Таким образом, f (x) = Ω (g (x)) {\ displaystyle f (x) = \ Omega (g (x))}f (x) = \ Omega (g (x)) - отрицание f (x) = o (g (x)) {\ displaystyle f (x) = o (g (x))}f (x) = o (g (x)) .

В 1916 году те же авторы ввели два новых символа Ω R {\ displaystyle \ Omega _ {R}}\ Omega _ {R} и Ω L {\ displaystyle \ Omega _ {L}}\ Omega _ {L} , определяемый как:

f (x) = Ω R (g (x)) {\ displaystyle f (x) = \ Omega _ {R} (g (x))}е (х) = \ Omega _ {R} (g (x)) как x → ∞ {\ displaystyle x \ rightarrow \ infty}x\rightarrow\infty, если lim sup x → ∞ е (х) г (х)>0 {\ displaystyle \ limsup _ {x \ to \ infty} {\ frac {f (x)} {g (x)}}>0}{\displaystyle \limsup _{x\to \infty }{\frac {f(x)}{g(x)}}>0} ;
f (x) = Ω L (g (x)) {\ displaystyle f (x) = \ Omega _ {L} (g (x))}f (x) = \ Omega _ {L} (g (x)) как x → ∞ {\ displaystyle x \ rightarrow \ infty}x\rightarrow\inftyесли lim inf x → ∞ f (x) g (x) < 0. {\displaystyle \liminf _{x\to \infty }{\frac {f(x)}{g(x)}}<0.}{\ Displaystyle \ liminf _ {х \ к \ infty} {\ frac {f (x)} {g (x)}} <0.}

Эти символы использовались Эдмундом Ландау с теми же значениями в 1924 году. После Ландау эти обозначения больше никогда не использовались именно так; Ω R {\ displaystyle \ Omega _ {R}}\ Omega _ {R} стало Ω + {\ displaystyle \ Omega _ {+}}\ Omega _ {+} и Ω L { \ displaystyle \ Omega _ {L}}\ Omega _ {L} стал Ω - {\ displaystyle \ Omega _ {-}}\ Omega _ {-} .

Эти три символа Ω, Ω +, Ω - {\ displaystyle \ Omega, \ Omega _ {+}, \ Omega _ {-}}\ Omega, \ Omega _ {+}, \ Omega _ {-} , а также f (x) = Ω ± (g (x)) {\ displaystyle f (x) = \ Omega _ {\ pm} (g (x))}f (x) = \ Omega _ {\ pm} ( г (х)) (что означает, что f (x) = Ω + (g (x)) {\ displaystyle f (x) = \ Omega _ {+} (g (x))}f (x) = \ Omega _ {+} (g (x)) и f (x) = Ω - (g (x)) {\ displaystyle f (x) = \ Omega _ {-} (g (x))}f (x) = \ Omega _ {-} (g (x)) удовлетворены), в настоящее время используются в аналитической теории чисел.

Простые примеры

У нас есть

sin ⁡ x = Ω (1) {\ displaystyle \ sin x = \ Omega (1)}{\ displaystyle \ sin x = \ Omega (1)} как x → ∞, {\ displaystyle x \ rightarrow \ infty,}{\ displaystyle x \ rightarrow \ infty,}

и, точнее,

sin ⁡ x Знак равно Ω ± (1) {\ displaystyle \ sin x = \ Omega _ {\ pm} (1)}{\ displaystyle \ sin x = \ Omega _ {\ pm} (1)} как x → ∞. {\ displaystyle x \ rightarrow \ infty.}{ \ displaystyle x \ rightarrow \ infty.}

Мы имеем

sin ⁡ x + 1 = Ω (1) {\ displaystyle \ sin x + 1 = \ Omega (1)}{\ displaystyle \ sin x + 1 = \ Omega (1)} как Икс → ∞, {\ Displaystyle x \ rightarrow \ infty,}{\ displaystyle x \ rightarrow \ infty,}

и, точнее,

sin ⁡ x + 1 = Ω + (1) {\ displaystyle \ sin x + 1 = \ Omega _ { +} (1)}{\ displaystyle \ sin x + 1 = \ Omega _ {+} (1)} при x → ∞; {\ displaystyle x \ rightarrow \ infty;}{\ displaystyle x \ rightarrow \ infty;}

однако

грех ⁡ x + 1 ≠ Ω - (1) {\ displaystyle \ sin x + 1 \ not = \ Omega _ {-} (1)}{\ displaystyle \ sin x + 1 \ not = \ Omega _ {-} (1)} при x → ∞. {\ displaystyle x \ rightarrow \ infty.}{ \ displaystyle x \ rightarrow \ infty.}

Определение Кнута

В 1976 Дональд Кнут опубликовал статью, в которой обосновал использование Ω {\ displaystyle \ Omega }\ Omega -символ для описания более сильного свойства. Кнут писал: «Для всех приложений, которые я видел до сих пор в информатике, более строгие требования... гораздо более уместны». Он определил

f (x) = Ω (g (x)) ⇔ g (x) = O (f (x)) {\ displaystyle f (x) = \ Omega (g (x)) \ Leftrightarrow g ( x) = O (f (x))}f (x) = \ Omega (g (x)) \ Leftrightarrow g (x) = O (f (x))

с комментарием: «Хотя я изменил определение Харди и Литтлвуда для Ω {\ displaystyle \ Omega}\ Omega , я считаю, что так что их определение отнюдь не широко используется, и потому что есть другие способы сказать то, что они хотят сказать, в сравнительно редких случаях, когда их определение применимо. "

Семейство нотатов Бахмана – Ландау

ОбозначениеИмяОписаниеФормальное определениеОпределение предела
f (n) = O (g (n)) {\ displaystyle f (n) = O (g (n))}f (n) = O (g (n)) Большой O; Большой Ох; Большой Омикрон| f | {\ displaystyle | f |}| f | асимптотически ограничено g (с точностью до постоянного множителя)∃ k>0 ∃ n 0 ∀ n>n 0: | f (n) | ≤ К ⋅ г (N) {\ Displaystyle \ существует к>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие | f (n) | \ leq k \ cdot g (n)}{\displaystyle \exists k>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие | f (n) | \ leq k \ cdot g (n)} lim sup n → ∞ | f (n) | g (n) < ∞ {\displaystyle \limsup _{n\to \infty }{\frac {\left|f(n)\right|}{g(n)}}<\infty }{\ displaystyle \ limsup _ {n \ to \ infty} {\ frac {\ left | f (n) \ right |} {g (n)}} <\ infty}
f ( n) = Θ (g (n)) {\ displaystyle f (n) = \ Theta (g (n))}f (n) = \ Theta (g (n)) Большая Thetaf ограничено как сверху, так и снизу с помощью g асимптотически∃ К 1>0 ∃ К 2>0 ∃ N 0 ∀ N>N 0: {\ Displaystyle \ существует k_ {1}>0 \ существует k_ {2}>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие}{\displaystyle \exists k_{1}>0 \ существует k_ {2}>0 \ существует n_ {0} \ forall n>n_ {0} \ Colon} k 1 ⋅ g (n) ≤ f (n) ≤ k 2 ⋅ g ( п) {\ Displaystyle к_ {1} \ CDOT г (п) \ Leq F (п) \ Leq K_ {2} \ CDOT г (п)}{\ displaystyle k_ {1} \ cdot g (n) \ leq f (n) \ leq k_ {2} \ cdot g (n)} F (п) = О (г (п)) { \ displaystyle f (n) = O (g (n))}f (n) = O (g (n)) и d f (n) = Ω (g (n)) {\ displaystyle f (n) = \ Omega (g (n))}е (п) = \ Омега (г (п)) (версия Кнута)
f (n) = Ω (g (n)) {\ displaystyle f (n) = \ Omega (g (n))}е (п) = \ Омега (г (п)) Большая Омега в теории сложности (Кнут)f асимптотически ограничена g снизу∃ К>0 ∃ N 0 ∀ N>N 0: е (n) ≥ К ⋅ g (n) {\ displaystyle \ exists k>0 \ exists n_ {0} \ forall n>n_ {0} \ двоеточие f (n) \ geq k \ cdot g (n)}{\displaystyle \exists k>0 \ exists n_ {0} \ forall n>n_ {0} \ двоеточие f (n) \ geq k \ cdot g (n) } lim inf n → ∞ е (п) г (п)>0 {\ displaystyle \ liminf _ {n \ to \ infty} {\ frac {f (n)} {g (n)}}>0}{\displaystyle \liminf _{n\to \infty }{\frac {f(n)}{g(n)}}>0}
f (n) = о (г (п)) {\ Displaystyle е (п) = о (г (п))}f (n) = o (g (n)) Маленький О; Маленький Ohf асимптотически преобладает над g∀ k>0 ∃ n 0 ∀ n>n 0: | f (n) | < k ⋅ g ( n) {\displaystyle \forall k>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие | f (n) | {\displaystyle \forall k>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие | f (n) | <k\cdot g(n)}lim n → ∞ | е (п) | г (п) знак равно 0 {\ displaystyle \ lim _ {n \ to \ infty} {\ frac {\ left | е (n) \ право |} {g (n)}} = 0}{\ displaystyle \ lim _ {n \ to \ infty} {\ frac {\ left | f (n) \ right |} {g (n)}} = 0}
f (n) ∼ g (n) {\ displaystyle f (n) \ sim g (n)}{\ displaystyle f (n) \ sim g (n)} Порядкаf равно асимптотически равно g∀ ε>0 ∃ n 0 ∀ n>n 0: | f (n) g (n) - 1 | < ε {\displaystyle \forall \varepsilon>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие \ left | {f (n) \ над g (n)} - 1 \ right | <\varepsilon }{\displaystyle \forall \varepsilon>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие \ left | {f (N) \ над г (N)} - 1 \ справа | <\varepsilon }lim n → ∞ е (n) g (n) = 1 {\ displaystyle \ lim _ {n \ to \ infty} {f (n) \ над g (n)} = 1}{\ displaystyle \ lim _ {п \ к \ infty} {е (п) \ над g (n)} = 1}
f ( n) = ω (g (n)) {\ displaystyle f (n) = \ omega (g (n))}f (n) = \ omega (g (n)) Маленькая Омегаf доминирует над g асимптотическим ly∀ k>0 ∃ n 0 ∀ n>n 0: | f (n) |>k ⋅ | г (п) | {\ displaystyle \ forall k>0 \ exists n_ {0} \ forall n>n_ {0} \ двоеточие | f (n) |>k \ cdot | g (n) |}{\displaystyle \forall k>0 \ существует n_ {0} \ forall n>n_ {0} \ двоеточие | f (n) |>k \ cdot | g (n) |} lim n → ∞ | е (n) g (n) | знак равно ∞ {\ displaystyle \ lim _ {n \ к \ infty} \ влево | {\ гидроразрыва {f (n)} {g (n)}} \ right | = \ infty}{\ displaystyle \ lim _ {n \ to \ infty} \ left | {\ frac {f (n)} {g (n)}} \ right | = \ infty}
f (n) = Ω (g (n)) {\ displaystyle f (n) = \ Omega (g (n))}е (п) = \ Омега (г (п)) Большая Омега в теории чисел (Харди - Литтлвуд)| f | {\ displaystyle | f |}| f | асимптотически не доминирует g∃ К>0 ∀ N 0 ∃ N>N 0: | е (п) | ≥ к ⋅ g ( n) {\ displaystyle \ exists k>0 \ forall n_ {0} \ exists n>n_ {0} \ двоеточие | f (n) | \ geq k \ cdot g (n)}{\displaystyle \exists k>0 \ forall n_ {0} \ exists n>n_ {0} \ двоеточие | f (n) | \ geq k \ cdot g (n)} lim sup n → ∞ | f (n) g (n) |>0 {\ displaystyle \ limsup _ {n \ to \ infty} \ left | {\ frac {f (n)} {g (n)}} \ right |>0}{\displaystyle \limsup _{n\to \infty }\left|{\frac {f(n)}{g(n)}}\right|>0}

Определения пределов предполагают g (n)>0 {\ displaystyle g (n)>0}{\displaystyle g(n)>0} для достаточно большого n. Таблица (частично) отсортирована от наименьшего к наибольшему в том смысле, что o, O, Θ, ∼, (версия Кнута) Ω, ω на функции соответствуют <, ≤, ≈, =, ≥,>на вещественной прямой прямой (версия Харди-Литтлвуда Ω, однако, никакому такому описанию) не соответствует).

Информатика использует нотации большого O, большого Theta Θ, маленького o, маленького omega ω и большого Omega Ω Кнута. Аналитическая теория чисел часто использует большие O, маленькие o, большие Omega Ω Харди - Литтлвуда (с индексами +, - или ± или без них) и обозначения ∼ {\ displaystyle \ sim}\ sim . Строчная нотация омега ω не так часто используется в анализе.

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

Неформально, особенно в информатике, большая нотация O часто может использоваться несколько иначе для описания асимптотики. плотная граница, где использование большой нотации Theta might может быть более уместным в данном контексте. Например, при рассмотрении функции T (n) = 73n + 22n + 58 все нижеследующее обычно является приемлемым, но более жесткие границы (такие как числа 2 и 3 ниже) обычно предпочтительнее более свободных границ (например, числа 1 ниже).

  1. T (n) = O (n)
  2. T (n) = O (n)
  3. T (n) = Θ (n)

Эквивалентные английские утверждения соответственно:

  1. T (n) растет асимптотически не быстрее, чем n
  2. T (n) растет асимптотически не быстрее, чем n
  3. T (n) растет асимптотически с n.

Итак, хотя все три утверждения верны, в каждом содержится все больше информации. Однако в некоторых полях большая нотация O (цифра 2 в приведенных выше списках) будет использоваться чаще, чем большая нотация Theta (элементы с номером 3 в списках выше). Например, если T (n) представляет время работы недавно разработанного алгоритма для входного размера n, изобретатели и пользователи алгоритма могут быть более склонны устанавливать верхнюю асимптотическую границу того, сколько времени потребуется для выполнения, не делая явное утверждение о нижней асимптотической оценке.

Другие обозначения

В своей книге Введение в алгоритмы, Cormen, Leiserson, Rivest и Стейн рассмотрим набор функций f, которые удовлетворяют

f (n) = O (g (n)) (n → ∞). {\ displaystyle f (n) = O (g (n)) \ quad (n \ rightarrow \ infty) ~.}{\ displaystyle f (n) = O (g (n)) \ quad (n \ rightarrow \ infty) ~.}

В правильной записи этот набор можно, например, назвать O (g), где

O (g) = {f: {\ displaystyle O (g) = \ {f:}{\ displaystyle O (g) = \ {f:} существуют положительные константы c и n 0 {\ displaystyle n_ {0}}n_ {0} такое, что 0 ≤ f (n) ≤ cg (n) {\ displaystyle 0 \ leq f (n) \ leq cg (n)}{\ displaystyle 0 \ leq f (n) \ leq cg (n)} для всех n ≥ n 0} {\ displaystyle n \ geq n_ {0} \}}{\ Displaystyle п \ GEQ п_ {0 } \}} .

Авторы заявляют, что использование оператора равенства (=) для обозначения членства в множестве, а не оператора членства в множестве (∈) является злоупотреблением нотацией, но в этом есть свои преимущества. Внутри уравнения или неравенства использование асимптотической записи обозначает анонимную функцию в множестве O (g), что исключает члены более низкого порядка и помогает уменьшить несущественный беспорядок в уравнениях, например:

2 n 2 + 3 п + 1 знак равно 2 п 2 + О (п). {\ displaystyle 2n ^ {2} + 3n + 1 = 2n ^ {2} + O (n).}{\ displaystyle 2n ^ {2} + 3n + 1 = 2n ^ {2} + O (n).}

Расширения нотаций Бахмана – Ландау

Еще одно обозначение, которое иногда используется в информатике, - это Õ (читайте soft-O): f (n) = Õ (g (n)) - это сокращение от f (n) = O (g (n) log g (n)) для некоторого k. По сути, это большая нотация O, игнорирующая логарифмические факторы, потому что эффекты скорости роста некоторой другой суперлогарифмической функции указывают на взрыв скорости роста для входных параметров большого размера, которые более важны для прогнозирования плохой производительности во время выполнения, чем более точные -точечные эффекты, вносимые логарифмическими факторами роста. Это обозначение часто используется, чтобы избежать «придирок» в пределах темпов роста, которые заявлены как слишком жестко ограниченные для рассматриваемых вопросов (поскольку log n всегда o (n) для любой константы k и любого ε>0).

Также обозначение L, определенное как

L n [α, c] = e (c + o (1)) (ln ⁡ n) α (ln ⁡ ln ⁡ п) 1 - α {\ Displaystyle L_ {п} [\ альфа, с] = е ^ {(с + о (1)) (\ ln n) ^ {\ альфа} (\ ln \ ln n) ^ {1 - \ alpha}}}{\ displaystyle L_ {n} [ \ alpha, c] = e ^ {(c + o (1)) (\ ln n) ^ {\ alpha} (\ ln \ ln n) ^ {1- \ alpha}}}

удобен для функций, которые находятся между полиномом и экспонентой в терминах ln ⁡ n {\ displaystyle \ ln n}\ ln п .

Обобщения и связанные с ними виды использования

Обобщение на функции, принимающие значения в любом нормированном векторном пространстве, является простым (заменяя абсолютные значения нормами), где f и g не должны принимать свои значения в одном и том же пространстве.. Также возможно обобщение на функции g, принимающие значения в любой топологической группе . «Ограничивающий процесс» x → x o также можно обобщить, введя произвольную базу фильтра, то есть на направленные сети f и g. Обозначение o может использоваться для определения производных и дифференцируемости в довольно общих пространствах, а также (асимптотической) эквивалентности функций,

f ∼ g ⟺ (f - g) ∈ о (g) {\ displaystyle f \ sim g \ iff (fg) \ in o (g)}f \ sim g \ iff (fg) \ in o (g)

, которое является отношением эквивалентности и более ограничительным понятием, чем отношение «f есть Θ ( г) «сверху. (Он сводится к lim f / g = 1, если f и g - положительные вещественные функции.) Например, 2x - это Θ (x), но 2x - x не является o (x).

История (обозначения Бахмана – Ландау, Харди и Виноградова)

Символ O был впервые введен теоретиком чисел Полом Бахманном в 1894 году во втором томе его книга Analytische Zahlentheorie ("аналитическая теория чисел "). Теоретик чисел Эдмунд Ландау принял его и, таким образом, был вдохновлен ввести в 1909 году обозначение o; поэтому оба теперь называются символами Ландау. Эти обозначения использовались в прикладной математике в 1950-х годах для асимптотического анализа. Символ Ω {\ displaystyle \ Omega}\ Omega (в смысле «не является o of») был введен в 1914 году Харди и Литтлвудом. Харди и Литтлвуд также ввели в 1918 году символы Ω R {\ displaystyle \ Omega _ {R}}\ Omega _ {R} («справа») и Ω L {\ displaystyle \ Omega _ {L}. }\ Omega _ {L} («слева»), предшественники современных символов Ω + {\ displaystyle \ Omega _ {+}}\ Omega _ {+} («не меньше маленького o из») и Ω - {\ displaystyle \ Omega _ {-}}\ Omega _ {-} ("не больше, чем малое o"). Таким образом, символы Омеги (с их первоначальным значением) иногда также называют «символами Ландау». Это обозначение Ω {\ displaystyle \ Omega}\ Omega стало широко использоваться в теории чисел, по крайней мере, с 1950-х годов. В 1970-х годах большая O была популяризирована в компьютерных науках Дональдом Кнутом, который ввел соответствующую нотацию Theta и предложил другое определение для обозначения Omega.

Ландау никогда не использовал большую Theta. и маленькие символы омега.

символы Харди были (в терминах современной нотации O)

f ≼ g ⟺ f ∈ O (g) {\ displaystyle f \ preccurlyeq g \ iff f \ in O (g)}{\ displaystyle f \ preccurlyeq g \ iff f \ in O (g)} и f ≺ g ⟺ f ∈ o (g); {\ displaystyle f \ prec g \ iff f \ in o (g);}f \ Prec g \ iff f \ in o (g);

(Харди, однако, никогда не определял и не использовал обозначение ≺ ≺ {\ displaystyle \ prec \! \! \ Prec}\ Prec \! \! \ prec , ни ≪ {\ displaystyle \ ll}\ ll , как иногда сообщалось). Харди представил символы ≼ {\ displaystyle \ preccurlyeq}\ preccurlyeq и ≺ {\ displaystyle \ prec}\ Prec (а также некоторые другие символы) в своем трактате 1910 г. " Ордена бесконечности », и использовал их только в трех статьях (1910–1913). В своих почти 400 оставшихся статьях и книгах он постоянно использовал символы Ландау O и o.

Обозначения Харди больше не используются. С другой стороны, в 1930-х годах русский теоретик чисел Иван Матвеевич Виноградов ввел свою нотацию ≪ {\ displaystyle \ ll}\ ll , которая все чаще использовалась в теории чисел. вместо обозначения O {\ displaystyle O}O . У нас есть

f ≪ g ⟺ f ∈ O (g), {\ displaystyle f \ ll g \ iff f \ in O (g),}е \ ll g \ iff f \ in O (g),

, и часто оба обозначения используются в одной и той же статье.

Большой-O первоначально означает «порядок» («Ordnung», Bachmann 1894) и, таким образом, является латинской буквой. Ни Бахманн, ни Ландау никогда не называли его «Омикрон». Значительно позже (1976 г.) Кнут рассматривал этот символ как заглавную омикрон, вероятно, в связи с его определением символа Омега. Цифру ноль использовать не следует.

См. Также

Ссылки и примечания

Дополнительная литература

Внешние ссылки

В Викибуке Структуры данных есть страница по теме: Нотация Big-O
Викиверситет решил Задача MyOpenMath с использованием нотации Big-O
Последняя правка сделана 2021-05-12 05:01:24
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте