如果我们有这样的循环
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,而我不确定如何计算
最佳答案
只需将它们写在纸上并寻找图案即可。对于第一个示例:
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(total = 0)和n = 1(total = 0)的特殊情况。
最后一个过程中的思考过程是:我们必须将log2列“下移”一列以使其与总列对齐(因此log2(n-1)),并且必须对其加1来使值匹配。
关于java - 计算循环运行的次数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23164689/