程序复杂性类

时间:2013-08-15 17:21:52

标签: algorithm complexity-theory big-o

基本上我很难掌握操作计数和Big-O表示法。我知道它可能是理解计算机科学中较难的部分之一,我不得不承认我正在努力解决它。任何人都可以给我一些这些例子的帮助,可能还有任何与Big-O有关的帮助/链接吗?

for (i = 0; i < N; i++)
     { for (j = i; j < N; j++)
          { sequence of statements }
     }

这里我要说复杂度是O(N²) - 二次

int m = -9
for (j = 0; j < n; j+=5)
     {
     if (j<m)
          {
          for (k = 1; k <n; k*=3)
               {some code}
               }
     }

这里我也说是O(N²)。第一个循环取N,第二个循环取N,所以我想答案是O(N * N)等于O(N²)。

任何有关进一步理解的帮助和建议都会很棒!!

5 个答案:

答案 0 :(得分:2)

第一个确实是O(n^2),正如您所怀疑的那样,假设“语句序列”为O(1)

然而,代码的第二部分是O(n),因为条件j < m永远不会被满足 - 因此,外部循环只迭代自身而实际上什么都不做。内循环甚至无法到达。

作为旁注,一些编译器实际上可以通过设置变量的结束值来优化代码的第二部分以在O(1)中运行,但这不是问题的关键点。

答案 1 :(得分:1)

第二个例子是复杂性O(N)

int m = -9
for (j = 0; j < n; j+=5)
{
    if (j<m)
    {
        // this never executes; m is negative and j is positive
    }
}

答案 2 :(得分:0)

第一个例子: 内环在i = 0时执行N次,在i = 1时执行N-1次,依此类推...... 您只需计算for循环执行的步数

  

(N)+(N-1)+(N-2)+ ... + 2 + 1

     步骤= N(N + 1)/ 2 =(N ^ 2 + N)/ 2

     
      
  1. N&lt; =&gt; 1 |向左添加| =&GT; N + 1
  2.   
  3. (N-1)&lt; =&gt; 2 |向左添加| =&GT; N + 1
  4.   
  5. (N-2)&lt; =&gt; 3 |向左添加| =&GT; N + 1。 。 。 Ñ
  6.   

大O国意味着什么?

  

F(N)= O(G(N))表示| F(N)|&lt; = c * | G(N)|其中c> 0

这意味着G(N)函数是函数的grothw率的上限。 F(N)不能比G(N)生长得快。

答案 3 :(得分:0)

在这里抛出这个:如果我们假设j<-9子句是一个错误并忽略它,那么你的第二个例子有两个嵌套循环。然而,内部循环实际上是乘以 k次3.所以这使得这个内部循环为O(log n)。这使得这对循环O(n log n)。我不确定这是 的答案,但你要求进一步了解,所以......你知道......也许还有更多。

答案 4 :(得分:0)

好的,还有一点,我建议你在一系列算法介绍中进行一次演讲。相信我,你不需要再看了。 http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures/