复杂性时间O(n)或O(n(n + 1)/ 2)

时间:2015-03-10 14:15:15

标签: algorithm big-o time-complexity

循环在n个项目(如数组)上然后在(n-1)然后(n-2)上循环的算法的复杂性等等:

Loop(int[] array) {
  for (int i=0; i<array.Length; i++) {
     //do some thing

  }
}
Main() {
   Loop({1, 2, 3, 4}); 
   Loop({1, 2, 3}); 
   Loop({1, 2}); 
   Loop({1}); 
//What the complexity of this code.
}

以前的计划有多复杂?

2 个答案:

答案 0 :(得分:3)

假设您在循环中执行的操作是O(1),其复杂性为O(n+(n-1)+(n-2)+...+1) = O(n(n+1)/2) = O(0.5n^2 + 0.5n) = O(n^2)

  • 第一个=是算术序列和。
  • 第二个=是打开乘法的。
  • 第三个=是由于O()中的多项式给定,您只需将其替换为x^highest_power

答案 1 :(得分:2)

<强>式

               n*(n+1)
n + ... + 1 = ─────────
                  2

<强>证明

n + ... + 1 = S

2*(n + ... + 1) = 2*S

n + n-1 + ... + 2   + 1 + 
1 + 2   + ... + n-1 + n = 2*S

n+1 + (n-1)+2 + ... + 2+(n-1) + 1+n = 2*S

n+1 + n+1 + ... + n+1 = 2*S

n*(n+1) = 2*S 

S = n*(n+1)/2 = (n*n+n)/2

可是:

 n*n     n*n + n          n*n
───── < ───────── = S < ─────── < n*n
  2         2              2
  1. 我们的总和低于n*n(对于每个n,但对于每个n > n0来说都足够了<)
  2. n*n位于 O(n 2
  3. 从(1)和(2)=&gt;我们的总和是 O(n 2

    如果我们使用下限(n*n/2),我们也可以说它是Ω(n 2 然后是 Θ(N 2


    正式定义

    你也可以根据形式定义来证明这一点,但我发现上面的解释比较直观。

      

    f(n)= O(g(n))表示存在正常数c和n0,因此对于所有n≥n0,0≤f(n)≤cg(n)。对于函数f,c和n0的值必须是固定的,并且不能取决于n。

    f(n) = (n*n+n)/2
    g(n) = n*n
    

    只需选择n0 = 1c = 2即可获得:

    0 ≤ (n*n+n)/2 ≤ 2*n*n
    0 ≤ n*n+n ≤ 4*n*n
    0 ≤ n ≤ 3*n*n
    

    对于每个n ≥ n0=1来说显然都是正确的。

    通常,如果在选择常量时遇到问题,请使用更大的值。例如:n0=10c=100。有时它会更明显。