[英]O(n log m) vs O(n+m) - which is better?
嗨,這個時間復雜度哪個更好。
O(n log m)
vs O(n + m)
分析這兩種算法,哪一種更適合大規模使用?
例如)如果 n 和 m 呈指數級大,則變為
O(2e)
vs O(e*(something linear to e))
示例問題: 2 個數組中的公共元素:
1) 2 指針方法
2) 使用二分查找
我認為您要問的是如何最好地找到兩個排序數組中的公共元素。 您可以選擇兩種算法:
如果數組接近於相同的大小,那么第一個嚴格線性的算法是可取的。
如果其中一個數組比另一個大得多,那么您可能需要考慮二分查找方法。 您需要在較大的數組中搜索較小數組中的項目。 例如,如果您有數組 M 和 N,其中 M 有 1,000,000 個項目,N 有 100 個項目,您有一個選擇:
如果你在 N 中尋找 M,那么復雜度是 O(m log n)。 這里, m=1000000
和log(n)=7
(大約)
如果你在 M 中尋找 N,那么復雜度是 O(n log m)。 n=100
和log(m)=20
(大約)。
在那種情況下你想要做什么很清楚。
在實踐中,是否應該使用 O(m+n) 或 O(n log m)(其中 n 小於 m)算法之間的界限只能憑經驗確定。 這不僅僅是確定是否(m + n) < (n log m)
,因為二分搜索涉及一些雙指針方法沒有的開銷。 即使(m + n)
是兩倍或三倍(n log m)
,雙指針方法也很可能會更快。
兩者都不是更好,因為它取決於n
和m
的相對值。
如果您假設它們相等,則您有O(n log n)
與O(n)
,因此第二個( O(n + m)
)更快。 另一方面,如果n
實際上是常數而m
快速增長,那么您正在查看O(log m)
與O(m)
,因此第一個更好。
基本上,第一個對於大m
更好,第二個對於它們都很大的情況更好。 (如果n
在方程中占主導地位,那么它們都只是線性的。)
總之,根據您選擇的兩個數組的長度,結果是 m+n 與(mlogn 或 nlogm 之一)的值。 雖然 Big-O 復雜度分析沒有考慮對數的“底數”,但對於這些值決定更好復雜度的問題,需要注意的一點是對數的底數是“2”而不是“10”,具體例子用於計算查看的元素數量或完成的比較數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.