【问题标题】:Runtime of this pseudocode此伪代码的运行时
【发布时间】:2011-11-03 01:38:58
【问题描述】:

谁能帮我分析一下下面伪代码的运行时间

for(i = 0; i < n*n*n; i++)
    for(j = i; j < n; j++)
        x++

我看到它的下界是 omega(n^3),因为如果外部 for 循环内部只是 theta(1),那就是它的样子。

我对仅在外循环的前 n 次迭代中运行的内循环感到困惑。我是否只是平均内部循环的运行时间:n^3 * ((1/n^2)*n + (1/n)*1,在这种情况下它是 O(n^3)?

【问题讨论】:

    标签: runtime asymptotic-complexity


    【解决方案1】:

    取决于你的编译器有多聪明。算法可以分为两部分(这可能有一个错误,但你明白了)

    // i<n
    // O(n^2)
    for( i=0; i<n ; ++i )
      for( j=i; j<n; ++j )
        x++
    
    // n < i < n*n*n
    // O(n^3)
    for( i=n ; i<n*n*n; ++j)
      noop(); //do nothing
    

    对于i &gt; n,第二部分什么都不做,所以智能编译器只会将 i 循环到 n, 在这种情况下,它是 O(n^2)。

    但是,如果您的编译器不智能,后半部分也会执行,您只会得到 O(1) 比较,因此整体行为是 O(n^3)。

    【讨论】:

      【解决方案2】:

      只有在i&lt;n 时才会执行内部循环。所以是O(n^2)

      【讨论】:

      • 内循环是 O(n),所以如果你的编译器足够聪明,它的结果是 O(n^2)。
      • @MichaelAnderson:正确。在您发表评论前一秒修复了它。
      【解决方案3】:

      你的算法应该像下面这样剖析:

      for(i = 0; i < n*n*n; i++) {
          for(j = i; j < n; j++) {
              x++
          }
          if (i >= n) {
              y ++;
          }
      }
      

      x 计算内循环和外循环的次数,y 将计算内循环不再执行时外循环的迭代次数。

      因此,您可以像下面这样正式进行:

      n = 10时,结果为:x = 55,y = 990,与上面的公式兼容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多