性能:SortedDictionary vs SortedSet
Posted
技术标签:
【中文标题】性能:SortedDictionary vs SortedSet【英文标题】:Performance: SortedDictionary vs SortedSet 【发布时间】:2014-02-25 17:43:04 【问题描述】:我应该维护
1.) 一个 SortedDictionary(double,struct) 2.) 还是只是一个普通的 Dictionary(double,struct) 加上一个 SortedSet(double)?
我只想快速插入。我不关心检索,因为我不会做太多查找。我需要排序的性质,因为我所做的唯一查找将是最大双精度数或几个最大双精度数。
我觉得时间表现很明智 -
两者都是一样的,SortedSet<double>
只是做了额外的工作。你们能确认一下吗?
我不知道的部分是是否保持排序,SortedDictionary
仅围绕键(双精度)移动,或者同时移动键和值。在后一种情况下,2.) 将优于 1.),不是吗?
此外,尚不清楚SortedDictionary
是如何在内部实现的。 Sortedset
是经过验证的红黑树。
【问题讨论】:
您是否做过任何基准测试,看看哪个表现更好? 这听起来像是一个微优化。从逻辑上讲,插入已排序的数据结构与未排序的数据结构相比需要更长的时间。我相信插入 sorteddictionary 和 sortedset 之间的性能应该是相同的,因为它们都使用相同类型的键进行排序。那么,问题是你想要 1 个结构还是 2 个结构? 鉴于您只需要max
值,为什么需要跟踪所有项目?
我不确定在运行时需要多少这些最大值。在最坏的情况下,我必须从最大值@brcpar 开始获取所有值,即结构我使用的有点重~100字节,所以你的意思是当树节点将被移动并在排序字典中重新平衡时,它只是将被移动的双值节点?然后它们有指向结构的指针?是这样吗?还是整个 (double, struct) 对被移动以进行重新平衡?如果是前者,1.) 是要走的路。我觉得维护一个 sortedset(double) 会不那么“重”。
【参考方案1】:
SortedDictionary<K, V>
是要走的路。不仅因为它是适合您使用的正确结构,而且即使在性能和维护方面它也会更好。
我只想快速插入
在第二种情况下,您必须同时插入Dictionary<K, V>
和SortedSet<K>
。这是两个插入(一个 O(1) 和另一个 O(log n))。我希望它比单次插入 SortedDictionary<K, V>
(O(log n)) 慢。
SortedDictionary<K, V>
在内部实现为SortedSet<KeyValuePair<K, V>>
,并在KeyValuePair<K, V>
的Key
部分进行比较。所以如果你对SortedSet<T>
的表现感到满意,那就不要回头了。
sorteddictionary 仅围绕键(双精度)或键和值移动
这显然是微优化。这只是移动几个额外字节的问题,这并不重要。
不清楚 sorteddictionary 是如何在内部实现的。 Sortedset 是经过验证的红黑树。
SortedDictionary<K, V>
在内部实现为SortedSet<KeyValuePair<K, V>>
,并在KeyValuePair<K, V>
的Key
部分进行比较。 It is a red-black tree。所以这也是被证明的表演者......
另请注意,SortedDictionary<K, V>
会占用内存更少,并且会导致更快的删除和枚举。 Dictionary<K, V>
/SortedSet<K>
混合方法将为您提供更快的查找速度,但它必须在枚举期间为字典中的每个键查找相应的值部分。这会更慢。
警告:我在写上述内容时没有阅读您的 cmets !!
我使用的结构有点重~100 字节
如果您可以将其更改为类,请执行此操作。 如果您的应用程序对性能至关重要,移动大约 100 字节不会很好。
我做了一个又快又脏的Dictionary<K, V>
/SortedSet<K>
混合结构并测试了它。
确实,对于 100 字节的结构,它在插入时更快(快两倍多)。当然会有惩罚(谁会创建一个 100 字节的结构?)。
当我将其更改为 class 时,它们都提供了相同的插入性能。
当我缩小结构的大小时,即使这样插入性能也是相当的。
所以我的建议是切换到一个类并使用SortedDictionary<K, V>
。如果你被结构卡住了,那么Dictionary<K, V>
/SortedSet<K>
会更好。好 q 和 +1。
【讨论】:
只是挑剔。在 big-O 表示法中,O(1) + O(log N) 未定义为大于或小于 O(log N)。如果这是给你的唯一信息,你只能说它是模棱两可的。以上是关于性能:SortedDictionary vs SortedSet的主要内容,如果未能解决你的问题,请参考以下文章
《C#零基础入门之百识百例》(八十九)SortedList和SortedDictionary介绍 --对比解析
Java 中的 .NET SortedDictionary 等价物是啥?
.Net 数据结构:ArrayList、List、HashTable、Dictionary、SortedList、SortedDictionary——速度、内存以及何时使用它们? [关闭]