性能: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的主要内容,如果未能解决你的问题,请参考以下文章

记一次SortedDictionary的不当使用

《C#零基础入门之百识百例》(八十九)SortedList和SortedDictionary介绍 --对比解析

Dictionary与SortedDictionary

Android - 布局性能:程序化 vs XML

Java 中的 .NET SortedDictionary 等价物是啥?

.Net 数据结构:ArrayList、List、HashTable、Dictionary、SortedList、SortedDictionary——速度、内存以及何时使用它们? [关闭]