2016-05-04 59 views
4

所以我理解大多數複雜性問題;然而,這讓我感到困惑。最差的時間複雜度(大O)for循環

當for循環中的第二條語句如下(i * i < n)時,對於循環來說,Big Big O會是什麼?它將如何計算?

for (i = 1 ; i * i < n ; i++) 

回答

6

假設n是輸入的大小的代理(和您的代碼將只對輸入的每個加工的構件執行循環體一次,並且不存在其他輸入元件選擇器邏輯)。

i * i < n 
    i^2 < n 
    i < Sqrt(n) 

所以,時間複雜度爲O(Floor(Sqrt(n)))

讓我們來看一個例子與n = 10(該表顯示了變量的狀態在每次迭代結束時,此刻i++評估準確之前和進行i * i < n檢驗)。

Iteration, i, i * i, n 
     1, 1,  1, 10 
     2, 2,  4, 10 
     3, 3,  9, 10 
     4, 4,  16, 10 -- 16 > 10, abort loop 
     5, 5,  25, 10 -- for illustrative purposes 

(注意,作爲i^2 < 10檢查之前執行執行循環,迭代4將不會被執行,因此該循環將被執行3次。10精確平方根是3.1622...但迭代計數是基於0的自然數,所以使用Floor。)。

+1

大解釋' –

6
i*i<n 

可以轉化爲

i<sqrt(n) 

因此其實際上可以O(sqrt(n))

*如何*`* I
  0

呵呵,我從來沒有真正遇到過這種形式,只有O(n)有各種指數,O(logn)或(n logn),當然也是常數。那麼它實際上可以寫成「O(√n)」嗎,這是一種被接受的「語法」嗎? 04 5月. 162016-05-04 21:37:00

  0

@mbksr正確。任何代數表達式(和符號)都可以在'O()'中使用。注意'O()'不一定是'n'的函數,例如,如果你正在處理一個二維數組(在這種情況下,它分別是寬度和高度分別爲「m」和「n」的函數)。 04 5月. 162016-05-04 21:43:42

+1

@mbksr'O()'可以用於任何類型的函數。它僅僅是一種表達方式,兩種功能的增長之間存在關聯:[關於符號的wiki文章](https://en.wikipedia.org/wiki/Big_O_notation) 04 5月. 162016-05-04 21:46:48

+0

呵呵,我從來沒有真正遇到過這種形式,只有O(n)有各種指數,O(logn)或(n logn),當然也是常數。那麼它實際上可以寫成「O(√n)」嗎,這是一種被接受的「語法」嗎? – mbksr

+0

@mbksr正確。任何代數表達式(和符號)都可以在'O()'中使用。注意'O()'不一定是'n'的函數,例如,如果你正在處理一個二維數組(在這種情況下,它分別是寬度和高度分別爲「m」和「n」的函數)。 – Dai

+1

@mbksr'O()'可以用於任何類型的函數。它僅僅是一種表達方式,兩種功能的增長之間存在關聯:[關於符號的wiki文章](https://en.wikipedia.org/wiki/Big_O_notation) – h8red