用对数增长计算嵌套循环的时间复杂度

时间:2017-10-11 18:46:51

标签: c++ time-complexity

我正在以自己的速度在线学习。我正在解决一些例子,但我不能围绕这个例子:

while(i<n)
{
     for(int j=1; j<=i; j++)
         sum = sum + 1;
     i *=2;
}

我认为答案应该是2 ^ n,但我的朋友说nlog(n)

有人可以找到这个循环的大O并向我解释如何这样做吗?

3 个答案:

答案 0 :(得分:3)

外部循环将进入它的身体log2(n)次,因为i呈指数级增长,从而越来越快地到达终点n。例如,如果n1024,则只需要10次迭代,n=65536,则为16次迭代。准确计数为log2(n),但就运行时复杂性而言,对数行为就足够了。所以这里的复杂性是O(log(n))

每次评估时,内循环for(int j=1; j<=i; j++)将运行到相应的i。可以显示平均运行宽度约为n / log2(n),因为i124,... n log2(n)步骤。{例如,如果n31,则i1248,{{1} },总和为16,步数为31。因此,允许在此处采用复杂性5

然后O(n/log(n))O(log(n)*n/log(n)),即O(n)

答案 1 :(得分:0)

我们可以假设N等于2^k + 1而不失一般性。我们需要找到内循环的迭代次数。外循环将进行k次迭代,内循环的2^0, 2^1, ..., 2^k次迭代。让我们总结一下这个值。 enter image description here

答案 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