Я думаю, вы упускаете, что такое сложность времени и как работает большая буква O .
Обозначение Big O используется для описания асимптотического поведения алгоритма как размера роста задачи (до бесконечности). Конкретные коэффициенты не имеют значения.
В качестве простой интуиции, если при увеличении n
в 2
число шагов, которые вам необходимо выполнить, также увеличивается примерно в 2
раз, это линейная сложность по времени или то, что называется O(n)
.
Итак, давайте вернемся к вашим примерам № 1 и № 2:
да, вы делаете только chars.length/2
итераций цикла, но если длина s
удваивается, вы также удваиваете количество итераций. Это точно линейная сложность времени
аналогично предыдущему случаю вы делаете 0.8*n
итераций, но если удвоить n
, вы делаете вдвое больше итераций. Опять же, это линейно
Последний пример отличается. Коэффициент 1.2
не имеет большого значения. Важно то, что вы добавляете i
к себе. Давайте перепишем это утверждение немного
i += (i * 1.2)
совпадает с
i = i + (i * 1.2)
что совпадает с
i = 2.2 * i
Теперь вы четко видите, что каждую итерацию вы более чем удваиваете i
. Так что если вы удвоите n
, вам понадобится только еще одна итерация (или даже та же самая). Это признак принципиально сублинейной временной сложности. И да, это пример O(log(n))
, потому что для большого n
вам нужно всего около log(n, base=2.2)
итераций, и это правда, что
log(n, base=a) = log(n, base=b) / log(n, base=b) = constant * log(x, base=b)
, где constant
равно 1/log(a, base=b)