你好,這是一段時間的罪我已經使用大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