2014-11-08 212 views
0
for(int i = 1; i < n; i = i ∗ 2){ 
    for(int j = 0; j < n; j++){ 
     if(i == j){ 
      for(int k = 0; k < n; k++){ 
       // Do something elementary 
      } 
     }else{ 
      // Do another elementary thing 
     } 
    } 
} 

我正在做一些練習,有人可以幫我弄清楚上述算法的Θ嗎?我明白,如果它只是兩個外部嵌套循環,則時間複雜度應該是Θ(nlogn)。但我不知道如何處理if-else語句。提前謝謝了!嵌套循環的時間複雜度

+0

提示1:在這個循環中「i == j」有多少次?提示2:你能把最裏面的循環從中間循環中提出來,這樣程序就變得更容易分析了嗎? – 2014-11-08 10:08:51

+0

謝謝。我一直在考慮有多少次我== j,但沒有結論.. – stillAFanOfTheSimpsons 2014-11-08 10:13:03

+0

@matheburg通常假定比較和分支需要O(1)次。 – 2014-11-08 10:14:26

回答

3

您執行外環log(n)次,因爲你我每一次雙重價值

然後你執行內環n次,最後內環INF if語句,你執行一次(如果i == j持有)n次,這整個內循環每次需要n + n步。

這給你一個上限的O(2n log(n))而且由於常量不改變漸進複雜的運行是由O(n log(n))

for(int i = 1; i < n; i = i ∗ 2){     ---------- 
for(int j = 0; j < n; j++){   ----------    | 
    if(i == j){         |   | 
     for(int k = 0; k < n; k++){  ----  |   | 
      // Do something elementary  | (n | + n)  | * log(n) 
     }        ----  |   | 
    }else{          |   | 
     // Do another elementary thing   |   | 
    }         ----------    | 
}                | 
}                | 
                ------------ 

注意,最內層循環每秒最內環只執行一次(有界!),並且由於第二個最內部的循環得到執行log n次(具有n步驟),我們必須將最內部循環的n時間添加到第二個最內部循環的運行時間,然後將它乘以最接近的最後循環的總時間內循環執行

+0

最內層的循環如何被執行n次?我不知道它應該運行多少次,但我想我== j將不會發生n次? – stillAFanOfTheSimpsons 2014-11-08 10:18:44

+0

這是正確的它只獲得執行一次,但循環本身有n個步驟 – wastl 2014-11-08 10:19:32

+0

說,例如,當n = 16時,最內在的循環執行時,我= j = 2,4和16,這不是一次,但3次正確? – stillAFanOfTheSimpsons 2014-11-08 10:24:30