如果我们有这样的循环

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/

10-12 06:20