嵌套For循环的运行时间估计/大O表示法

时间:2016-07-07 20:31:44

标签: math time-complexity big-o

我无法理解函数f(x)的含义,它表示在某些代码中执行的操作数。

int sum = 0; // + 1
for (int i = 0; i < n; i++)
    for (int j = 1; j <= i; j++)
        sum = sum + 1; // n * (n + 1) / 2

(请注意,最后一条评论的分子中没有2,但下面的函数中有。)

然后我的笔记说f(x)= 2n(n + 1)/ 2 + 1 = O(n ^ 2)

我明白因为有两个for循环,无论f(x)是什么,它都是= O(n ^ 2),但为什么时间估计它是什么? j&lt; =我如何给你n *(n + 1)?分母中的2怎么样?

1 个答案:

答案 0 :(得分:3)

在整个代码执行过程中,考虑内部循环运行的次数。注意

  • 当i = 0时,它运行零次;
  • 当i = 1时,它运行一次;
  • 当i = 2时,它会运行两次;
  • 当i = 3时,它会运行三次;
  • ...;和
  • 当i = n - 1时,它运行n - 1次。

这意味着最内圈循环的总次数由

给出
  

0 + 1 + 2 + 3 + 4 + ... +(n - 1)

这是一个着名的总结,它解决了

  

0 + 1 + 2 + 3 + 4 + ... +(n - 1)= n(n - 1)/ 2

这是n - 1st triangular number,值得将此提交给记忆。

给出的数字 - n(n + 1)/ 2 - 似乎不正确,但它非常接近真实数字。我认为他们认为循环会运行1 + 2 + 3 + ... + n次而不是0 + 1 + 2 + ... + n - 1次。

由此可以更容易地看出O(n 2 )术语的来源。注意n(n - 1)/ 2 = n 2 / 2 - n / 2,所以在big-O land中我们放下常数和低阶项,我们留下n 2