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