Что такое следующая временная сложность? - PullRequest
0 голосов
/ 19 октября 2019

Если цикл for определен как for (int i = 2; i < n; i = i*i + i) Что представляет собой «i * 2 + i» для сложности времени. Что такое сложность времени в нотации big-O? Как я могу решить нотацию big-O для этого увеличивающегося индекса? Пример: i = 2, 6, 42, 1086, .... (общая формула "i * 2 + i")

1 Ответ

2 голосов
/ 19 октября 2019

Поскольку i имеет конкретный тип (int), он ограничен, и сложность его выполнения O(1).

Кроме того, функция настолько быстро растет, что емкость int превышено по состоянию на шестой член.


Если считать, что данный код является псевдокодом и что int s не ограничен, то можно использовать

i[k]² <= i[k+1] = i[k]² + i[k] <= a i[k]²

где a - это константа, которую необходимо определить.

Затем берется логарифм по основанию-2

2 lg i[k] <= lg(i[k+1]) <= 2 lg(i[k]) + lg(a)

и по индукции

2^m lg(i[k]) <= lg(i[k+m]) <= 2^m lg(i[k]) + (2^m - 1) lg(a) <= 2^m lg(a.i[k])

Снова берется логарифм,

m + lg(lg(i[k])) <= lg(lg(i[k+m])) <= m + lg(lg(a.i[k]))

также написано

lg(lg(i[k+m])) - lg(lg(a.i[k])) <= m <= lg(lg(i[k+m])) - lg(lg(i[k]))

Поскольку m представляет количество итераций, следующих за k первым, для n = i[k + m] у нас есть

lg(lg(n)) - lg(lg(a.i[k])) <= m <= lg(lg(n)) - lg(lg(i[k]))

В частности, с k=0 мы можем взять a = 3/2 и

lg(lg(n)) - lg(lg(3)) <= m <= lg(lg(n)) - lg(lg(2))

Это доказывает m = Θ(lg(lg(n)).

...