![](/img/trans.png)
[英]Is an algorithm with a worst-case time complexity of O(n) always faster than an algorithm with a worst-case time complexity of O(n^2)?
[英]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
(漸近行為),第一種算法優於第二種算法,但對於所有真實世界的情況(小n
) t2
更可取。 甚至縮放還不夠:
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.