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