Нотация Big O - это математическая запись, которая имеет ограничивающее поведение функции , когда аргумент стремится к определенному значению или бесконечности. Big O является членом семейства нотаций, изобретенных Полом Бахманном, Эдмундом Ландау и другими, которые в совокупности ас именуются нотацией Бахмана - Ландау или>имптотическими нотациями .
В информатике нотация большого O используется для классификации алгоритмов в соответствии с тем, как их время выполнения или требований к пространству растут по мере увеличения размера ввода. В аналитической теории чисел нотация большой буквы O часто используется для выражения границы разницы между арифметической функцией и более понятным приближением; известный пример такой разницы - остаточный член в теореме о простых числах..
Нотация Big O соответствует функциям с одинаковой скоростью роста O.
Буква O используется, потому что скорость роста также называется порядком функции . Описание функций в терминах нотации большого O обычно дает только верхнюю границу скорости функции роста. С обозначением большого количества связанных обозначений, в которых используются символы o, Ω, ω и Θ для описания других видов ограничений на асимптотические скорости роста.
Обозначение Big O также используется во многих других областях получения аналогичных оценок.
Пусть f будет вещественным или комплексная значная функция и g вещественнозначная функция. Пусть обе функции на некотором некотором неограниченном подмножестве положительных вещественных чисел и будет строго положительным для всех достаточно больших значений x. Один записывает
, если абсолютное значение из является не более чем положительной константой кратное для всех достаточно больших значений x. То есть , если есть существует положительное действительное число M и действительное число x 0 такие, что
Во многих контекстах предположение, что мы добавляем в росте скорость, когда переменная x стремится к бесконечности, остается неустановленной, и проще записать, что
Обозначение также может быть для описания поведения около некоторого действительного числа a (часто a = 0): мы говорим
, если существуют положительные числа и M такие, что для всех x с ,
График g (x) выбрано ненулевым для значений x , достаточно близких к a, оба из этих определений можно объединить с помощью верхнего предела :
, если
В типичном обозначении обозначения O является асимптотическим, то есть относится к очень большим 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) эквивалентно его расширению,
для подходящего выбора из x 0 и M и для всех x>x 0. Чтобы доказать это, пусть x 0 = 1 и M = 13. Тогда для всех x>x 0:
так
Нотация 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 фиксирует то, что осталось: мы пишем либо
, либо
и скажем, что алгоритм имеет временную сложность порядка n. Знак «=» не предназначенный для выражения «равно» в его обычном математическом смысле, скорее для более разговорного «есть», поэтому второе выражение иногда считается более точным (см. «Знак равенства " обсуждение ниже), Наиболее термины записываются важные функции. в то время как первый вариант как злоупотребление нотацией.
Big O также может сообщить ошибки для описания термина в приближение к математической функции. явно, а наименования действующие значимые термины суммируются в один большой член О. Рассмотрим, например, экспоненциальный ряд и два его выражения, которые могут быть, когда x мало:
Второе выражение (с O (x)) означает, что абсолютное значение e - (1 + x + x / 2) не больше нескольких постоянных времен | х | когда x достаточно близко к 0.
Если функция f может быть записана как конечная сумма других функций, то самая быстрорастущая из них определяет порядок f (n). Например,
В частности, если функция может быть ограничена полиномом от 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).
Отсюда следует , что означает, что является выпуклым конусом.
Большое O (и маленькое o, Ω и т. д.) также можно использовать с переменными. Чтобы формально определить большой O для нескольких чисел, предположим, что и - две функции, отсутствие в некотором подмножестве . Мы говорим, что
тогда и только тогда, когда
Эквивалентно условие, что для некоторых можно заменить условием, что , где обозначает норму Чебышева. Например, выражение
утверждает, что существует константы C и M такие, что
где g ( n, m) определяется как
Это определение допускает все координаты для увеличения до бесконечности. В частности, выражение
(т.е. ) сильно отличается от
(т.е. ).
Согласно определению, подмножество, на котором определена функция, имеет значение при обобщении операторов от одного параметра до многомерного. Например, если и , затем , если мы ограничим и на , но не, если они устойчивые .
Это не единственное обобщение большого 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). Таким образом,
выражает то же самое, что
Предположим, что алгоритм разрабатывается для работы с набором n элементов. Его разработчики предлагают в поиске функции T (n), которая определяет, сколько времени алгоритму для выполнения (в некотором произвольном измерении времени) с точки зрения количества элементов во входном наборе. Алгоритм работает, сначала вызывая подпрограмму для сортировки элементов в наборе, а затем свои собственные операции. Сортировка имеет известную временную сложность O (n), и после запуска подпрограммы алгоритм должен сделать еще 55n + 2n + 10 шагов, прежде чем он завершится. Таким образом, общая временная сложность алгоритма может быть выражена как T (n) = 55n + O (n). Здесь члены 2n + 10 включены в быстрорастущий O (n). Опять же, это использование игнорирует некоторые формальные символы символов «=», но позволяет использовать нотацию большой буквы O в качестве удобного заполнителя.
В более сложном использовании O (...) может появляться в разных местах уравнения, даже несколько раз с каждой стороны. Например, для
Смысл таких операторов следующие: для любых функций, которые удовлетворяют каждому O (...) в левой части, есть некоторые функции, так что подстановка всех этих функций в уравнение уравнивает две стороны, O (...) с правой стороны. Например, третье уравнение выше означает: «Для любой функции f (n) = O (1) существует некоторая функция g (n) = O (e) такая, что n = g (n)». В терминах "обозначения числа" выше, это означает, что класс функций, представленный левой стороной, является подмножеством класса функций, представленной правой стороной. В этом случае "=" является формальным символом, который отличается от обычного использования "=" не является симметричным отношением. Таким образом, например, n = O (e) не подразумевает ложное утверждение O (e) = n
Big O состоит только из прописной буквы «O». В отличие от обозначений Бахмана - Ландау с греческими именами, он не требует специальных символов. Тем не менее, часто используются варианты каллиграфии, такие как , доступны в LaTeX и производных системах набора.
Вот список функций, которые обычно встречаются при анализе времени работы алгоритма. В каждом случае c - положительная константа, неограниченно возрастает. Обычно сначала медленнорастущие функции.
Обозначение | Имя | Пример | ||
---|---|---|---|---|
константа | Определение четности или нечетности двоичного числа; Вычисление ; Использование таблицы поиска постоянного размера | |||
двойной логарифмический | Количество сравнений, проведенных для поиска элемента с Использование поиск с интерполяцией в отсортированном массиве равномерно распределенных значений | |||
логарифмический | Поиск элемента в отсортированном массиве с двоичным поиском или сбалансированным деревом поиска , а также все операции в биномиальной куче | |||
. | полилогарифмический | упорядочение цепочки матриц может быть решено за полилогарифмическое время на <304c | дробная степень | поиск в дереве kd |
линейный | Нахождение элемента в несортированном списке или в несортированном массиве; сложение двух n-битных целых чисел с помощью переноса пульсации | |||
n log-star n | Выполнение триангуляция Простое многоугольника с использованием алгоритма Зейделя или алгоритма объединения-поиска. Обратите внимание, что | |||
нофмический, логлинейный, квазилинейный или "n log n" | Выполнение быстрого преобразования Фурье ; максимально быстрая сравнительная сортировка ; heapsort и сортировка слиянием | |||
квадратичная | Умножение двух n-значных чисел простого алгоритма; простые алгоритмы сортировки, такие как пузырьковая сортировка, сортировка выбора и вставка сортировки ; (худший случай) привязаны к некоторым обычно более быстрым алгоритам сортировки, таким как quicksort, Shellsort и сортировка по | |||
многочлен или алгебраический | грамматика, примыкающая к дереву синтаксический анализ; максимальное соответствие для двудольных графов ; нахождение определителя с помощью разложения LU | |||
. | L-нотация или субэкспоненциальная | Факторизация числа с использованием квадратного сита или сита числового поля | ||
. | экспоненциальное | Поиск (точного) решения коммивояжера с помощью >; определение эквивалентности двух логических операторов с помощью перебора | ||
факториала | Решение задача коммивояжера с помощью пере; генерация всех неограниченных перестановок poset ; поиск детерминант с разложением Лапласа ; перечисление всех разделов набора |
Оператор иногда ослабляется в , чтобы получить более простые формулы для асимптотической сложности. Для любого и , является подмножеством для любого , поэтому его можно рассматривать как полином большего порядка.
Big O - наиболее часто используемая асимптотика для сравнения. функций. Вместе с другими другими связанными обозначениями он образует семейство y обозначений Бахмана - Ландау.
Интуитивно, утверждение «f (x) есть o (g (x))» (читается «f (x) мало-o от g (x)» ") означает, что g (x) растет намного быстрее, чем f (x). Как и раньше, f будет вещественной или комплексной функцией, а g - вещественная функция, обе на некотором неограниченном подмножестве положительных вещественных чисел, так что g (x) строго положительна для всех достаточно больших значений Икс. Один записывает
, если для любой положительной константы ε существует такая константа N, что
Например, у одного есть
Разница между предыдущим определением для обозначен Первая по крайней мере одна константы M, последняя должна быть какой-либо положительной константы ε, какой бы малой она ни была. Таким образом, нотация small-o делает более сильное утверждение, чем соответствующая нотация big-O: каждая функция, которая является big-O для g, также является большой-O для g, но не каждая функция, которая big-O для g, также является мало-о г. Например, но
Буква g (x) отличен от нуля или, по крайней мере, становится ненулевым после стандартной точки, отношение эквивалентно
Мало-о соблюдает ряд арифметических операций. Например,
Он также удовлетворяет действию транзитивности :
Еще одно асимптотическое обозначение - , читается как «big Omega ». К сожалению, есть два широко распространенных и несовместимых определения выражения
где a - некоторое действительное число, ∞ или −∞, где f и g - действующие функции, условия в окрестности a, и где g положительна в этой окрестности.
Первый (хронологически) используется в аналитической теории чисел, а другой - в теории сложности вычислений. Когда два встречаются, эта ситуация неизбежно вызовет замешательство.
В 1914 году Годфри Гарольд Харди и Джон Эденсор Литтлвуд представили новый символ , который определяется следующим образом:
Таким образом, - отрицание .
В 1916 году те же авторы ввели два новых символа и , определяемый как:
Эти символы использовались Эдмундом Ландау с теми же значениями в 1924 году. После Ландау эти обозначения больше никогда не использовались именно так; стало и стал .
Эти три символа , а также (что означает, что и удовлетворены), в настоящее время используются в аналитической теории чисел.
У нас есть
и, точнее,
Мы имеем
и, точнее,
однако
В 1976 Дональд Кнут опубликовал статью, в которой обосновал использование -символ для описания более сильного свойства. Кнут писал: «Для всех приложений, которые я видел до сих пор в информатике, более строгие требования... гораздо более уместны». Он определил
с комментарием: «Хотя я изменил определение Харди и Литтлвуда для , я считаю, что так что их определение отнюдь не широко используется, и потому что есть другие способы сказать то, что они хотят сказать, в сравнительно редких случаях, когда их определение применимо. "
Обозначение | Имя | Описание | Формальное определение | Определение предела |
---|---|---|---|---|
Большой O; Большой Ох; Большой Омикрон | асимптотически ограничено g (с точностью до постоянного множителя) | |||
Большая Theta | f ограничено как сверху, так и снизу с помощью g асимптотически | и d (версия Кнута) | ||
Большая Омега в теории сложности (Кнут) | f асимптотически ограничена g снизу | |||
Маленький О; Маленький Oh | f асимптотически преобладает над g | |||
Порядка | f равно асимптотически равно g | |||
Маленькая Омега | f доминирует над g асимптотическим ly | |||
Большая Омега в теории чисел (Харди - Литтлвуд) | асимптотически не доминирует g |
Определения пределов предполагают для достаточно большого n. Таблица (частично) отсортирована от наименьшего к наибольшему в том смысле, что o, O, Θ, ∼, (версия Кнута) Ω, ω на функции соответствуют <, ≤, ≈, =, ≥,>на вещественной прямой прямой (версия Харди-Литтлвуда Ω, однако, никакому такому описанию) не соответствует).
Информатика использует нотации большого O, большого Theta Θ, маленького o, маленького omega ω и большого Omega Ω Кнута. Аналитическая теория чисел часто использует большие O, маленькие o, большие Omega Ω Харди - Литтлвуда (с индексами +, - или ± или без них) и обозначения . Строчная нотация омега ω не так часто используется в анализе.
Неформально, особенно в информатике, большая нотация O часто может использоваться несколько иначе для описания асимптотики. плотная граница, где использование большой нотации Theta might может быть более уместным в данном контексте. Например, при рассмотрении функции T (n) = 73n + 22n + 58 все нижеследующее обычно является приемлемым, но более жесткие границы (такие как числа 2 и 3 ниже) обычно предпочтительнее более свободных границ (например, числа 1 ниже).
Эквивалентные английские утверждения соответственно:
Итак, хотя все три утверждения верны, в каждом содержится все больше информации. Однако в некоторых полях большая нотация O (цифра 2 в приведенных выше списках) будет использоваться чаще, чем большая нотация Theta (элементы с номером 3 в списках выше). Например, если T (n) представляет время работы недавно разработанного алгоритма для входного размера n, изобретатели и пользователи алгоритма могут быть более склонны устанавливать верхнюю асимптотическую границу того, сколько времени потребуется для выполнения, не делая явное утверждение о нижней асимптотической оценке.
В своей книге Введение в алгоритмы, Cormen, Leiserson, Rivest и Стейн рассмотрим набор функций f, которые удовлетворяют
В правильной записи этот набор можно, например, назвать O (g), где
Авторы заявляют, что использование оператора равенства (=) для обозначения членства в множестве, а не оператора членства в множестве (∈) является злоупотреблением нотацией, но в этом есть свои преимущества. Внутри уравнения или неравенства использование асимптотической записи обозначает анонимную функцию в множестве O (g), что исключает члены более низкого порядка и помогает уменьшить несущественный беспорядок в уравнениях, например:
Еще одно обозначение, которое иногда используется в информатике, - это Õ (читайте soft-O): f (n) = Õ (g (n)) - это сокращение от f (n) = O (g (n) log g (n)) для некоторого k. По сути, это большая нотация O, игнорирующая логарифмические факторы, потому что эффекты скорости роста некоторой другой суперлогарифмической функции указывают на взрыв скорости роста для входных параметров большого размера, которые более важны для прогнозирования плохой производительности во время выполнения, чем более точные -точечные эффекты, вносимые логарифмическими факторами роста. Это обозначение часто используется, чтобы избежать «придирок» в пределах темпов роста, которые заявлены как слишком жестко ограниченные для рассматриваемых вопросов (поскольку log n всегда o (n) для любой константы k и любого ε>0).
Также обозначение L, определенное как
удобен для функций, которые находятся между полиномом и экспонентой в терминах .
Обобщение на функции, принимающие значения в любом нормированном векторном пространстве, является простым (заменяя абсолютные значения нормами), где f и g не должны принимать свои значения в одном и том же пространстве.. Также возможно обобщение на функции g, принимающие значения в любой топологической группе . «Ограничивающий процесс» x → x o также можно обобщить, введя произвольную базу фильтра, то есть на направленные сети f и g. Обозначение o может использоваться для определения производных и дифференцируемости в довольно общих пространствах, а также (асимптотической) эквивалентности функций,
, которое является отношением эквивалентности и более ограничительным понятием, чем отношение «f есть Θ ( г) «сверху. (Он сводится к lim f / g = 1, если f и g - положительные вещественные функции.) Например, 2x - это Θ (x), но 2x - x не является o (x).
Символ O был впервые введен теоретиком чисел Полом Бахманном в 1894 году во втором томе его книга Analytische Zahlentheorie ("аналитическая теория чисел "). Теоретик чисел Эдмунд Ландау принял его и, таким образом, был вдохновлен ввести в 1909 году обозначение o; поэтому оба теперь называются символами Ландау. Эти обозначения использовались в прикладной математике в 1950-х годах для асимптотического анализа. Символ (в смысле «не является o of») был введен в 1914 году Харди и Литтлвудом. Харди и Литтлвуд также ввели в 1918 году символы («справа») и («слева»), предшественники современных символов («не меньше маленького o из») и ("не больше, чем малое o"). Таким образом, символы Омеги (с их первоначальным значением) иногда также называют «символами Ландау». Это обозначение стало широко использоваться в теории чисел, по крайней мере, с 1950-х годов. В 1970-х годах большая O была популяризирована в компьютерных науках Дональдом Кнутом, который ввел соответствующую нотацию Theta и предложил другое определение для обозначения Omega.
Ландау никогда не использовал большую Theta. и маленькие символы омега.
символы Харди были (в терминах современной нотации O)
(Харди, однако, никогда не определял и не использовал обозначение , ни , как иногда сообщалось). Харди представил символы и (а также некоторые другие символы) в своем трактате 1910 г. " Ордена бесконечности », и использовал их только в трех статьях (1910–1913). В своих почти 400 оставшихся статьях и книгах он постоянно использовал символы Ландау O и o.
Обозначения Харди больше не используются. С другой стороны, в 1930-х годах русский теоретик чисел Иван Матвеевич Виноградов ввел свою нотацию , которая все чаще использовалась в теории чисел. вместо обозначения . У нас есть
, и часто оба обозначения используются в одной и той же статье.
Большой-O первоначально означает «порядок» («Ordnung», Bachmann 1894) и, таким образом, является латинской буквой. Ни Бахманн, ни Ландау никогда не называли его «Омикрон». Значительно позже (1976 г.) Кнут рассматривал этот символ как заглавную омикрон, вероятно, в связи с его определением символа Омега. Цифру ноль использовать не следует.
В Викибуке Структуры данных есть страница по теме: Нотация Big-O |
Викиверситет решил Задача MyOpenMath с использованием нотации Big-O |