我需要帮助理解这个算法的时间复杂度以及以这种方式迭代的任何算法(i = i * i),我无法弄清楚这个循环与n成比例地执行多少次:是log n ? log log n?或类似的东西?我该如何分析这样的事情?提前致谢:D
function(n):
i=5
while i<n:
{
do.something()
i = i*i
}
答案 0 :(得分:5)
首先观察循环重复k次后,i
的值可以计算为5 2 k 。
当i
的值达到n
时,循环将停止,因此您需要重写等式n = 5 2 k 对于k:log 5 n = 2 k ,log 2 (log 5 n)= k
因此,循环的复杂性为O(log 2 (log 5 n))
答案 1 :(得分:0)
这不是简单的反向关系。
考虑一下,i
如何上升。
如果它在你的j
次迭代中,那么你现在的5的值是多少?
嗯,通过简单的数学运算,你知道你必须将j平方为5次,即
(...(...(5)^2...)^2...)^2=5^(2^j)
所以如果它在这次迭代中终止,
5^(2^j) >= n
所以你解决j
,就可以得到O符号的表达式。