2017-04-18 40 views
2

假設我有兩個項目集合,並且我想找到它們的交集。使用具有虛擬值的字典是不好的做法

因爲這些只是值而不是鍵值對,所以通常會使用List而不是Dictionary。

但是,找到兩個列表的交集需要一個嵌套循環,因此O(n^2)的複雜性,而對於字典,所需的時間是O(n)。

如果我們正在處理大量的項目,顯然我們會盡量避免O(n^2),所以答案很簡單。我的問題更多的是關於項目數量很少而且不可能增長的情況。

是它被認爲是不好的做法,使用辭典:

  • 重點= ItemType的
  • 值= {虛擬}

只是不斷的查找功能,即使性能不是一個問題?我能想到的缺點是:

  1. 使用比必要的更復雜的數據結構。
  2. 由於該值爲虛擬值,所以令讀者感到困惑。
+7

考慮'HashSet '而不是'字典' –

+0

我會看看HashSet數據結構 - https://msdn.microsoft.com/en-us/library/bb359438(v=vs。 110)。aspx – pbarrasso

回答

7

幾乎每一個情況下,你應該有利於可讀性和可維護性上的表現,特別是在這種情況下,除非您的收藏是巨大的差異可能是微不足道的。

其結果是,除非你能證明有通過列表的交集一個顯著的性能問題,你會介紹很少獲得了較大的維修問題。

最後,請考慮如果使用帶有虛擬值的字典,則您已將內存交換爲cpu/time。這在某些情況下可能無關緊要,可能在其他情況下成爲交易破壞者。

在一天結束時,這感覺就像不成熟的優化,應該可以避免。正如其他人在評論中提到的那樣,其他選項(如HashSet<T>)可以在不編寫混淆代碼的情況下滿足您的性能目標,並且可以使用更少的內存。

+1

固體和健全的建議 – CodingYoshi

4

HashSet<T>類在功能上類似於具有虛擬值的Dictionary<T>。它也設計只是這些類型的一組操作:

var hashset = new HashSet(myList1); // this is O(n) 
hashset.IntersectWith(myList2);  // this is O(n+m) 

https://msdn.microsoft.com/en-us/library/bb293080(v=vs.110).aspx

但正如@ DavidL的答案,它真的可能不會,如果你的藏品都比較小是值得的麻煩。

+0

這是非常有用的,謝謝! –

相關問題