2011-05-10 54 views
6

兩種常用的方法來檢測在陣列中重複第三方式:找到一種重複

1)排序第一,時間複雜性爲O(n log n)的,空間複雜度O(1)

2)的散列設置,時間複雜度O(n),空間複雜度O(n)

是否有第三種方法來檢測重複?

請不要回答蠻力。

+0

相關:[有效的方法從數組中刪除重複的整數](http://stackoverflow.com/questions/1532819/algorithm-efficient-way-to-remove-duplicate-integers-from-an-array) – 2011-05-12 03:56:36

回答

5

另一個選項是Bloom filter。複雜性O(n),空間不同(幾乎總是小於散列),但是存在誤報的可能性。數據集的大小,過濾器的大小以及您可以預期的誤報數量之間存在複雜的關係。

在進行更昂貴的重複檢查之前,布隆過濾器通常用作快速「完整性檢查」。

+0

Hashset是解決這個問題的更嚴肅的解決方案。 – 2018-01-17 00:57:43

+0

@KarimManaouil我也會先找到一個哈希集,但那是我們被要求不提供的潛在答案之一。布盧姆過濾器是大規模實踐中使用的第三種方法。 – btilly 2018-01-17 01:14:14

+0

在數組非常大或處理設備是嵌入式系統的情況下,我同意bloom過濾器的使用,其中內存約束是特定實現的主要決定因素(尤其是,如果有義務實現O(N)時間複雜度)。無論如何,布隆過濾器比這種情況下有更好的使用情況(例如磁盤I/O,網絡)。 – 2018-01-17 14:22:01

4

取決於信息。

如果您知道數字的範圍,如1-1000,則可以使用位數組。

比方說的範圍是一個。B

使一個位陣列與(B-A)位。它們初始化爲0

遍歷數組,當你到了數x,在地方改變位X-A爲1

如果有一個1已經存在,你有一個重複。

時間複雜度:爲O(n)

空間複雜度:(B-A)位