了解嵌套循环将运行多少次

时间:2011-09-21 13:30:45

标签: complexity-theory big-o

我试图理解在下面的代码中执行语句“x = x + 1”多少次,作为“n”的函数:

for (i=1; i<=n; i++)
  for (j=1; j<=i; j++)
    for (k=1; k<=j; k++)
       x = x + 1 ;

如果我没错,第一个循环执行 n 次,第二个循环 n(n + 1)/ 2 次,但是在第三个循环我走开。也就是说,我可以指望它会被执行多少次,但我似乎无法找到公式或用数学术语解释它。

你能吗?

顺便说一下,这不是家庭作业或其他任何东西。我刚刚在一本书上发现并认为这是一个有趣的概念。

6 个答案:

答案 0 :(得分:14)

考虑循环for (i=1; i <= n; i++)。看到这会循环 n 次,这是微不足道的。我们可以将其绘制为:

* * * * *

现在,当你有两个这样的嵌套循环时,你的内循环将循环 n(n + 1)/ 2 次。请注意这是如何形成三角形的,事实上,这种形式的数字称为triangular numbers

* * * * *
* * * *
* * *
* *
*

因此,如果我们将其扩展到另一个维度,它将形成一个四面体。由于我不能在这里做3D,想象每一个都是彼此叠加的。

* * * * *     * * * *     * * *     * *     *
* * * *       * * *       * *       *
* * *         * *         *
* *           *
*

这些被称为tetrahedral numbers,由此公式生成:

n(n+1)(n+2)
-----------
     6

您应该能够确认小测试程序确实如此。

如果我们注意到 6 = 3!,那么看how this pattern generalizes to higher dimensions就不难了:

n(n+1)(n+2)...(n+r-1)
---------------------
         r!

此处, r 是嵌套循环的数量。

答案 1 :(得分:1)

数学公式为here

这是O(n ^ 3)的复杂性。

答案 2 :(得分:1)

此数字等于三元组数{a,b,c},其中&lt; = b&lt; = c&lt; = n。 因此,它可以表示为Combination with repetitions.。在这种情况下,重复组合的总数为:n(n + 1)(n + 2)/ 6

答案 3 :(得分:0)

第3个内部循环与第2个内部循环相同,但 n 是一个公式。

所以,如果你的外环是 n 次......

,你的第二个循环是n(n+1)/2次......

你的第三个循环是......

(n(n+1)/2)((n(n+1)/2)+1)/2

它相当蛮力,绝对可以简化,但它只是算法递归。

答案 4 :(得分:0)

  

1 +(1 + 2)+(1 + 2 + 3)+ ...... +(1 + 2 + 3 + ... n)

答案 5 :(得分:0)

你知道第二个循环执行了多少次,所以可以用一个循环替换前两个循环吗?像

for(ij = 1; ij < (n*(n+1))/2; ij++)
   for (k = 1; k <= ij; k++)
      x = x + 1;

应用你用于第一个的相同公式,其中'n'是这个时间n(n + 1)/ 2你将拥有((n(n + 1)/ 2)*(n(n + 1) )/ 2 + 1))/ 2 - 执行x = x + 1的次数。