有人可以告诉我以下嵌套循环的时间复杂度是什么吗?
for(i=1;i<n;i+=i)
{
for(j=1;j<n;j*=j)
//O(1)
}
根据我的说法是O(log(n)* log(log(n)) 由于外循环将运行log(n)次,因为我们每次迭代都将i有效乘以2。 在内部循环中,我们在每次迭代中对循环计数器j求平方。 因此,最终的复杂度是这两者的乘积。 这是正确的还是其他答案? 在此先感谢:D
答案 0 :(得分:1)
是的,复杂度为O(log2(n) * log2(log2(n)))
。
内部循环的索引j
遵循递归关系j(k) = j(k-1)^2
,即j(k) = j(0)^(2^k)
(归纳证明)。假设j(0) = 2
(而不是1
,因为否则您将无限期地循环)。
因此,内部循环的迭代次数k
会得到验证
j(k) >= n
<=> 2^(2^k) >= n
=> k >= log2(log2(n))
外部循环的迭代次数为> = log2(n)
。