计算嵌套循环的大O.

时间:2013-10-10 06:53:05

标签: c++ algorithm big-o time-complexity

我在为以下代码计算Big O时遇到问题。我永远不是最聪明的饼干。 有人可以解释一下吗。由于嵌套循环,我的猜测是O(N ^ 2),但我知道它还有更多。

static inline int f1 (int a, int b)
{
 for (int c = 0; c < b; c++)
 {
   a -= n;
 }
 return a;
}

int f2 (int n) 
{
  int r = n * n * n;
  for (double i = n; i >= 0; i -= 2)
  {
     r = f1(r, i);
  }
  return r;
}

3 个答案:

答案 0 :(得分:3)

首先,请注意f1的运行时纯粹依赖于第二个参数,该参数控制循环迭代的次数。因此,它的运行时间在第二个参数中是线性的。

接下来,注意f2中的循环运行n / 2次,i取值0,2,4,6,...,n。由于i是f1的第二个参数,因此运行时由

给出
  

0 + 2+ 4+ ... + n

     

= 2(0 + 1+ 2+ .. + n)

     

=2Θ(n ^ 2)

     

=Θ(n ^ 2)

所以运行时间是Θ(n ^ 2)。请注意,几乎所有其他内容都会分散注意力,误导您。纯粹关注控制迭代和循环的变量会显示出您需要关注的实际逻辑。

希望这有帮助!

答案 1 :(得分:1)

  1. 请尝试以避免不惜一切代价浮动/加倍作为循环计数器,因为它们不准确。使用size_t或任何其他int类型。此外,就我可以从你的代码中告诉你,无论如何你将我从double转换为int,所以那里不需要那个双倍。

  2. 您的循环可以这样写:

    int r = n * n * n;
    for (double i = n; i >= 0; i -= 2)
    {
      for (int c = 0; c < i; c++)
      {
        r -= n;
      }
    }
    
  3. 外环:O(n / 2) - 它在每个步骤“跳跃”2个单位=&gt;操作次数为n / 2

    内循环:O(n / 2) - 从技术上讲,它迭代到i,但是因为我的最大值是n / 2而内循环是1乘1 =&gt;复杂性是相同的n / 2

    整体复杂度:O((n / 2)^ 2)

    <强>更新

    正如其他人所说,是的,你可以折叠常数部分(在这种情况下为“/ 2”),但在我看来,它比我最初发布的更清晰。希望也有帮助。

答案 2 :(得分:0)

从数学上讲,你可以像下面那样正式着手:

enter image description here

其中op是在f1()中执行的常量时间 op 次数。 我可以为op'添加f2()或类似内容,但这似乎没必要。

要计算操作次数,比如T(10),只需让op = 1