在Dictionary<TKey,TValue>
,HashSet<T>
和List<T>
之间选择的最佳性能优化替代方案是什么?
添加值(不重复)
查找
删除值。
我必须避免向集合中添加重复值我知道HashSet是好的,因为如果检测到重复,它会跳过添加,另一方面,如果找到重复,则字典会抛出异常。在添加值之前,列表将需要额外的ifExists检查现有项目。但是,对于10K记录,在HashSet<T>
中添加没有重复的值似乎需要大约1分钟。有没有办法优化这个。
答案 0 :(得分:4)
好的......就理论而言,您所谈论的所有数据结构(HashSet,Dictionary和List)都有渐进的O(1)时间复杂度来添加项目。哈希数据结构也有O(1)用于删除。对于列表,取决于你在哪里执行删除操作:如果你随机删除&#34; i&#34;因此,由于i + 1到列表末尾的所有项目必须向左移动一个位置,因此您的O(N)复杂度很高。如果总是删除最后一个元素,那么它就是O(1)复杂度。
但最重要的是,基于散列的数据结构有一个很大的好处:O(1)查找复杂性。但这只是在理论上。实际上,如果为类型定义了非常糟糕的哈希码,则可能会回退到O(N)复杂度。一个简单的例子是覆盖gethashcode函数并返回一个常量int。我怀疑你的糟糕表现来自糟糕的GetHashCode设计。
要记住的另一件事:字典和HashSet是用于不同风格的数据结构。您可以将Dictionary视为一种数组,因为索引可以是任何类型,而HashSet是一个不允许重复的特殊列表
答案 1 :(得分:3)
这完美地回答了Dictionary,List和HashSet w.r.t的性能统计: 添加,查找和删除
http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/
答案 2 :(得分:1)
在性能和存储唯一值时,我更喜欢Hash集或字典,具体取决于我的要求。 如果您没有要输入的键值对,则使用hashSet,但您仍然不希望在集合中存在重复项。因此,hashset是一个集合,用于存储与键值对无关的唯一值。 当我有一对键和值时,我更喜欢字典来存储唯一值。