我正在以自己的速度在线学习。我正在解决一些例子,但我不能围绕这个例子:
while(i<n)
{
for(int j=1; j<=i; j++)
sum = sum + 1;
i *=2;
}
我认为答案应该是2 ^ n,但我的朋友说nlog(n)
有人可以找到这个循环的大O并向我解释如何这样做吗?
答案 0 :(得分:3)
外部循环将进入它的身体log2(n)
次,因为i
呈指数级增长,从而越来越快地到达终点n
。例如,如果n
为1024
,则只需要10次迭代,n=65536
,则为16次迭代。准确计数为log2(n)
,但就运行时复杂性而言,对数行为就足够了。所以这里的复杂性是O(log(n))
。
每次评估时,内循环for(int j=1; j<=i; j++)
将运行到相应的i
。可以显示平均运行宽度约为n / log2(n)
,因为i
为1
,2
,4
,... n
log2(n)
步骤。{例如,如果n
为31
,则i
为1
,2
,4
,8
,{{1} },总和为16
,步数为31
。因此,允许在此处采用复杂性5
。
然后O(n/log(n))
为O(log(n)*n/log(n))
,即O(n)
。
答案 1 :(得分:0)
答案 2 :(得分:0)
它是n
。
如果n=2^k
则复杂性为k,
第二个循环:2^1 + 2^2 + ... 2^k = 2^(k+1)-1 ~= 2^(k+1)
2^(k+1) = 2*n