任何人都可以帮我分析以下伪代码的运行时间
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)?
答案 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
将在不再执行内循环时计算外循环的迭代次数。
因此,您可以正式进行以下操作:
当n = 10
时,结果为:x = 55,y = 990,与上述公式兼容。