2015-11-07 67 views
2

我正在嘗試確定這些循環的Big-O運行時間。我相信我的答案是正確的,但我想與社區覈對。確定這些循環的Big-O運行時間

int sum = 0; 
for (int i = 1; i <= n*2; i++) 
    sum++; 

我的回答是O(n)

這是因爲循環迭代的N×2倍。我們放棄2,並留下n。因此O(n)。

int sum = 0; 
for (int i = 1; i <= n; i++) 
    for (int j = n; j > 0; j /= 2) 
     sum++; 

我的回答是O(n LGN)

外循環迭代n次。內循環從n重複爲0,但只能通過一半的項目。這可以看作是n的Log base 2。我們放下2並保持記錄n。內循環(log n)乘以外循環(n),給我們O(n lgn)。

int sum = 0; 
for (int i = 1; i <= n; i++) 
    for (int j = i; j <= n; j += 2) 
     sum++; 

我的回答是O(n^2)

這一個是容易的。內循環和外循環每次迭代n次。 n x n = n^2。因此O(n^2)。

int sum = 0; 
for (int i = 1; i <= n * n; i++) 
    for (int j = 1; j < i; j++) 
     sum++; 

我的回答是O(n^3)

是我的答案是否正確?如果不是,我該如何糾正它們?

+1

你能解釋你是如何得到你的答案的,特別是最後一個? –

+0

@ScottHunter,我所有的工作都是用筆和紙寫出來的,但我會嘗試更新這個問題來包含它。 –

回答

2

只有最後一個是錯誤的。它應該是O(n 4)。

你可以這樣看:用x代替n * n。操作次數將是通常的O(x *(x + 1)/ 2)= O(x 2)。現在用n * n替換回x


對你來說是額外的挑戰。

你正確地說:

int sum = 0; 
for (int i = 1; i <= n; i++) 
    for (int j = n; j > 0; j /= 2) 
     sum++; 

是O(n log n)的。但對於這一個:

int sum = 0; 
for (int i = 1; i <= n; i++) 
    for (int j = i; j > 0; j /= 2) 
     sum++; 

我只改j = nj = i

+1

如果你放棄,答案是:它是O(log(i))對於i = 1到n的總和,因此:O(log(1)+ log(2)+ log(3)+ ... + log(n))= O(log(1 * 2 * 3 * ... * n))= O(log(n!))[= O(n log n)] /問題/ 8118221 /什麼 - 是 - ologn和 - 通 - 斯特林近似)。 – wil93

+0

謝謝!這幫了我很多。我看到最後一個出錯的地方。我想另一種方式來考慮它是內循環迭代1 + 2 + 3 + ... +((n(n + 1)/ 2))次,這等於n^2。外循環也迭代n^2次。所以當倍增時,你會得到n^4次。 –