add() 性能:哈希集、<T>字典<键、值>和列表<T>



Dictionary<TKey,TValue>HashSet<T>List<T>中,哪一种方案的性能最优?

添加值(不重复)

查找

删除值。

我必须避免向集合中添加重复的值,我知道HashSet很好,因为如果检测到重复,它会跳过添加,另一方面,如果发现重复,字典会抛出异常。在添加值之前,List将需要对现有项进行额外的ifExists检查。但是在没有重复的HashSet<T>中添加值对于10K条记录似乎需要大约1分钟。有没有办法优化这个

Ok…从理论上讲,您所讨论的所有数据结构(HashSet、Dictionary和List)在添加项时都具有渐近的O(1)时间复杂度。哈希数据结构也有0(1)用于删除。对于列表,这很大程度上取决于你在哪里执行删除操作:如果你在一个随机的"i"位置删除,那么你有O(N)复杂性,因为从i+1到列表末尾的所有项目都必须向左移动一个位置。如果你总是删除最后一个元素,那么它的复杂度是0(1)。

但最重要的是,基于哈希的数据结构有一个很大的好处:查找复杂度为0(1)。但这只是理论上的。在实践中,如果您为您的类型定义了一个非常糟糕的哈希码,那么您可能会退回到0 (N)复杂度。一个简单的例子是重写gethashcode函数并返回一个常量int。我怀疑你糟糕的性能来自一个糟糕的GetHashCode设计。

另一件要记住的事情:字典和HashSet是在不同场景下使用的数据结构。您可以将Dictionary视为一种数组,其索引可以是任何类型,而HashSet是一种特殊的列表,不允许重复

这完美地回答了Dictionary, List和HashSet w.r.t的性能统计:添加、查找和删除

http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/

当涉及到性能和存储唯一值时,根据我的需求,我更喜欢哈希集或字典。当你不需要输入一个键值对,但又不想在你的集合中有重复的时候,可以使用hashSet。因此,hashset是一个集合,用于存储没有键值对的惟一值。当我有一对键和值时,我更喜欢字典来存储唯一的值。

最新更新