(поскольку это более длинный ответ, прочитайте жирный шрифт для краткого изложения )
Давайте возьмем ваш пример и пройдемся по нему шаг за шагом, понимая цель, стоящую за тем, что мы делаем. Мы начнем с вашей функции и с цели найти ее обозначение 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)
.
Сладкий!!!