簡體   English   中英

O(n log m) vs O(n+m) - 哪個更好?

[英]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) 使用二分查找

我認為您要問的是如何最好地找到兩個排序數組中的公共元素。 您可以選擇兩種算法:

  1. “雙指針”方法,即 O(m + n)。
  2. 使用二分查找來確定數組 N 中的項是否在數組 M 中。這是 O(n log m)。

如果數組接近於相同的大小,那么第一個嚴格線性的算法是可取的。

如果其中一個數組比另一個大得多,那么您可能需要考慮二分查找方法。 您需要在較大的數組中搜索較小數組中的項目。 例如,如果您有數組 M 和 N,其中 M 有 1,000,000 個項目,N 有 100 個項目,您有一個選擇:

  • 在 N 中查找 M(即對 100 的數組進行 1,000,000 次搜索)
  • 在 M 中查找 N(即對 1,000,000 的數組進行 100 次搜索)

如果你在 N 中尋找 M,那么復雜度是 O(m log n)。 這里, m=1000000log(n)=7 (大約)

如果你在 M 中尋找 N,那么復雜度是 O(n log m)。 n=100log(m)=20 (大約)。

在那種情況下你想要做什么很清楚。

在實踐中,是否應該使用 O(m+n) 或 O(n log m)(其中 n 小於 m)算法之間的界限只能憑經驗確定。 這不僅僅是確定是否(m + n) < (n log m) ,因為二分搜索涉及一些雙指針方法沒有的開銷。 即使(m + n)是兩倍或三倍(n log m) ,雙指針方法也很可能會更快。

兩者都不是更好,因為它取決於nm的相對值。

如果您假設它們相等,則您有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.

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