这段代码的时间复杂度是多少?
int count=0;
for(int I=N;I>0;I=I/2)
{
for(int j=0;j<I;j++)
{
count=count+1;
}
}
请清楚解释
答案 0 :(得分:2)
内部循环执行n次迭代,然后进行n / 2,然后进行n / 4,等等。
i =n n/2 n/4 n/8 ....................logn times
j=n n/2 n/4 n/8 ...........logn tmes
T(n) = n+ n/2 + n/4 + n/8 + ...........logn time
= n(1+ 1/2 + 1/4 + .............logn times) Decreasing GP
=O(n)
因此
时间复杂度为
O(n)
要了解有关几何级数的更多信息,请参见此document
这里让我们举个例子:
LET n = 10
最初:i = 10(第一个循环)
j = 0 < 10(i) so it will loop from 0 to 9 times
现在,嵌套环超过这个位置
i /= 2
i = 5(第一个循环)2次迭代的SO值。
这一次j将从j = 0 <5(i)开始运行,因此它将从0循环到5次
i的每个时间值都将除以2,并且类似的j值将从0迭代到i / 2次。
因此,T(n) = O(n + n/2 + n/4 + … 1) = O(n)
代表j(仅用于j的迭代)
i j
10 0-9 times
5 0 - 4 times
2 0 - 1 times
类似地,最初为n的j值(即10)按n / 2形成GP的顺序递减,因此我们得到 O(n)