这个伪代码的运行时

时间:2011-11-03 01:38:59

标签: runtime asymptotic-complexity

任何人都可以帮我分析以下伪代码的运行时间

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)?

3 个答案:

答案 0 :(得分:2)

取决于编译器的智能程度。算法可以分为两部分(这可能有一个错误,但你得到了想法)

// 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 > n,第二部分什么都不做,所以智能编译器只会将i循环到n, 在这种情况下,它是O(n ^ 2)。

但是如果你的编译器不聪明,后半部分也会执行,你只会进行O(1)比较,因此整体行为是O(n ^ 3)。

答案 1 :(得分:1)

内部循环仅在i<n时执行。所以它是O(n^2)

答案 2 :(得分:0)

您的算法应按以下方式解析:

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

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

因此,您可以正式进行以下操作:

enter image description here

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