我对这两个代码的时间复杂性感到困惑:
代码1:
我想它的O(n ^ 3)
void easy(in n, int x, inty)
{
for(int i=0; i<n: ++i) { //o(n)
if(x<y) {
for(int k=0: k < n*n: ++k) { //o(n^2)
System.out.println("k =" +k);
}
} else {
System.out.println("i =" +i);
}
}
}
代码2:
void find(int n)
{
for(int i=0; i<20; ++i) { //o(1)
for(int j=0: j<n; ++j) { //o(n)
for(int k=0; k<j; ++k) //o(n)
System.out.println("k =" +k);
for(int m=0; m<i; ++m) //o(1)
Systen.out.println("m =" +m);
}
}
}
我想它的o(n ^ 2)
答案 0 :(得分:1)
在第一个片段中,您有一个n
次迭代的外循环。然后该循环的主体执行n^2
操作(如果x<y
)或一个操作(如果x>=y
)。这意味着运行时间为O(n)
或O(n^3)
,具体取决于x
和y
的值。
在第二个代码段中,您有一个外部循环,其i
变量不依赖于n
。它从1
变为20
,这意味着你可以将它计算为恒定的时间量,所以让我们摆脱那个循环。
我们还有以下循环:
for(int j=0: j<n; ++j) {
for(int k=0; k<j; ++k)
System.out.println("k =" +k);
for(int m=0; m<i; ++m)
Systen.out.println("m =" +m);
}
现在外循环有n
次迭代。第二个内部循环取决于i
,它是常量,因此整个循环需要恒定的时间。
第一个内循环需要O(n)
,因为k
从0
变为j
,而j
从0
变为{{} 1}}。因此总运行时间为n
。