我怎样正式解释一些操作?

时间:2014-10-04 19:01:22

标签: algorithm loops for-loop

给出以下代码:

Function Fun(int n) {
    int j, k, t=1;
    for (j=0; j<=4*n^2; j+=4) {
        for (k=j; k<=4*sqrt(n); k+=4) {
            t+=8;
        }
    }
}

我想计算执行命令t+=8;的次数。

通过尝试n的多个值,我发现它已被执行:

enter image description here

次。但是,我怎么能正式解释呢?

1 个答案:

答案 0 :(得分:1)

这部分:

for (j=0; j<=4*n^2; j+=4){
    for (k=j; k<=4*sqrt(n); k+=4){
        t+=8;
    }
}

足以回答你的问题。

请注意,它类似于:

for (j=0; j<=n^2; j++){
    for (k=4*j; k<=4*sqrt(n); k+=4){
        t+=8;
    }
}

类似于:

for (j=0; j<=n^2; j++){
    for (k=j; k<=sqrt(n); k++){
        t+=8;
    }
}

1)第一个for显示第二个执行的次数

2)第二个for显示执行t+=8;的次数

让我们解释你的公式的两个部分:

  • 第二部分与您的第二部分for有关: k取Math.floor(Math.sqrt(n)) - j + 1j的值{j=0 =&gt; Math.floor(Math.sqrt(n)) + 1
  • 第一部分与您的第一部for有关。但是为什么你有sqrt(n)而不是n^2?这是棘手的部分。如果您分析第二个循环何时生效,您会发现大于j的任何sqrt(n)都是无用的(第二个“内容”未执行,因为{{1}的上限是k)。这就是为什么在公式中你有sqrt(n)

之所以发生这种情况,是因为您的代码实际上类似于:

sqrt(n)