以下嵌套循环的时间复杂度是多少:
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
System.out.println("i = " + i + " j = " + j);
}
}
还会是O(N^2)的时间复杂度吗?
以下嵌套循环的时间复杂度是多少:
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
System.out.println("i = " + i + " j = " + j);
}
}
还会是O(N^2)的时间复杂度吗?
是的,它仍然是O(n^2)时间复杂度,虽然它有更小的常数因子,但这不影响O符号表示。
如果忽略System.out.println,时间复杂度将是N的平方。假设该操作的时间与其输出成线性关系(当然可能不是这样),我认为最终的时间复杂度将是O((N^2) * log N)。
我提到这个并不是为了挑剔,而是要指出,在计算复杂度时,你不仅需要考虑明显的循环,还需要考虑所调用函数的复杂度。
让我们追踪每个迭代中每个循环执行的次数。
for (int i = 0; i < N; i++) { // outer loop
for (int j = i + 1; j < N; j++) { // inner loop
System.out.println("i = " + i + " j = " + j);
}
}
N-1 次。
在外部循环的第二次迭代(i = 1)中,内部循环执行 N-2 次。
在外部循环的第三次迭代(i = 2)中,内部循环执行 N-3 次。
在外部循环的第N - 2次迭代(i = N-3)中,内部循环执行 2 次。
在外部循环的第N - 1次迭代(i = N-2)中,内部循环执行 1 次。
在外部循环的最后一个(第N个)迭代中(i = N-1),内部循环不执行。
因此,此代码执行的总次数为
N-1 + N-2 + N-3 +…+ 2 + 1 + 0
= 0 + 1 + 2 +…+ N-3 + N-2 + N-1
将其代入自然数求和公式中,
= (N-1)((N-1)+1)/2
= (N-1)(N)/2
= ((N ^ 2) -N)/ 2
= O(N ^ 2),假设 System.out.println 的执行时间为常数时间 O(1)。
——————
还要看看这些:
对于给定的程序:
for (int i = 0; i < n; i++)
for (int j = i; j < n; j++)
println(...);
i
的值将分别为 0、1 和 2。For i = 0: println will execute 3 times
for i = 1: println will execute 2 times
for i = 2: println will execute 1 times
println
函数将会执行3+2+1次,即 n(n+1)/2 次。