我听说.NET System.Collections.Immutable
集合是作为平衡二叉树实现的,以满足它们的不变性约束,甚至是传统上对Dictionary
这样的散列表进行建模的集合,通过使用积分值GetHashCode
作为排序密钥。
如果我有一个生成哈希码便宜的类型,并且比较便宜(例如string
或int
),我也不在乎我的集合的排序,是否有意义更喜欢ImmutableSortedDictionary
,因为底层数据结构仍然是排序的?
答案 0 :(得分:5)
答案是是,在某些情况下更喜欢ImmutableSortedDictionary
,例如使用Int32
密钥。
就我而言,使用Int32
键我发现ImmutableSortedDictionary
是更好的选择。
我使用了100万件物品运行了一个小基准:
ImmutableDictionary< int,object>
Insert: 2499 ms
Update: 7275 ms
Scan: 385 ms
Read: 881 ms
Delete: 5037 ms
ImmutableSortedDictionary< int,object>
Insert: 1808 ms
Update: 4928 ms
Scan: 246 ms
Read: 732 ms
Delete: 3522 ms
在所有操作中, ImmutableSortedDictionary
比ImmutableDictionary
快一点。请注意,插入按键的升序一次一个项完成(因为它恰好符合我的特定用例)。
但是,您还应该考虑使用带有锁定功能的可变集合。写入可变Dictionary<int, object>
的速度要快一个数量级。
答案 1 :(得分:1)
基于哈希的集合在.NET上应该明显更快,因为:
它可以使用专用于int
密钥的更有效的搜索树,例如哈希特里树或帕特里夏树。
它的内部循环几乎完全int
比较,而不是通用的比较。
但是,如果您需要更好的性能,那么切换到像HashSet
这样的可变集合通常会好得多。
答案 2 :(得分:-1)
这应该不重要。来自this blog post的时间复杂性表明,Dictionary.Add
比SortedDictionary.Add
O(1)
与O(log n)
ImmutableDictionary
ImmutableSortedDictionary
和O(log n)
{ {1}}的时间复杂度为{{1}}
答案 3 :(得分:-2)
在我看来,对这类问题的正确回答通常是&#34;谁在乎&#34;?
除非你有一些非常具体的,非常不寻常的情况,否则对这个问题的迷恋可能是浪费时间,因为你在处理时间方面担心十亿分之一秒,而且记忆的差异可以忽略不计。