如何计算一段代码的每一行的运行时间

时间:2012-04-12 14:50:44

标签: algorithm big-o time-complexity

我对Big O符号有点熟悉,但是我遇到了一个我无法得到的大O符号的解释。

int foo(int n) {
  int p = 1;        -------------->c1        x 1
  int i = 1;         ------------->c1        x 1
  while (i < n) {     ------------>c2        x n
    int j = 1; ------------------->c1        x (n - 1)
       while (j < i) { ----------->c2        x ((1/2)n^2 - (3/2)n + 2)
         p = p * j; -------------->(c1 + c3) x ((1/2)n^2 - (3/2)n + 1)
         j = j + 1; -------------->(c1 + c4) x ((1/2)n^2 - (3/2)n + 1)
      }
    i = i + 1; ------------------->(c1 + c4) x (n - 1)
  }
  return p; ---------------------->c5        x 1        
}

(c1 + 1/2 * c2 + 1/2 * c3 + 1/2 * c4)n ^ 2 +( - c1 - 1/2 * c2 - 3/2 * c3 - 1/2 * c4) n +(2 * c1 + 2 * c2 + c3 + c5)

我知道这个算法将会变成n ^ 2,因为嵌套循环以及结果等式中常数和低阶项的减少。然而,我不明白的是如何得出“x”的rhs例如((1/2)n ^ 2 - (3/2)n + 1)。任何对此的见解都将非常受欢迎,我真的需要了解Big O符号的核心概念。感谢。

Check here for animated explanation

2 个答案:

答案 0 :(得分:1)

外循环执行n-1次:

sum(1, i=1;n-1) = n-1.

对于每个i-1,内循环执行i次,共计:

sum(i-1, i=1;n-1)
= sum(i, i=1;n-1) - sum(1, i=1;n-1)
= (n-1)*((n-1)+1)/2 - (n-1)
= (n-1)*n/2 - n+1
= (1/2)n^2-(3/2)n+1

使用众所周知的Euler公式,得出从1到n的数字之和:sum(i, i=1;n) = n*(n+1)/2

答案 1 :(得分:1)

循环有n-1次迭代,而(i

Innner循环将执行0,1,2,3,... n-2次 - 这是算术级数,其和为(n-2)(n-1)/ 2 =(1/2) n ^ 2 - (3/2)n + 1