所以我理解大多數複雜性問題;然而,這讓我感到困惑。最差的時間複雜度(大O)for循環
當for循環中的第二條語句如下(i * i < n)時,對於循環來說,Big Big O會是什麼?它將如何計算?
for (i = 1 ; i * i < n ; i++)
所以我理解大多數複雜性問題;然而,這讓我感到困惑。最差的時間複雜度(大O)for循環
當for循環中的第二條語句如下(i * i < n)時,對於循環來說,Big Big O會是什麼?它將如何計算?
for (i = 1 ; i * i < n ; i++)
假設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
。)。
i*i<n
可以轉化爲
i<sqrt(n)
因此其實際上可以O(sqrt(n))
呵呵,我從來沒有真正遇到過這種形式,只有O(n)有各種指數,O(logn)或(n logn),當然也是常數。那麼它實際上可以寫成「O(√n)」嗎,這是一種被接受的「語法」嗎? – mbksr 04 5月. 162016-05-04 21:37:00
@mbksr正確。任何代數表達式(和符號)都可以在'O()'中使用。注意'O()'不一定是'n'的函數,例如,如果你正在處理一個二維數組(在這種情況下,它分別是寬度和高度分別爲「m」和「n」的函數)。 – Dai 04 5月. 162016-05-04 21:43:42
@mbksr'O()'可以用於任何類型的函數。它僅僅是一種表達方式,兩種功能的增長之間存在關聯:[關於符號的wiki文章](https://en.wikipedia.org/wiki/Big_O_notation) – h8red 04 5月. 162016-05-04 21:46:48
呵呵,我從來沒有真正遇到過這種形式,只有O(n)有各種指數,O(logn)或(n logn),當然也是常數。那麼它實際上可以寫成「O(√n)」嗎,這是一種被接受的「語法」嗎? – mbksr
@mbksr正確。任何代數表達式(和符號)都可以在'O()'中使用。注意'O()'不一定是'n'的函數,例如,如果你正在處理一個二維數組(在這種情況下,它分別是寬度和高度分別爲「m」和「n」的函數)。 – Dai
@mbksr'O()'可以用於任何類型的函數。它僅僅是一種表達方式,兩種功能的增長之間存在關聯:[關於符號的wiki文章](https://en.wikipedia.org/wiki/Big_O_notation) – h8red
大解釋' –