Я программист и только начал читать Алгоритмы. Я не полностью убежден с примечаниями, а именно, Бог О, Большая Омега и Большая Тета. Причина в том, что по определению Большого О он утверждает, что должна быть функция g (x), такая, что она всегда больше или равна f (x). Или f (x) <= cn для всех значений n> n0.
Почему мы не упоминаем постоянное значение в определении? Например, скажем, функция 6n + 4, мы обозначим ее как O (n). Но это не правда, что определение справедливо для всех постоянных значений. Это справедливо только при c> = 10 и n> = 1. При меньших значениях c, чем 6, значение n0 увеличивается. Так почему же мы не упоминаем постоянное значение как часть определения?
big-o
algorithm-analysis
Прадип
источник
источник
Ответы:
Есть несколько причин, но, вероятно, самая важная из них заключается в том, что константы являются функцией реализации алгоритма, а не самого алгоритма. Порядок алгоритма полезен для сравнения алгоритмов независимо от их реализации.
Фактическая среда выполнения быстрой сортировки обычно меняется, если она реализована на C, Python, Scala или Postscript. То же самое относится и к пузырьковой сортировке - время выполнения будет сильно различаться в зависимости от реализации.
Однако что не изменится, так это тот факт, что при прочих равных условиях по мере того, как набор данных становится больше, время, необходимое для запуска пузырьковой сортировки, будет увеличиваться быстрее, чем время, необходимое для запуска быстрой сортировки в типичном случае, независимо от того, какой язык или машина они реализованы, предполагая достаточно правильную реализацию. Этот простой факт позволяет делать интеллектуальные выводы о самих алгоритмах, когда конкретные детали недоступны.
Порядок алгоритм отфильтровывает факторы , которые, в то время как важно в реальных измерениях в реальном мире, как правило, просто шум при сравнении алгоритмов отвлеченно.
источник
O (n) и другие порядковые обозначения (как правило) не связаны с поведением функций для малых значений. Он касается поведения функций для очень больших значений, а именно пределов, когда n движется к бесконечности.
С технической точки зрения постоянные имеют значение, но они, как правило, абстрагируются, поскольку, как только n становится достаточно большим, значение c становится совершенно неактуальным. Если значение c важно, мы можем включить его в анализ, но если сравниваемые функции не имеют очень больших постоянных факторов или если эффективность является особенно важной проблемой, они обычно не являются.
источник
Обозначение 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
".источник
В анализе алгоритма Order of Growth является ключевой абстракцией и дает скорость изменения времени выполнения при изменении размера ввода. Допустим, у алгоритма есть время выполнения
f(n) = 2n + 3
. Теперь мы подключаем некоторый размер ввода,Как видно, порядок роста в основном определяется переменной
n
; константы 2 и 3 являются менее значимыми, и по мере роста входного размера они становятся еще менее значимыми при его определении. Вот почему в алгоритме анализа константы убираются в пользу переменной, определяющей порядок роста функции.источник
Понятие нотации Big-Oh в целом заключается в том, чтобы игнорировать константы и представлять наиболее важную часть функции, описывающую время выполнения алгоритма.
Забудьте формальное определение на мгновение. Какая функция хуже (быстрее растет)
n^2 - 5000
или5000 n + 60000
? Дляn
менее чем 5000 линейная функция больше (и, следовательно, хуже). Помимо этого (точное значение 5013?), Квадратное уравнение больше.Поскольку положительных чисел больше (довольно много) больше 5000, чем меньше, мы принимаем квадратик как «большую» (худшую) функцию в целом. Обозначение порядка (Big-Oh и т. Д.) Обеспечивает это (вы всегда можете исключить аддитивную и мультипликативную константу, используя эти определения).
Конечно, не всегда все просто. Иногда вы действительно хотите знать эти константы. Какой тип сортировки лучше или Bubble? И то и другое
O(n^2)
. Но одно действительно лучше другого. С более сложным анализом можно получить константы, о которых вы думаете. Обычно гораздо проще вычислить функцию Биг-О, чем более точную функцию.Big-Oh игнорирует эти константы, чтобы упростить и упростить самые важные сравнения. Нам нравится обозначение, потому что обычно мы не хотим знать о (в основном не относящихся к делу) константах.
источник
(поскольку это более длинный ответ, прочитайте жирный шрифт для краткого изложения )
Давайте возьмем ваш пример и пройдемся по нему шаг за шагом, понимая цель, стоящую за тем, что мы делаем. Мы начнем с вашей функции и с цели найти ее обозначение Big Oh:
Во-первых, давайте
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)
:На данный момент мы выполнили математические требования. Если мы остановимся на
O(6n+4)
этом, станет ясно, что это не более полезно, чем написаниеf(n)
, поэтому было бы упущено истинное назначение нотации Big Oh: понять общую временную сложность алгоритма! Итак, давайте перейдем к следующему шагу: упрощение.Во-первых, можем ли мы упростить из-за того,
6n
что такое Большой ОO(4)
? Нет! (Упражнение для читателя, если они не понимают, почему)Во-вторых, можем ли мы упростить
4
так, чтобы Большой О былO(6n)
? Да! В таком случаеg(n) = 6n
, так:На данный момент, давайте выберем
c = 2
с тех пор, что левая сторона будет увеличиваться быстрее (на 12), чем правая сторона (на 6) для каждого приращенияn
.Теперь нам нужно найти положительный результат,
n0
где приведенное выше уравнение истинно для всехn
, больше чем это значение. Поскольку мы уже знаем, что левая сторона растет быстрее, чем правая, все, что нам нужно сделать, - это найти одно положительное решение. Таким образом, так какn0 = 2
делает выше верно, то мы знаем , чтоg(n)=6n
, илиO(6n)
есть потенциал Больших О нотацииf(n)
.Теперь мы можем упростить
6
так, чтобы Большой О былO(n)
? Да! В таком случаеg(n) = n
, так:Давайте выберем,
c = 7
так как левый будет увеличиваться быстрее, чем правый.Мы видим, что вышесказанное будет верно для всех
n
больше или равноn0 = 4
. Таким образом,O(n)
это потенциальная нота Big Oh дляf(n)
. Можем ли мы упроститьg(n)
больше? Нет!Наконец, мы обнаружили, что простейшее обозначение Big Oh для
f(n)
isO(n)
. Почему мы прошли через все это? Потому что теперь мы знаем, чтоf(n)
это линейно , так как это обозначение Big Oh линейной сложностиO(n)
. Приятно то, что теперь мы можем сравнивать сложность времениf(n)
с другими алгоритмами! Например, теперь мы знаем , чтоf(n)
это сопоставимо с временной сложностью для функцийh(n) = 123n + 72
,i(n) = n
,j(n) = .0002n + 1234
и т.д.; потому что при использовании одного и того же процесса упрощения, описанного выше, все они имеют линейную сложность по времениO(n)
.Сладкий!!!
источник
O(4)
, это составило бы наше уравнение неравенстваc*4 >= 6n+4
, и для любого, которыйc
мы выбрали, мы всегда могли найти значение, где все значенияn
выше, что сделало бы неравенство ложным.c
иn0
не важны. Что важно, так это то,n0
чтоc
мы выбираем. Чтобы это было правдой, левая часть неравенства должна увеличиваться быстрее, чем правая, для больших значенийn
.c=6
не годится для этого (6n >= 6n+4
никогда не соответствует действительности), поэтому я выбралc=7
. Я мог бы так же легко выбратьc=10
,c=734
или,c=6.0000001
и все же, смог бы увидеть, что есть некоторые,n0
которые существуют, чтобы сделать неравенство истиннымn >= n0
, что означает, что Большой О, который мы проверяем, действителен.Если у вас есть функция производительности
6n + 4
, соответствующий вопрос «6 что?». Как один комментарий спросил: что представляет ваша константа? С точки зрения физики, каковы единицы вашего постоянного фактора?Причина, по которой нотация O () так широко используется для описания производительности алгоритма, заключается в том, что не существует переносимого способа ответить на этот вопрос. Разным процессорам потребуется разное количество тактов и разное количество времени для выполнения одних и тех же элементарных вычислений, или они могут по-разному смешивать соответствующие элементарные вычисления. Различные компьютерные языки или разные формальные и неформальные описания, такие как псевдокод, будут представлять алгоритмы способами, которые трудно сравнивать напрямую. Даже реализации на одном и том же языке могут представлять один и тот же алгоритм по-разному - тривиальные детали форматирования, такие как количество строк в стороне, как правило, позволяют реализовать любой произвольный структурный выбор для реализации любого данного алгоритма.
Посмотрите на это по-другому: мы используем «алгоритм» не для описания конкретной реализации, а для описания целого класса потенциальных реализаций одной и той же общей процедуры. Эта абстракция игнорирует детали реализации в пользу документирования чего-то общего, и постоянный фактор производительности является одной из этих деталей.
Тем не менее, описания алгоритмов часто сопровождаются фольклором, примечаниями или даже фактическими тестами, которые описывают производительность реальных реализаций на реальном оборудовании. Это дает вам приблизительное представление о том, какого рода постоянный фактор ожидать, но его также следует принимать с недолгой долей, потому что фактическая производительность зависит от таких вещей, как объем работы, затраченной на оптимизацию данной реализации. Кроме того, в долгосрочной перспективе относительная производительность сравнимых алгоритмов имеет тенденцию к снижению по мере изменения архитектуры новейших и лучших процессоров ...
источник