我是一个初学者,我很困惑这段代码的时间复杂度如何loglogn。
while(i<=n)
{
i = i*i;
}
答案 0 :(得分:2)
对于n = k 16 :
iteration 1: i = k
iteration 2: i = k^2
iteration 3: i = k^4
iteration 4: i = k^16
因此,基本上,您可以证明您正在为k m 重复log(m)次,其中m = log(k)。
答案 1 :(得分:0)
让我们将i
的起始值定义为 j ,然后在第一次迭代的 start 中,将i
的值设为 j 。在迭代结束时,i
的值为 j 2 。
现在进行下一次迭代,最后,i
的值为 j 4 。如果在第 k 次迭代的开始,值是 j l ,那么在迭代结束时,< em> j 2×l 。
所以这意味着在第 k 次迭代中,该值将为 j 2 k 。我们将一直迭代直到达到 i 的值,例如 i> j ,这意味着:
j 2 k > n
我们可以在此处将 log j 应用于这两个部分:
2 k > log j n
和 log 2 都可以:
k> log 2 (log j n)
对于发生这种情况的第一个 k,循环将结束。因此,这意味着这将在 log 2 (log j n)和 log 2 之间”发生sub>(log j n)+1 迭代,但是 +1 在这里无关紧要。
时间复杂度因此为: O(log 2 (log j n)) 与 j i 的初始值, n 在while
循环中的边界。