【问题标题】:How many times the function will be invoked?该函数将被调用多少次?
【发布时间】:2014-01-15 19:09:35
【问题描述】:

这里有循环:

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 - 是内循环的迭代次数,而 i 具有初始值,而 ak - 是当 i 有最终值时,内循环的迭代次数。

但我不能将它表示为一个以 n 为变量的公式。

你对此有什么想法吗?

【问题讨论】:

  • 如果我使用 O(n) 表示法 - 它将是 O(n^2)。但我需要表达准确的公式来计算函数()被计算了多少次
  • 你的标题不是特别有意义,但我不能说我能想到一个更好的。
  • @FelixVein 你发布这些作业已经有一段时间了,而且我认为这是一个数学问题然后是算法

标签: c algorithm complexity-theory


【解决方案1】:

内部循环执行 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 - 我按照 self 的更正,现在我得到了预期的结果。

【讨论】:

  • 您是如何从(n + (n+4) + (n+8) + .. + 2n) 获得(n^2/4 + (4 + 8 + .. n)) 的?是(n^2)/4还是n^(2/4)
  • 你很接近,但最后的数字是错误的。如果你运行代码,你会得到不同的结果。
  • 如果 n 能被 4 整除,实际有效的公式是 (n/4)*((9n/4)-3)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    以下是可以让您推断出function() 将执行的确切次数的正式步骤:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2020-11-27
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多