我正在构建一个广度优先图搜索算法,用于搜索伦敦地铁。有效实现广度优先算法的动态队列
我有算法想通了,但你可能知道,算法需要为了一个队列广告来追踪所有需要搜索(以正确的顺序)的边缘。
我一直在阅读有关管理队列和大量或非常大量排队项目(边缘)的效率问题。
谁能告诉我如何实现基于围绕Java的ArrayList队列,可以跟踪头部和尾部,并且有效地管理内存,同时它的增长?
任何提示/指针非常感谢!
我正在构建一个广度优先图搜索算法,用于搜索伦敦地铁。有效实现广度优先算法的动态队列
我有算法想通了,但你可能知道,算法需要为了一个队列广告来追踪所有需要搜索(以正确的顺序)的边缘。
我一直在阅读有关管理队列和大量或非常大量排队项目(边缘)的效率问题。
谁能告诉我如何实现基于围绕Java的ArrayList队列,可以跟踪头部和尾部,并且有效地管理内存,同时它的增长?
任何提示/指针非常感谢!
我认为你的问题是密切相关的这个话题:Breadth-First search in Java
,除非你有一个真正好原因不使用ArrayList。 Java已经有很多队列实现 - 请参阅Queue接口了解详细信息。
就你而言,选择LinkedList作为你的队列实现可能就足够了。另请参见http://www.codeproject.com/KB/java/BFSDFS.aspx,其中简单介绍了使用LinkedList作为队列的广度优先搜索实现。
请记住,您将需要快速测试来查看您的对象是否已在队列中。 ArrayList
和Queue
都不提供此功能(其contains
检查是O(n)
)。如果您可以通过添加额外字段来修改正在处理的对象,则很容易。如果没有,你会想保持某种快速Set
(可能是HashSet
)来跟踪哪些对象在队列中。
我会问的第一件事是你真的有问题 - 是否让你等待?第二个是如果它让你等待你抽样,看看它最花时间在做什么。该FIFO可能是一个问题,但先验,可能不是。就像猜测一样,你应该能够每微秒处理1个节点,所以我不认为速度会成为问题。 – 2011-01-06 19:03:32
我宁愿使用某种专门化的队列,因为它比我们的队列一直排序更麻烦。虽然这不是必需的,但我只想更多地了解队列以及如何完成它们。 – Alex 2011-01-06 19:16:08
我想我不明白你为什么需要排序,但无论如何,@ Kim的答案看起来不错。 – 2011-01-06 19:19:06