算法的时空复杂度 - 大O表示法

时间:2016-12-25 13:05:09

标签: algorithm big-o

我正在尝试分析一个简单算法的Big- O -otation,并且我已经有一段时间了。所以我根据以下代码的规则进行了分析,并试图弄清楚这是否正确:

public int Add()
{
  int total = 0; //Step 1

  foreach(var item in list) //Step 2
  {
    if(item.value == 1) //Step 3
    {
      total += 1; //Step 4
    }
  }
  return total;
}
  1. 如果您指定了变量或集合,在这种情况下,复杂性是根据Big O 的规则确定的 O (1) 即可。所以第一阶段将是 O(1) - 这意味着无论输入大小是多少,程序都将执行相同的时间和内存空间。

    < / LI>
  2. 第二步是foreach循环。循环中有一点很清楚。根据输入,循环迭代或运行。作为示例,对于输入10,循环迭代10次并且持续20次,20次。完全取决于输入。根据Big O 的规则,复杂性将是 O(n) - n 是输入数量。因此,在上面的代码中,循环根据列表中的项目数进行迭代。

  3. 在此步骤中,我们定义一个确定条件检查的变量(参见编码中的步骤3)。在这种情况下,根据Big O 规则,复杂性为 O(1)

  4. 以同样的方式,在步骤4中,也没有变化(参见编码中的步骤4)。如果条件检查为真,那么total变量将值增加1.所以我们写 - 复杂 O(1)

  5. 因此,如果上述计算是完美的,那么最终的复杂性如下:

    O(1) + O(n) + O(1) + O(1) or (O(1) + O(n) * O(1) + O(1))
    

    我不确定这是否正确。但我想,如果这不是一个完美的话,我希望能对此有所澄清。感谢。

3 个答案:

答案 0 :(得分:2)

用于描述函数的渐近行为的大O表示法。基本上,它告诉你函数增长或减少的速度

例如,在分析某些算法时,可能会发现完成大小为n的问题所需的时间(或步数)由

给出
  

T(n)= 4 n ^ 2 - 2 n + 2

如果我们忽略常量(这是有道理的,因为那些取决于程序运行的特定硬件)和增长较慢的术语,我们可以说&#34; T(n)&#34;生长在n ^ 2和#34;并写:T(n)= O(n ^ 2)

对于形式定义,假设f(x)和g(x)是在实数的某个子集上定义的两个函数。我们写了

  

f(x)= O(g(x))

(或f(x)= O(g(x))对于x - >无穷大更精确)当且仅当存在常数N和C时

  

| F(X)| &lt; = C | g(x)|对于所有x> N

直观地说,这意味着f的增长速度不会比g

如果a是某个实数,我们写

  对于x-> a

f(x)= O(g(x))

当且仅当存在常数d> 0和C这样

  

| F(X)| &lt; = C | g(x)|对于所有x与| x-a | &LT; d

因此,对于您的情况,它将是

  

O(n)为| f(x)| &GT; Ç| G(X)|

来自http://web.mit.edu/16.070/www/lecture/big_o.pdf

的参考资料
int total = 0;
for (int i = n; i < n - 1; i++) { // --> n loop
    for (int j = 0; j < n; j++) { // --> n loop
        total = total + 1; // -- 1 time 
    }
}

}

Big O Notation给出一个假设,当值非常大时外循环将运行n次并且内循环运行n次

假设n - &gt; 100比总n ^ 2 10000次运行时间

答案 1 :(得分:1)

您的分析并不完全正确。

  1. 步骤1确实需要O(1)操作
  2. 第2步确实需要O(n)操作
  3. 步骤3进行O(1)操作,但执行n次,因此它对复杂性的全部贡献是O(1 * n)= O(n)
  4. 步骤4进行O(1)操作,但最多执行n次,因此它对复杂性的全部贡献也是O(1 * n)= O(n)
  5. 整个复杂度为O(1)+ O(n)+ O(n)+ O(n)= O(n)。

答案 2 :(得分:1)

步骤3和4的计算不正确,因为这两个步骤都在for循环中。

  

所以步骤2,3和4的复杂度将是O(n)*(O(1)+ O(1))= O(n)   当用步骤1进行球杆击球时,它将是O(1)+ O(n)= O(n)。