从Dictionary中获取任何元素的最快方法

时间:2014-06-21 13:30:56

标签: c# performance dictionary collections

我在C#中实现A *(不是用于寻路),我需要使用Dictionary来保存开放节点,因为我需要快速插入和快速查找。我想从Dictionary中获得第一个开放节点(它可以是任何随机节点)。使用Dictionary.First()非常慢。如果我使用迭代器,则MoveNext()仍然占用程序整个CPU时间的15%。从Dictionary中获取任何随机元素的最快方法是什么?

3 个答案:

答案 0 :(得分:5)

我建议您为此目的使用专门的数据结构,因为没有为此制作常规字典。

在Java中,我可能会推荐LinkedHashMap,其中有自定义的C#等价物(不是内置的)(see)。

然而,以合理的方式自己实现这一点相当容易。例如,您可以使用带有元组的常规字典,这些元组指向下一个元素以及实际数据。或者你可以保留一个二级堆栈,它只是按添加顺序存储所有密钥。只是一些想法。我自己从来没有实施或描述过,但我确信你会找到一个好方法。

哦,如果你还没有,你可能还想查看哈希码分配,以确保那里没有问题。

答案 1 :(得分:2)

查找字典中的第一个(或索引)元素实际上是O(n),因为它必须迭代每个桶,直到找到非空的元素,因此MoveNext实际上是最快的方式

如果这是一个问题,我会考虑使用类似堆栈的东西,其中pop是一个O(1)操作。

答案 2 :(得分:0)

尝试

Enumerable.ToList(dictionary.Values)[new Random().next(dictionary.Count)].

应该有相当不错的性能,但如果你的字典庞大,请注意内存使用情况。显然,每次都要注意不要创建随机对象,如果Enumerable.ToList的成员变化不太频繁,你可以缓存{{1}}的返回值。