2009-08-21 54 views
0

我有一個大的列表發送到我的web服務的整數。我們的業務規則聲明這些值必須是唯一的。找出是否存在重複的最高性能方法是什麼?我不需要知道值,我只需要知道兩個值是否相等。起初我在考慮使用通用整數列表和list.Exists()方法,但這是O(n);用整數集合檢查存在的最高性能方法是什麼?

然後我在考慮使用Dictionary和ContainsKey方法。但是,我只需要Keys,我不需要這些值。我認爲這也是一種線性搜索。

是否有更好的數據類型用於查找列表中的唯一性?或者我堅持線性搜索?

回答

15

使用HashSet<T>

的HashSet的類提供高 表現的一組操作。一組是 集合,不包含重複 元素,且其元素沒有 特定的順序

HashSet<T>甚至公開a constructor that accepts an IEnumerable<T>。通過將您的List<T>傳遞給HashSet<T>'s構造函數,您將最終引用一個新的HashSet<T>,它將包含來自原始List<T>的不同序列的項目。

+4

當inputList.Count!= hashSet.Count,「休斯頓,我們有重複!」 – user7116 2009-08-21 20:34:43

+0

哪個還是O(n),我認爲他能得到的最好。 – Marc 2009-08-21 20:35:10

+0

@sixlettervariables - 優點! – 2009-08-21 20:35:21

1

聽起來像一個Hashset工作...

0

如果您使用的框架3.5,你可以使用HashSet集合。

否則最好的選擇是Dictionary。每件物品的價值都將被浪費,但這會給你帶來最好的表現。

如果您在將項目添加到HashSet/Dictionary時檢查重複項,而不是在之後對它們進行計數,那麼在重複項的情況下性能會比O(n)好,因爲您不必繼續照顧找到第一個副本。

0

如果這組數字是稀疏的,那麼其他人建議使用HashSet。

但是,如果這組數字大部分是偶爾出現間隙,那麼如果您將數字集存儲爲開始,結束對的排序數組或二叉樹,那將會好很多。然後,您可以搜索以找到最小開始值小於您的搜索關鍵字的對,並與該對結束值進行比較以查看它是否存在於集合中。

0

關於做什麼:

list.Distinct().Count() != list.Count() 

我想知道的這個性能。我認爲它會和O(n)一樣好,但代碼少,易讀。

相關問題