2010-09-08 79 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