2010-09-08 81 views
1

你好,这是一段时间的罪我已经使用大O符号,所以我有点生疏。我知道有1个循环,循环n次是O(n),并且有1个循环在循环n次的另一个循环内循环n次是O(n^2)。大O为代码片段

但是,在下面的代码片段中,我有一个循环,循环n次,并在该循环内循环n-i次。

对于这段代码,最坏的和最好的O符号是什么?

最糟糕的是它没有发现碰撞的情况下运行,最好的情况是两个第一个矩形之间有碰撞。

class TestClass 
{ 
    bool Run(List<Rectangle> R) 
    { 
     var b = false; 
     var i = 0; 
     var n = R.Count; 
     var j = 0; 
     while ((i < n-1) && !b) 
     { 
      j = i + 1; 
      while (j<n && !b) 
      { 
       if ((R[i].x >= R[j].x - R[i].w) && (R[i].x <= R[j].x + R[j].w)) 
        if ((R[i].y <= R[j].y + R[i].h) && (R[i].y >= R[j].y - R[j].h)) 
         b = true; 
       j++; 
      } 
      i++; 
     } 

     return b; 
    } 
} 

public class Rectangle 
{ 
    public int x; 
    public int y; 
    public int w; 
    public int h; 
} 
+4

Big-O表示法总是指最坏的情况。 – Turnor 2010-09-08 15:32:28

+1

@Turnor:嗯?巴赫曼 - 朗道符号告诉你两个函数相互之间的增长有多快。而已。它没有告诉你任何有关这些功能*的含义*。在编程中,我们通常使用巴赫曼 - 朗道符号来比较最坏情况,最佳情况,平均情况,分期最坏情况,几乎总是情况下的空间,时间和步骤复杂性。 – 2010-09-08 17:11:16

+0

你必须更具体。 Big-O只是告诉你一个函数是否比另一个函数增长更快。但是你不告诉我们你正在寻找哪个功能。空间复杂?时间复杂性?步骤复杂?你在寻找哪种情况?最坏的情况下,最好的情况下,平均情况下,摊销最坏情况?你是否确定*你想要Big-O而不是Big-Θ?目前,这个问题没有包含足够的信息来回答。 – 2010-09-08 17:14:55

回答

1

您的实际最坏情况运行时间是n X n/2 =n²/ 2。抛弃常量,它是O(n²)

+0

Arr是真的,谢谢:D最好的情况是O(1)对不对? – Androme 2010-09-08 15:42:39

+0

请注意,我假设你的i以每个嵌套循环1个增量的速率接近n。我没有看到你在任何地方修改了代码中的值,但我也无法在冰箱中找到mayonaise,所以我可能错过了它... – Kendrick 2010-09-08 15:44:00

+1

O(1)是一个微不足道的情况如果你正在处理所有的元素,最好的情况是O(n) – Kendrick 2010-09-08 15:45:44

3

作为一个评论者指出,大澳始终是对最坏的情况下,如果增加R.Count的价值往往会令你的最坏的情况在大于n的速率增长* log(n),你会进入n²的领域。

由于你有一个双嵌套的while循环,并且不需要额外的方法调用,所以我一眼就知道它是O(n²)。

然而,在这种情况下,由于i和j从不增加,以及n从不递减,你的循环都是基于i或j小于n,此功能将是(根据您的if声明退出的时候了),否则它永远不会。

O(infinity)? 

编辑

好了,现在你递增。其中,N *(NI)位基本上平均到N *(N/2)每次运行时(不是平均的所有运行,但是对于每个运行而言平均为)。这是因为当你在外部循环中移动时,你会做(n,n-1,n-2,...,3,2,1)内部循环。如果折叠此设置本身,你可以很容易总结的回路数:

n + 1 == n + 1 
(n-1) + 2 == n + 1 
(n-2) + 3 == n + 1 
... 

所以,你最终与正的N/2个实例+ 1,其中就出来(N²+ N)/ 2。从大O的角度来看,这与n²相同。

+0

是的,这将是我的猜测。但是那个n *(n-i)的东西正在搞砸我 – Androme 2010-09-08 15:40:34

+0

@DoomStone:已更新。除非我错过了某些东西,否则这看起来可能会永久运行,具体取决于输入。 – StriplingWarrior 2010-09-08 15:46:35

+0

这是我的不好,我忘了添加i ++和j ++ – Androme 2010-09-08 15:51:58