i <-- 1
while(i < n)
j <--1
while(j < i)
j <-- j * 2
i <-- i + 1
done
我在這裏拍攝的內容是O(log n)
。我猜外環是O(n)
,整體複雜度爲O(n log n)
。確認?Big-O嵌套while循環
i <-- 1
while(i < n)
j <--1
while(j < i)
j <-- j * 2
i <-- i + 1
done
我在這裏拍攝的內容是O(log n)
。我猜外環是O(n)
,整體複雜度爲O(n log n)
。確認?Big-O嵌套while循環
是的,你是對的,但它不是那麼簡單,正確地弄清楚:)。
內環是微不足道的log n
,沒有必要進一步解釋。
但是,外循環並不那麼簡單,因爲在每個循環中它會改變內循環執行的時間。
如果你想想看,內循環將被用於(爲i
增加)運行:
log 1 + log 2 + log 3 + log 4 + log 5 .... + log n
到logharitms的一些規律。由於,這是一樣的log (1*2*3*4*....*n)
是相同
log (n!)
有一個法律,n!
具有相同的複雜性(注意,這是複雜,它不是在代數相同)n^n
因此log (n!) = O(log (n^n))
現在我們只需切換到代數,因爲log (n^k) = k*log (n)
我們得到的結果
log (n^n)
= n log n
結果:
時間複雜度爲O(n log n)
該法則被稱爲斯特林近似http://en.wikipedia.org/wiki/Stirling%27s_approximation – AbcAeffchen
呦你可以用Sigma符號一步一步地正式進行,以獲得確切的迭代次數 - 查看Discrete Loops and Worst Case Performance論文(第10頁)。
結果已經被經驗證實。
看起來對我來說總的來說,雖然我認爲內循環實際上是記錄n/2,因爲它是基於我。除以2,通常不會顯示爲大O,但我相信你是正確的。 –
順便說一句,如果您要將僞代碼更改爲'C'代碼並將其標記爲此,您將獲得更多的視圖。 –
不可以。因爲你沒有在循環中做任何事情,編譯器會優化它:-) – Bergi