计算以下代码段的时间复杂度

时间:2017-12-14 05:31:25

标签: time-complexity

有人可以计算一下。执行上述代码需要采取哪些步骤?

验证解决方案,输入值为n。

(找到一些相关的问题,但没有帮助)

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

2 个答案:

答案 0 :(得分:0)

我们可以制作一张桌子:

i = 1: j = 1       --> 1 count
i = 2: j = 1,2     --> 2 counts
i = 4: j = 1,2,4   --> 3 counts
i = 8: j = 1,2,4,8 --> 4 counts

这个模式应该从这里清楚。我们可以重新构想模式,使得i = 1,2,3,4 ......,而不是从1变为n,让我们说它从1变为log n。这意味着总计数应该是i的i = 1到log(base 2)n之和。从i = 1到x的i的和是x(x + 1)/ 2,所以如果x = log_2(n),那么这个和就是(log_2(n)* log_2(n)+1)/ 2

编辑:好像我在某个地方犯了一个错误,我写的实际上是基于经验测试的f(n / 2)。因此,正确答案实际上是(log_2(2n)* log_2(2n)+1)/ 2。然而,这是我要解决像这样的问题的逻辑

编辑2:抓住了我的错误。不要说&#34;让我们说它从1变为log n&#34;,我应该说&#34;让我们说它从0变为log n&#34; (即,我需要记录系列中的每个数字)

答案 1 :(得分:0)

         inner-loop
i = 1 --> log(1)  = 0
i = 2 --> log(2)  = 1
i = 4 --> log(4)  = 2
i = 8 --> log(8)  = 3
i = 16 -> log(16) = 4
i = 32 -> log(32) = 5
i = 64 -> log(64) = 6
.
.
.
i = n -> log(n) = log(n)

这是工作量,当i点击n后,它将在log(n)次迭代后停止。

1 + 2 + 3 + 4 +...+ log(n) = [(1+log(n))*log(n)]/2 = O(log^2(n))