Обозначение Большого О (O, Theta, Omega) о темпах роста функций.
Когда вы реализуете алгоритм, он имеет определенную характеристику того, как изменяется среда выполнения при увеличении набора данных. Теперь вы можете оптимизировать алгоритм так, чтобы он работал быстрее в 100 раз. Конечно, это замечательно, но, по сути, это все тот же алгоритм. Аналогичным образом, через несколько лет компьютеры могут быть в два раза быстрее, чем сегодня.
Нотация Ландау абстрагирует эти постоянные факторы. Не f
имеет значения, всегда ли алгоритм работает в два раза быстрее, чем другой алгоритм g
: возможно, g
его можно оптимизировать, чтобы он работал в 4 раза быстрее, или вместо этого вы могли бы купить более быстрое оборудование. Если вы посмотрите на это с этой точки зрения, вы можете сказать, что они «одинаковы». (Это не значит, что вы можете (всегда) игнорировать постоянные факторы на практике.)
Большой ой указывает верхнюю границу, это похоже на <=
отношение.
Вы согласитесь, что 1 < 2
это правда. Означает ли это, что 1
не может быть меньше, чем любое другое число? Конечно, нет. Существует бесконечное количество чисел, которые больше, чем 1
.
С темпами роста это похоже. O(n)
обозначает множество всех функций, которые растут линейно (или медленнее). O(n^2)
с другой стороны, обозначает все те функции, которые растут с квадратичной смежностью (или медленнее). Я уверен, что вы согласитесь, что линейная функция растет медленнее, чем квадратичная функция.
Вот почему функция может быть в более чем одном классе "Big-oh".
Вот сравнение различных функций с : (из "Конкретной математики Кнута")
Слева направо, функции растут быстрее.
Кроме того, значение n ^ 2 растет быстрее, чем n ^ 1, потому что 2> 1.
Определения
"F растет быстрее или одинаково быстро, как G"
"F растет медленнее или одинаково быстро, как г"
Сочетание двух вышеупомянутых. Это говорит о том, что функция f
растет так же быстро, как g
. Это отношение эквивалентности.
интерпретация
Допустим, у вас есть два алгоритма, f
и g
.
Омега
Предполагается , что это означает, что независимо от вашего бюджета, нет постоянной вычислительной мощности, которую вы можете добавить в свою систему, так что f
она всегда будет работать так же быстро, как и g
.
Большой ой
Предполагается , что означает, что если у вас достаточно данных, f
они всегда будут работать быстрее g
, независимо от того, сколько вычислительной мощности вы добавите в свою систему.
доказательство
Если вы действительно пытаетесь доказать это, вам нужно показать, используя определения обозначений Ландау, что ваша функция удовлетворяет необходимым условиям.
Так что вам нужно найти значение c
, d
, n_0
таким образом, что условие выполнено.
Вот как вы можете сделать это для нижней границы c
:
Важно понимать, что меня произвольно определяют c
как меньшего, чем a-1
совершенно нормально. Определение тета (g) говорит, что «существует c
». Это может быть любое значение, если оно больше 0. (Если a
положительное действительное число, вам, однако, нужно немного изменить доказательство, поскольку оно a - 1
может быть отрицательным)
(Я предполагаю a
быть положительным, иначе функция всегда будет отрицательной для больших значений n
, что не имеет смысла для функции, обозначающей время выполнения.)
Вы можете попробовать сделать это для верхней границы, это очень похоже. Если вы не знаете, как, я могу предоставить доказательство для вас.
Подсказка: начните с d > a + 1
Внимание
Важно, чтобы вы не доказали это неправильно. Если вы предполагаете, что (an + b) находится в O (n) и идете оттуда, вы не доказали, чего хотели. Вам нужно будет убедиться, что все ваши шаги идут в обе стороны, то есть вместо =>
вас <=>
.