2014-09-29 84 views
0

我想了解Big-O時間複雜度,我不幸掙扎着,我似乎無法理解概念,但我知道我的結果對於以下兩個代碼片段是正確的我怎麼到那裏似乎是錯誤的。會有人能夠幫忙解釋一下,我是錯誤的理解(不請,但不使用西格瑪。謝謝!Big-O時間複雜度,嵌套for while while循環

Code Fragment    Time Complexity 
sum ← 0      O(1) 
    for i ← 1 to n do   O(n) 
    for j ← 1 to n do  O(n) 
     k←1     O(1) 
     while k < n do   
     k ← k * C   O(log n) - affected by C (due to multiplication) 
     sum ← sum + 1  O(1) 
          ----------- 
          O(1 x n x n x 1 x [log n] x 1) 
          O(n2 log n) 

Code Fragment    Time Complexity 
sum ← 0     O(1) 
for i ← 1 to n do  O(n) 
    for j ← 1 to i do  O(n) 
    k←1     O(1) 
    while k < n do  
     k ← k + C   O(n) – not affected by C, k is arbitrarily large 
     sum ← sum + 1  O(1) 
          ----------- 
          O(1 x n x n x 1 x n x 1) 
          O(n^3) 
+0

你難道不明白哪一步? – Eran 2014-09-29 20:12:49

+0

另外,這與Java有什麼關係? – 2014-09-29 20:13:26

+0

我認爲有一件事情你的時間複雜性是關閉的,那就是k * C的O(log n)。相反,由於循環變量的乘法運算,上面的循環運行了很多次。同樣在第二段代碼中。爲了比較,您還可以爲for循環指定一個複雜度! – 2014-09-29 20:17:50

回答

3

我看到小錯誤的計算,儘管最終的結果是正確的。

在第一算法:

O(1 x n x n x 1 x [log n] x 1) 

應該是

1 + n x n x (1 + (O(log n) x 2)) = O(n^2 * log n) 

在第二一lgorithm:

O(1 x n x n x 1 x n x 1) 

應該

1 + n x O(n) x (1 + (O(n) x 2)) = O(n^3) 
+0

+1我完全同意。 – Alboz 2014-09-29 20:29:28

+0

出於好奇,log n和b之間的原因只是n ...是因爲K * C vs k + C OR,因爲第二個for循環是基於i – Zak 2014-09-29 21:12:23