我在C#中实现A *(不用于寻路),我需要Dictionary来保存开放节点,因为我需要快速插入和快速查找。我想从字典中获得第一个开放节点(它可以是任何随机节点)。使用Dictionary.First()非常缓慢。如果我使用迭代器,MoveNext()仍然占用我程序整个CPU时间的15%。什么是从字典中获取任何随机元素的最快方法?从字典中获取任何元素的最快方法
2
A
回答
0
尝试
Enumerable.ToList(dictionary.Values)[new Random().next(dictionary.Count)].
应该有相当不错的表现,但注意内存的使用情况,如果你的字典是巨大的。显然,请不要每次创建随机对象,并且如果其成员不会频繁更改,则可能会缓存返回值Enumerable.ToList
。
2
查找字典中的第一个(或索引)元素实际上是O(n),因为它必须迭代每个存储桶直到找到一个非空的元素,因此MoveNext
实际上是最快的方法。
如果这是一个问题,我会考虑使用类似堆栈的东西,其中pop
是O(1)操作。
+0
我认为“DictionaryStack”对于这种情况来说是完美的。 – mafu
5
为了达到这个目的,我建议你使用专门的数据结构,因为没有为此设置常规字典。
在Java中,我可能会推荐LinkedHashMap,它有自定义的C#等价物(不是内置的悲哀)(see)。
然而,以合理的方式自己实现这一点相当容易。例如,你可以使用带有元组的指向下一个元素的常规字典以及实际数据。或者您可以保留一个辅助堆栈,只需按照添加顺序存储所有密钥。只是一些想法。我从来没有实现过,也没有亲自分析过,但我相信你会找到一个好方法。
哦,如果你还没有,你可能还想检查哈希码分布,以确保没有问题。
相关问题
- 1. 获取字典中最长的元素
- 2. 从动态词典中包含的元素获取属性的更快方法?
- 3. 从MDB读取字典到C#中的最快方法
- 4. 获取Haskell列表最后一个元素的最快方法
- 5. Jsoup从字符串中获取元素的最佳方法
- 6. 在视口中获取元素的最快方法
- 7. C#4.0中字典元素的获取方法
- 8. 获取数字的最快方法?
- 9. 获取集合元素的最快方法是什么?
- 10. 从java中的字符串中获取元素的快速方法
- 11. 获取Tensorflow中的字典元素
- 12. 从字典中获取单个密钥的最佳方法?
- 13. Python:从字典中获取值列表的最简单方法?
- 14. 如何从字典中获取任意值的元组?
- 15. C#在字典中搜索字典的最快方法
- 16. 从最小y值的元组中获取最大x值的最快方法?
- 17. 任何方式从Sitecore 7.2中的JavaScript获取字典项目?
- 18. 获取字典中的最后一个元素?
- 19. 从HTML获取OpenGraph元标记的最快方法?
- 20. 从字典中删除大量密钥的最快方法
- 21. 获取元素从列表中词典
- 22. 创建HTML元素的最快方法?
- 23. 在列表中获取少于特定元素的最小元素的最快方法
- 24. Python字典获取价值最快的方式
- 25. 找到给定数字中唯一元素的最快方法
- 26. 获取元素的组合在字典
- 27. 什么是从IE中删除DOM元素的最快方法?
- 28. 以任意顺序从字典/ OrdredDict中提取元素
- 29. 在Python或C++中获取像素颜色的最快方法?
- 30. 从R中n对中提取k个独特元素的最快方法
你真的需要一本字典或一套吗? –
一套也可以工作。 – Yekoor
+1分析! – Gabe