int a = 0;
for (i = 0; i < N; i++) {
for (j = N; j > i; j--) {
a = a + i + j;
}
}
为什么这段代码的时间复杂度为O(N N)?是否所有具有n,m,q,....边界的嵌套循环都具有O(n m * q ....)的复杂度,即使循环的迭代很少也不会发生?
答案 0 :(得分:1)
原因是Big-O表示法中忽略了常数因子。
您的外部循环运行N
次,而内部循环平均N/2
次运行每次外部迭代。
这使内部循环中的语句执行O(N * 1/2 * N)
。由于我们忽略了常数因素,因此最终得到的O(N * N)
为O(N^2)
。
省略常量的原因很简单:Big-O表示法是关于N
很大时会发生什么。如果你以这种方式看待它 - O((N^2)/2)
- 你会发现N
增加{{1}}在这个词中的影响要大于我们是否省略了除法。
答案 1 :(得分:1)
我不会说所有嵌套循环都具有这种复杂性,但这肯定会有。通过内部循环的迭代次数是这样的(可能存在一个一个错误):
让我们计算调用最里面代码的总次数。在这种情况下,您可以算术地计算出来。最里面的代码执行大约N * (N + 1) / 2
次(这是sum of elements from 1 to N)。这简化为0.5 * N^2 + 0.5 * N
,其复杂度为N^2
。