В большом обозначении Oh не упоминается постоянное значение


13

Я программист и только начал читать Алгоритмы. Я не полностью убежден с примечаниями, а именно, Бог О, Большая Омега и Большая Тета. Причина в том, что по определению Большого О он утверждает, что должна быть функция g (x), такая, что она всегда больше или равна f (x). Или f (x) <= cn для всех значений n> n0.

Почему мы не упоминаем постоянное значение в определении? Например, скажем, функция 6n + 4, мы обозначим ее как O (n). Но это не правда, что определение справедливо для всех постоянных значений. Это справедливо только при c> = 10 и n> = 1. При меньших значениях c, чем 6, значение n0 увеличивается. Так почему же мы не упоминаем постоянное значение как часть определения?


4
Как вы предлагаете точно представлять постоянную величину?
Даниэль Б

1
Если продвинуться дальше, любая завершающая функция - это O (1), если вы связали n.
Брайан

Ответы:


23

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

Фактическая среда выполнения быстрой сортировки обычно меняется, если она реализована на C, Python, Scala или Postscript. То же самое относится и к пузырьковой сортировке - время выполнения будет сильно различаться в зависимости от реализации.

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

Порядок алгоритм отфильтровывает факторы , которые, в то время как важно в реальных измерениях в реальном мире, как правило, просто шум при сравнении алгоритмов отвлеченно.


22

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

С технической точки зрения постоянные имеют значение, но они, как правило, абстрагируются, поскольку, как только n становится достаточно большим, значение c становится совершенно неактуальным. Если значение c важно, мы можем включить его в анализ, но если сравниваемые функции не имеют очень больших постоянных факторов или если эффективность является особенно важной проблемой, они обычно не являются.


3
Например, построение пирамид - это O (n), сортировка их изображений - O (n log n) - в какой-то момент у вас может быть достаточно пирамид, чтобы сортировка изображений заняла больше времени, чем создание новой! Но только для очень большого количества пирамид!
Мартин Беккет

Хороший ответ, но для заданного N и двух алгоритмов, которые обычно попадают в одно и то же «семейство» сложностей, может быть целесообразно делать именно то, что предлагает ОП, и включать, по крайней мере, относительные коэффициенты. Линейный алгоритм с удвоенным количеством инструкций на элемент как другой может быть назван * O * (2N) вторым алгоритмом * O * (N), чтобы показать относительную разницу, потому что для любого N первый алгоритм всегда будет двойным время выполнения второго; однако при сравнении с функцией другого семейства сложности, такой как * O * (NlogN), коэффициенты не имеют значения.
KeithS

10

Обозначение Big O согласно определению гласит, что: Обозначение Big O построено на интуиции, согласно которой для всех значений n в n и справа от n 'значение f (n) находится на или ниже cg (n). Константы также не имеют значения, когда вы переходите к высокоценным (переменным) факторам (таким как n-квадрат или n-куб), поскольку они являются просто константами, а не переменными величинами, которые могут стать такими же большими, как эти факторы. Ниже приведен график обозначений Big-O.
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}




введите описание изображения здесь

Суть этого обозначения заключается в том, что " how lower is f(n) from c.g(n) and not when it starts becoming lower".


В этом случае для каждого O (n) также есть большая тета n, поскольку согласно определению для некоторой константы она будет нижней границей, а для некоторой константы - верхней. например, 6n + 4 также является большой тэтой (n), поскольку, когда c меньше 10, она всегда является нижней границей. и когда с больше 10, это верхняя граница. Итак, можем ли мы сказать, что для любой данной записи большого О это также большая тэта?
Прадип

1
Вы говорите это с другой стороны: «Большая Тета означает Большой О». И Big-Oh можно заменить на Big-Theta для асимптотически узких границ.
Вайбхав Агарвал

9

В анализе алгоритма Order of Growth является ключевой абстракцией и дает скорость изменения времени выполнения при изменении размера ввода. Допустим, у алгоритма есть время выполнения f(n) = 2n + 3. Теперь мы подключаем некоторый размер ввода,

n = 10: 2 * 10 + 3 = 23

n = 100: 2 * 100 + 3 = 203

n = 10000: 2 * 10000 + 3 = 20003

n = 1000000: 2 * 1000000 + 3 = 2000003

n = 100000000 : 2 * 100000000 + 3 = 200000003

Как видно, порядок роста в основном определяется переменной n; константы 2 и 3 являются менее значимыми, и по мере роста входного размера они становятся еще менее значимыми при его определении. Вот почему в алгоритме анализа константы убираются в пользу переменной, определяющей порядок роста функции.


1

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

Забудьте формальное определение на мгновение. Какая функция хуже (быстрее растет) n^2 - 5000или 5000 n + 60000? Для nменее чем 5000 линейная функция больше (и, следовательно, хуже). Помимо этого (точное значение 5013?), Квадратное уравнение больше.

Поскольку положительных чисел больше (довольно много) больше 5000, чем меньше, мы принимаем квадратик как «большую» (худшую) функцию в целом. Обозначение порядка (Big-Oh и т. Д.) Обеспечивает это (вы всегда можете исключить аддитивную и мультипликативную константу, используя эти определения).

Конечно, не всегда все просто. Иногда вы действительно хотите знать эти константы. Какой тип сортировки лучше или Bubble? И то и другое O(n^2). Но одно действительно лучше другого. С более сложным анализом можно получить константы, о которых вы думаете. Обычно гораздо проще вычислить функцию Биг-О, чем более точную функцию.

Big-Oh игнорирует эти константы, чтобы упростить и упростить самые важные сравнения. Нам нравится обозначение, потому что обычно мы не хотим знать о (в основном не относящихся к делу) константах.


1

(поскольку это более длинный ответ, прочитайте жирный шрифт для краткого изложения )

Давайте возьмем ваш пример и пройдемся по нему шаг за шагом, понимая цель, стоящую за тем, что мы делаем. Мы начнем с вашей функции и с цели найти ее обозначение Big Oh:

f(n) = 6n+4

Во-первых, давайте O(g(n))будем обозначением Большого О, которое мы пытаемся найти f(n). Из определения Большого О, нам нужно найти упрощенное, g(n) где существуют некоторые константы cи n0где c*g(n) >= f(n)истинно для всех nбольше, чем n0.

Во-первых, давайте выберем g(n) = 6n + 4(что приведет к O(6n+4)большому Oh). В этом случае мы видим, что c = 1и любое значение n0будет соответствовать математическим требованиям из нашего определения Big Oh, поскольку g(n)всегда равно f(n):

c*g(n)      >=  f(n)    
1*(6n + 4)  >=  6n + 4    //True for all n's, so we don't need to pick an n0

На данный момент мы выполнили математические требования. Если мы остановимся наO(6n+4) этом, станет ясно, что это не более полезно, чем написание f(n), поэтому было бы упущено истинное назначение нотации Big Oh: понять общую временную сложность алгоритма! Итак, давайте перейдем к следующему шагу: упрощение.

Во-первых, можем ли мы упростить из-за того, 6nчто такое Большой О O(4)? Нет! (Упражнение для читателя, если они не понимают, почему)

Во-вторых, можем ли мы упростить 4так, чтобы Большой О был O(6n)? Да! В таком случае g(n) = 6n, так:

c*g(n)    >=  f(n)
c*6n      >=  6n + 4     

На данный момент, давайте выберем c = 2с тех пор, что левая сторона будет увеличиваться быстрее (на 12), чем правая сторона (на 6) для каждого приращения n.

2*6n      >=  6n + 4

Теперь нам нужно найти положительный результат, n0где приведенное выше уравнение истинно для всех n, больше чем это значение. Поскольку мы уже знаем, что левая сторона растет быстрее, чем правая, все, что нам нужно сделать, - это найти одно положительное решение. Таким образом, так как n0 = 2делает выше верно, то мы знаем , что g(n)=6n, или O(6n)есть потенциал Больших О нотации f(n).

Теперь мы можем упростить 6так, чтобы Большой О был O(n)? Да! В таком случае g(n) = n, так:

c*g(n)      >=  f(n)    
c*n         >=  6n + 4    

Давайте выберем, c = 7так как левый будет увеличиваться быстрее, чем правый.

7*n         >=  6n + 4

Мы видим, что вышесказанное будет верно для всех nбольше или равно n0 = 4. Таким образом, O(n)это потенциальная нота Big Oh для f(n). Можем ли мы упростить g(n)больше? Нет!

Наконец, мы обнаружили, что простейшее обозначение Big Oh для f(n)is O(n). Почему мы прошли через все это? Потому что теперь мы знаем, что f(n)это линейно , так как это обозначение Big Oh линейной сложности O(n). Приятно то, что теперь мы можем сравнивать сложность времени f(n)с другими алгоритмами! Например, теперь мы знаем , что f(n)это сопоставимо с временной сложностью для функций h(n) = 123n + 72, i(n) = n, j(n) = .0002n + 1234и т.д.; потому что при использовании одного и того же процесса упрощения, описанного выше, все они имеют линейную сложность по времени O(n).

Сладкий!!!


Привет, Хорошее объяснение. У меня еще мало сомнений. 1. Мы не можем сделать 6n + 4 как O (4), поскольку существует значение переменной 'n'. Это ответ? 2. при упрощении вы выбрали c = 7 и соответственно рассчитали n0 к 4. Что заставило принять решение c = 7 и не менее 7? потому что в зависимости от значения c n0 изменится.
Прадип

@Pradeep: для 1 вы правы. Для более глубокого объяснения: если бы мы попытались O(4), это составило бы наше уравнение неравенства c*4 >= 6n+4, и для любого, который cмы выбрали, мы всегда могли найти значение, где все значения nвыше, что сделало бы неравенство ложным.
Briguy37

@Pradeep: для 2, фактические значения cи n0не важны. Что важно, так это то, n0что cмы выбираем. Чтобы это было правдой, левая часть неравенства должна увеличиваться быстрее, чем правая, для больших значений n. c=6не годится для этого ( 6n >= 6n+4никогда не соответствует действительности), поэтому я выбрал c=7. Я мог бы так же легко выбрать c=10, c=734или, c=6.0000001и все же, смог бы увидеть, что есть некоторые, n0которые существуют, чтобы сделать неравенство истинным n >= n0, что означает, что Большой О, который мы проверяем, действителен.
Briguy37

Спасибо за четкое объяснение. Это именно то, что я искал. Еще раз спасибо.
Прадип

@Pradeep: Рад, что смог помочь :)
Briguy37

1

Если у вас есть функция производительности 6n + 4, соответствующий вопрос «6 что?». Как один комментарий спросил: что представляет ваша константа? С точки зрения физики, каковы единицы вашего постоянного фактора?

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

Посмотрите на это по-другому: мы используем «алгоритм» не для описания конкретной реализации, а для описания целого класса потенциальных реализаций одной и той же общей процедуры. Эта абстракция игнорирует детали реализации в пользу документирования чего-то общего, и постоянный фактор производительности является одной из этих деталей.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.