有人可以计算一下。执行上述代码需要采取哪些步骤?
验证解决方案,输入值为n。
(找到一些相关的问题,但没有帮助)
int count=0;
for(int i=1; i<=n ;i=i*2)
{
for(int j=1; j<=i; j=j*2)
{
count++;
}
}
答案 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))