我有一個大的列表發送到我的web服務的整數。我們的業務規則聲明這些值必須是唯一的。找出是否存在重複的最高性能方法是什麼?我不需要知道值,我只需要知道兩個值是否相等。起初我在考慮使用通用整數列表和list.Exists()方法,但這是O(n);用整數集合檢查存在的最高性能方法是什麼?
然後我在考慮使用Dictionary和ContainsKey方法。但是,我只需要Keys,我不需要這些值。我認爲這也是一種線性搜索。
是否有更好的數據類型用於查找列表中的唯一性?或者我堅持線性搜索?
我有一個大的列表發送到我的web服務的整數。我們的業務規則聲明這些值必須是唯一的。找出是否存在重複的最高性能方法是什麼?我不需要知道值,我只需要知道兩個值是否相等。起初我在考慮使用通用整數列表和list.Exists()方法,但這是O(n);用整數集合檢查存在的最高性能方法是什麼?
然後我在考慮使用Dictionary和ContainsKey方法。但是,我只需要Keys,我不需要這些值。我認爲這也是一種線性搜索。
是否有更好的數據類型用於查找列表中的唯一性?或者我堅持線性搜索?
使用HashSet<T>
:
的HashSet的類提供高 表現的一組操作。一組是 集合,不包含重複 元素,且其元素沒有 特定的順序
HashSet<T>
甚至公開a constructor that accepts an IEnumerable<T>
。通過將您的List<T>
傳遞給HashSet<T>'s
構造函數,您將最終引用一個新的HashSet<T>
,它將包含來自原始List<T>
的不同序列的項目。
聽起來像一個Hashset工作...
如果您使用的框架3.5,你可以使用HashSet
集合。
否則最好的選擇是Dictionary
。每件物品的價值都將被浪費,但這會給你帶來最好的表現。
如果您在將項目添加到HashSet/Dictionary時檢查重複項,而不是在之後對它們進行計數,那麼在重複項的情況下性能會比O(n)好,因爲您不必繼續照顧找到第一個副本。
如果這組數字是稀疏的,那麼其他人建議使用HashSet。
但是,如果這組數字大部分是偶爾出現間隙,那麼如果您將數字集存儲爲開始,結束對的排序數組或二叉樹,那將會好很多。然後,您可以搜索以找到最小開始值小於您的搜索關鍵字的對,並與該對結束值進行比較以查看它是否存在於集合中。
關於做什麼:
list.Distinct().Count() != list.Count()
我想知道的這個性能。我認爲它會和O(n)一樣好,但代碼少,易讀。
當inputList.Count!= hashSet.Count,「休斯頓,我們有重複!」 – user7116 2009-08-21 20:34:43
哪個還是O(n),我認爲他能得到的最好。 – Marc 2009-08-21 20:35:10
@sixlettervariables - 優點! – 2009-08-21 20:35:21