【问题标题】:Should I use a Binary Heap?我应该使用二进制堆吗?
【发布时间】:2013-08-29 00:38:07
【问题描述】:

后续问题来自:https://codereview.stackexchange.com/questions/30243/how-can-i-improve-upon-my-a-pathfinding-code/

总结: 我请求帮助改进我的寻路代码 (A*)。一位用户很快发现我正在对特定的节点列表进行很多排序,并且使用 IComparible 来执行此操作 - 显然效率非常低。他建议使用 OrderedBag,但是,我必须自己编写所有代码,不能使用来自互联网的代码。

问题:那么,使二进制堆成为维护有序数据的最有效方式,同时仍然能够快速添加和删除数据。如果是这样,是否有人有任何链接可以为我指明创建一个的正确方向,以及创建哪个?

我听说过 LinkedList - 好主意?

【问题讨论】:

  • ???他建议你使用I've tried a few ordered list implementations, but the OrderedBag<T> class from Wintellect's PowerCollections is my favorite.,所以PowerCollectionsI have to code everything myself 是什么意思?
  • 这可能很有趣:blog.matejzavrsnik.com/2013/03/…
  • @xanatos PowerCollections 是现成的代码,我不费吹灰之力 - 对吧?
  • @ShivamMalhotra 这是一个开源库。
  • @xanatos 仍然不是我的代码?

标签: c# linked-list nodes binary-heap


【解决方案1】:

如果您将自己滚动作为练习,那么是的,堆是构建高效优先级队列的正确数据结构。从二进制堆开始,因为它相当容易。如果您有时间和意愿,您可以随时尝试更复杂的堆。

建议场外资源的问题是题外话。简单算法和数据结构的标准打印源是Introduction to Algorithms。但是现在维基百科也是伪代码的好来源。 (注意Wikipedia article shows how to build a max heap;你需要一个最小堆。在给定最大堆代码的情况下弄清楚如何构建一个最小堆是一个很好的练习。)

This article also gives some good advice on use of binary heapsA*

【讨论】:

    【解决方案2】:

    LinkedList 是个坏主意,尤其是在排序方面。如果您不想使用 OrderedBag,请尝试使用 SortedDictionary

    【讨论】:

    • 谢谢,但 SortedDictionary 也有同样的问题。它已经制作好了。这是我自己可以做的吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多