【问题标题】:Trouble with nested for-loop running time嵌套for循环运行时间问题
【发布时间】:2011-11-14 13:46:57
【问题描述】:

我已经考虑这个问题好几天了,一直忙于计算第二个嵌套 for 循环运行的次数。我相信我有正确的公式来确定其他两个 for 循环的运行时间,但是这第三个让我挂断了电话。我有第一个循环运行 n-1 次。确定循环#2 运行次数的等式是: 1 到 n-1 的总和。如果有人可以帮助我了解如何找到循环 #3 运行的次数,将不胜感激。

    for ( int i=1; i<=n-1; i++ ) {
        for ( int j=i+1; j<=n; j++ ) {
            for ( int k=1; k<=j; k++ ) {
            }
        }
    }

【问题讨论】:

  • 你为什么不试试呢?将x++ 添加到循环内部并尝试使用各种n。另外,这个问题被标记为big-o,为什么?计算精确计数与 Big-O 无关。
  • 这就是我的小程序中的内容。我省略了几行以使代码更具可读性。添加 x++ 将显示循环将运行多少次,但我正在寻找一个使用 n 的数学表达式,它将给我答案。

标签: algorithm complexity-theory big-o analysis


【解决方案1】:

第三个循环运行C次:

C = Sum( Sum ( Sum ( 1 , k = 1 .. j ) , j = i+1 .. n ) , i = 1 .. n-1 )
  = Sum( Sum (           j            , j = i+1 .. n ) , i = 1 .. n-1 )
  = 2 + 3 + 4 + ... + n
      + 3 + 4 + ... + n
    ...
                    + n
  = 2*1 + 3*2 + 4*3 + 5*4 + ... + n*(n-1)
  = (1*1 + 1) + (2*2 + 2) + (3*3 + 3) + ... + ((n-1)*(n-1) + n-1)
  = (1^2 + 2^2 + ... (n-1)^2) + (1 + 2 + 3 + ... + (n-1))
  = (n-1)*n*(2*n-1)/6 + (n-1)*n/2 
  = (n-1)*n*(2*n+2)/6
  = O(n^3)

这里我使用了公式:

1^2 + 2^2 + ... + m^2 = m*(m+1)*(2*m+1)/6

1 + 2 + ... + m = m*(m+1)/2

【讨论】:

  • 谢谢彼得!这是一个很大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多