Сначала давайте изменим код, чтобы явно отслеживать количество итераций с другой переменной j
:
for (int i = 2, j=0; i <=n; j+=1, i = pow(i, k))
Также давайте предположим, что на каком-то шаге условие i
точно равно n
. Это будет последняя итерация. Какое значение j
будет на этом шаге?
Мы видим, что на протяжении итераций i
всегда
i = 2^(k^j)
так на этом шаге
n = 2^(k^j)
Чтобы получить j
, давайте сначала применим log2
к обеим сторонам:
log2(n) = k^j
и затем примените logk
(т.е. log
с основанием k
) к обеим сторонам:
j = logk(log2(n))
Очевидно, точное совпадение i == n
является редким случаем, но его отсутствие влияет только на общее число итераций на 1
, что не влияет на big-O. Другими словами, последнее значение i
не становится точно 2^(k^logk(log2(n)))
, т.е. n
. Это становится чем-то вроде 2^(k^logk(floor(log2(n))))
, но асимптотически это то же самое.