我应该保持
1.)一个SortedDictionary(double,struct)
2.)或只是一个普通的词典(double,struct)加一个SortedSet(double)?
我只想快速插入。我不关心检索,因为我不会做很多查找。我需要排序自然因为,我所做的唯一查找将是最大双倍或几个最大双倍。
我觉得时间表现明智 -
两者都相同,SortedSet<double>
只做额外的工作。你能证实吗?
我不知道的部分是维持排序,SortedDictionary
只移动键(双打),还是键和值。在后一种情况下2.)将胜过1.),不是吗?
此外,还不清楚SortedDictionary
如何在内部实施。 Sortedset
是红黑树,是经过验证的表演者。
答案 0 :(得分:11)
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>>
,并在Key
的{{1}}部分进行了比较。因此,如果您对KeyValuePair<K, V>
的表现感到满意,那就不应该回头了。
sorteddictionary只移动键(双打),或键和值
这显然是微观优化。这只是移动几个额外字节的问题,这几乎无关紧要。
不清楚sorteddictionary是如何在内部实现的。 Sortedset是红黑树,是经过验证的表演者。
SortedSet<T>
在内部实施为SortedDictionary<K, V>
,并在SortedSet<KeyValuePair<K, V>>
的{{1}}部分进行比较。 It is a red-black tree。所以这也是行之有效的......
另请注意,Key
内存会更轻,并且会导致更快的删除和枚举。 KeyValuePair<K, V>
/ SortedDictionary<K, V>
混合方法可以为您提供更快的查找速度,但是在枚举期间,它必须对字典中的每个键进行相应的值部分查找。这会慢一点。
警告:我在编写上述内容时没有阅读您的评论!!
我正在使用的结构有点重〜100字节
如果您可以将其更改为课程,请执行此操作。如果您的应用程序是性能关键的,那么移动大约100个字节将不会很好。
我做了一个快速而肮脏的Dictionary<K, V>
/ SortedSet<K>
混合结构并对其进行了测试。
实际上,当插入时,100字节结构更快(速度超过两倍)。肯定会有一个惩罚(谁会创建一个100字节的结构?)。
当我将其更改为类时,它们都具有相同的插入性能。
当我缩小结构的大小时,即使这样,插入性能也是可比的。
所以我的建议是切换到一个班级并使用Dictionary<K, V>
。如果你坚持使用结构,那么SortedSet<K>
/ SortedDictionary<K, V>
会更好。好q,和+1。