簡體   English   中英

在算法時間復雜度上總是 O(1) 優於 O(n)?

[英]Always O(1) is better than O(n) in algorithm time complexity?

我想問一下,如果我有一個算法需要 O(100) ----> O(1) 時間復雜度,並且我有一個算法需要 O(n) 來解決同樣的問題,但是如果我知道 n 的最大值是 50,那么我可以決定它的最壞情況是 O(50) 所以在這種情況下仍然是 O(1) 算法還是第二個 O(n) 算法是最好的選擇? 所以如果是第二個,我們能不能總說 O(1) 比 O(n) 好?

一定不; 總是 大 O只是一種漸近行為,這就是為什么

O(1) == O(0.001) == O(50) == O(100) == O(C) # where C is any positive constant

相同的O(n)

O(n) == O(0.001n) == O(100n) == O(C * n)    # where C is any positive constant

使用時序對兩種算法進行成像

t1 = 1e100 (seconds) = O(1)
t2 = n     (seconds) = O(n)

對於無限n (漸近行為),第一種算法優於第二種算法,但對於所有真實世界的情況(小nt2更可取。 甚至縮放還不夠:

t1 = 1000               (seconds)
t2 = 100 * n            (seconds)
t3 = n + 1e100 * log(n) (seconds)

算法 3 具有更好的縮放比例( 1 vs. 100 : n vs 100 * n ),但1e100 * log(n)項使其無法在現實世界中完成。

因此,在一般情況下,您應該比較函數而不是O

t1 = 100 (seconds)
t2 = n   (seconds)

在這里,如果n <= 50那么t2是更好的選擇(對於n > 1000我們正好相反)

兩種算法:

100n -> O(n)

10n² -> O(n²)

如果 n < 10,二次時間算法更好。 如果 n > 10,線性時間算法更好。

也有實際用例。 快速排序算法 (avg: O(n log(n))) 通常使用插入排序 (avg: O(n²)),以防給定的數據集合足夠小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM