为什么这段代码的时间复杂度为O(N * N)?

时间:2017-06-17 14:36:02

标签: algorithm time-complexity

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 ....)的复杂度,即使循环的迭代很少也不会发生?

2 个答案:

答案 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)

我不会说所有嵌套循环都具有这种复杂性,但这肯定会有。通过内部循环的迭代次数是这样的(可能存在一个一个错误):

  • i = 0:N次
  • i = 1:N - 1次
  • i = 2:N - 2次
  • 。 。
  • i = N-1:1次
  • i = N:0次

让我们计算调用最里面代码的总次数。在这种情况下,您可以算术地计算出来。最里面的代码执行大约N * (N + 1) / 2次(这是sum of elements from 1 to N)。这简化为0.5 * N^2 + 0.5 * N,其复杂度为N^2