mmc*_*ole 40 big-o nested-loops
以下嵌套循环的Big-O时间复杂度是多少:
for(int i = 0; i < N; i++)
{
for(int j = i + 1; j < N; j++)
{
System.out.println("i = " + i + " j = " + j);
}
}
Run Code Online (Sandbox Code Playgroud)
它还是O(N ^ 2)吗?
Ale*_*nor 36
是的,它仍然是O(n ^ 2),它具有较小的常数因子,但这不会影响O表示法.
Cha*_*tin 26
是.回想一下大-O的定义:O(F(N))由定义说,运行时间T(N) ≤ KF(n)的一些恒定ķ.在这种情况下,步数将是(n-1)+(n-2)+ ... + 0,其重新排列为0到n-1的和; 这是
T(n)=(n-1)((n-1)+1)/ 2.
重新排列,您可以看到T(n)总是≤1/ 2(n²); 根据定义,因此T(n)= O(n 2).
Jon*_*eet 12
如果忽略System.out.println,则为N平方.如果你假设它所花费的时间在它的输出中是线性的(当然它可能不是),我怀疑你最终得到O((N ^ 2)*log N).
我提到这不是挑剔,但只是要指出你在解决复杂性时不仅需要考虑明显的循环 - 你需要考虑你所称的复杂性.
让我们跟踪每次迭代中每个循环执行的次数。
\nfor (int i = 0; i < N; i++) { // outer loop\n for (int j = i + 1; j < N; j++) { // inner loop\n System.out.println("i = " + i + " j = " + j);\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n在外循环的第一次迭代中(i = 0),内循环执行N - 1
次。
在外循环的第二次迭代中(i = 1),内循环执行N - 2
次。
在外循环的第三次迭代中(i = 2),内循环执行N - 3
次。
.\n.\n.
\n在外循环的第 1 次迭代中N - 2
(i = N - 3),内循环执行了2
次。
在外循环的第 1 次迭代中N - 1
(i = N - 2),内循环执行1
一次。
在外循环的最后 ( N
th) 次迭代 (i = N - 1) 中,内循环执行了0
次。
因此,该代码执行的总次数为
\nN - 1
+ N - 2
+ N - 3
+ \xe2\x80\xa6 + 2
+ 1
+0
= 0
+ 1
+ 2
+ \xe2\x80\xa6 + N - 3
+ N - 2
+N - 1
将其代入自然数之和公式中,
\n=(N - 1)((N - 1) + 1) / 2
=(N - 1)(N) / 2
=((N^2) - N) / 2
= O(N^2)
,假设System.out.println
在恒定时间内执行O(1)
。
\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94
\n另外,请看看这些
\n如果 N = 10,则迭代次数将为:10+9+8+7+6+5+4+3+2+1。(这是:十次迭代加九次迭代加八次迭代......等等)。
现在,您需要计算加法有多少次可以得到 N(在我的示例中 N = 10):
1:(10)、2:(9+1)、3:(8+2)、4:(7+3)、5:(6+4)。这是 5 次...并且仍然是 5 次迭代。
现在您知道您有 5 个十 + 5:
10(5) + 5
就 f(N)(或 n)而言,我们可以很容易地看出:
f(n) = n(n/2) + n/2 = (n^2)/2 + n/2 = (n^2 + n)/2...这正是这些嵌套循环的复杂性。
但是,考虑到 Big O 的渐近行为,我们可以去掉 f(n) 中不太重要的值,即单个 n 和分母。
结果:O(n^2)
归档时间: |
|
查看次数: |
44865 次 |
最近记录: |