对于给定的程序,时间复杂度将是多少。
int count = 0;
for(int i = n; i > 0; i /= 2)
{
for(int j = 0; j < i; j++)
{
count++;
}
}
根据我的理解,它应该是O(nlogn)
,因为i
循环是分而治之的,因此O(logn)
和j
循环是O(n)
。< / p>
但是,正确的答案是O(n)
。有人可以解释原因吗?
答案 0 :(得分:13)
这是O(n)
:
外部循环有O(logn)
次迭代,因为i
从n
开始,每次迭代时减半。
现在让我们考虑内循环的迭代次数:
n
次迭代(自i==n
起)。在外循环的第二次迭代中,内循环具有n
/ 2次迭代(自i==n/2
起)。
...
在外部循环的log(n)
'(和最后一次)迭代中,内部循环有1次迭代(从i==1
开始)。
总结我们得到的所有内循环迭代:
n + n/2 + n/4 + ... + 1 <= 2*n = O(n)