如果我们有这样的循环
for(int i=0; i<n; i+=2)
{
total+=1;
}
我假设标题中有一条指令,它在正文中执行一条指令,因此指令总数为(n-0)/ 2 * 1 + 1(最后条件)。这是正确的方法吗?你怎么算呢?
另外,这个怎么样?
for(int i=1; i<n; i*=2)
{
total+=1;
}
如果n = 20,我就像1,2,4,8,16,我不确定如何计算
答案 0 :(得分:1)
将它们写在纸上并寻找图案。第一个例子:
for(int i=0; i<n; i+=2)
n i's total
0 [] 0
1 [0] 1
2 [0] 1
3 [0,2] 2
4 [0,2] 2
5 [0,2,4] 3
6 [0,2,4] 3
and so on..
即 floor((n + 1)/ 2)(或整数除法)。
第二个;我们可以通过检查看到它与log2有关,所以让我们将计数与log2(n)进行比较,看看我们是否能找到一个模式:
for(int i=1; i<n; i*=2)
n i's total log2(n)
1 [] 0 ---
2 [1] 1 1
3 [1,2] 2 1.58
4 [1,2] 2 2
5 [1,2,4] 3 2.32
6 [1,2,4] 3 2.58
7 [1,2,4] 3 2.81
8 [1,2,4] 3 3
9 [1,2,4,8] 4 3.17
10 [1,2,4,8] 4 3.32
11 [1,2,4,8] 4 3.46
12 [1,2,4,8] 4 3.58
13 [1,2,4,8] 4 3.70
14 [1,2,4,8] 4 3.81
15 [1,2,4,8] 4 3.91
16 [1,2,4,8] 4 4
17 [1,2,4,8,16] 5 4.09
看着这个并考虑一下,我们可以看到它是 floor(1 + log2(n-1)),特殊情况下n = 0(总数= 0)和n = 1(总数= 0)。
最后一个思想的过程是:我们必须转移&#34;将 log2 列向下一列,使其与 total 列对齐(因此 log2(n-1)),我们必须添加1,以使值匹配。