该函数将被调用多少次?

时间:2014-01-15 19:09:36

标签: c algorithm complexity-theory

这里有循环:

for (i = n; i < 2*n; i += 4) {
    for (j = 0; j < 3*i; j += 2) {
        function();
    }
}

如何在不运行此代码的情况下计算function()的调用量(以n为单位)?

我想我可以使用算术级数,其总和是S =(a1 + ak)* k / 2,其中a1 - 是内循环的迭代量,而我有初始值和ak - 是当我有最终价值时内循环的迭代量。

但我无法将其表达为一个以n为变量的公式。

你对此有什么想法吗?

3 个答案:

答案 0 :(得分:4)

内循环执行3 * i / 2次调用。外环具有i = n,n + 4,n + 8 ... 2n-4。因此我们有:

count = 3*n/2 + 3*(n+4)/2 + 3*(n+8)/2 + ... 3*2*n/2 =
= 3/2 * (n + (n+4) + (n+8) + .. + (2n-4)) = 
= 3/2 * (3n^2-4n) / 8 =
= (9n^2 - 12n) / 16

(编辑:可能仍有一些小的不准确需要修复)

编辑#2 - 我按照自我的更正,现在我得到了预期的结果。

答案 1 :(得分:1)

嗯,你已经得到了算术级数的公式。当i = n时,内部循环变为3n / 2次(或多或少 - 您可能必须转换为整数)。您可能需要稍微调整一下上端,因为无法保证n可被4整除,但您可以对最终循环执行相同操作。并且它将运行n / 4次(再次转换为整数)。

答案 2 :(得分:0)

以下是允许您推断function()执行次数的正式步骤:

enter image description here

外部循环将执行n + ceil(n / 4) - 1次,内部循环取决于外部循环。我试图尽可能详细地说明这个解决方案的清晰度。