你好,这是一段时间的罪我已经使用大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;
}
Big-O表示法总是指最坏的情况。 – Turnor 2010-09-08 15:32:28
@Turnor:嗯?巴赫曼 - 朗道符号告诉你两个函数相互之间的增长有多快。而已。它没有告诉你任何有关这些功能*的含义*。在编程中,我们通常使用巴赫曼 - 朗道符号来比较最坏情况,最佳情况,平均情况,分期最坏情况,几乎总是情况下的空间,时间和步骤复杂性。 – 2010-09-08 17:11:16
你必须更具体。 Big-O只是告诉你一个函数是否比另一个函数增长更快。但是你不告诉我们你正在寻找哪个功能。空间复杂?时间复杂性?步骤复杂?你在寻找哪种情况?最坏的情况下,最好的情况下,平均情况下,摊销最坏情况?你是否确定*你想要Big-O而不是Big-Θ?目前,这个问题没有包含足够的信息来回答。 – 2010-09-08 17:14:55