Java 有效实现广度优先算法的动态队列
我正在构建一个广度优先的图形搜索算法,用于搜索伦敦地铁 我已经计算出了算法,但正如您所知,该算法需要一个队列来跟踪所有需要搜索的边(以正确的顺序) 我一直在阅读有关管理队列和大量或非常大量排队项目(边缘)的效率问题的文章 有谁能告诉我如何实现一个基于Java ArrayList的队列,它可以跟踪前端和后端,并在内存增长时有效地管理内存Java 有效实现广度优先算法的动态队列,java,performance,queue,breadth-first-search,Java,Performance,Queue,Breadth First Search,我正在构建一个广度优先的图形搜索算法,用于搜索伦敦地铁 我已经计算出了算法,但正如您所知,该算法需要一个队列来跟踪所有需要搜索的边(以正确的顺序) 我一直在阅读有关管理队列和大量或非常大量排队项目(边缘)的效率问题的文章 有谁能告诉我如何实现一个基于Java ArrayList的队列,它可以跟踪前端和后端,并在内存增长时有效地管理内存 非常感谢您的任何提示/建议 我认为你的问题与这个话题密切相关: 除非有很好的理由,否则不要使用ArrayList。Java已经提供了大量的队列实现——有关详细信息
非常感谢您的任何提示/建议 我认为你的问题与这个话题密切相关: 除非有很好的理由,否则不要使用ArrayList。Java已经提供了大量的队列实现——有关详细信息,请参见接口
在您的情况下,选择作为队列实现可能就足够了。有关使用LinkedList作为队列的广度优先搜索实现的简单示例,请参见。请记住,您需要进行快速测试,以查看对象是否已在队列中。
ArrayList
和Queue
都不提供此功能(它们的包含的检查是O(n)
)。如果您可以通过添加一个额外的字段来修改正在处理的对象,那么就很容易了。如果没有,您将需要维护某种快速的集(可能是哈希集
),以跟踪队列中的对象。我要问的第一件事是,您是否真的有问题?这会让您等待吗?第二个问题是,如果它让你等待,那么你可以取样看看它花了多少时间在做什么。先进先出可能是个问题,但这是一个先验的问题,可能不是。正如一个大概的猜测,您应该能够每微秒处理1个节点,因此我认为速度不会是一个问题。我宁愿使用某种专门的队列,因为这样比一直对队列进行排序更好。虽然没有必要这样做,但我只是想了解更多关于队列的信息以及如何进行排序。我想我不明白为什么需要排序,但无论如何,@Kim的答案看起来不错。啊哈,我知道你可以像那样使用LinkedList。嗯,这不太棘手。我相信有些人会研究队列效率技术!如果需要对元素进行排序,可能还需要签出PriorityQueue。以及@Keith关于使用集合进行快速图着色的建议。我认为广度优先的示例代码也使用了一个集合来达到这个效果。我觉得这非常有趣。我可以很容易地引入以前遍历过的对象的哈希集,并确保它们没有添加到队列(它们的边)。这将通过HashSet``contains()
方法实现?这是因为它使用了hashCode()
lookup而更快吗?是的,HashSet.contains很快。如果你想了解哈希表为何如此之快,请仔细阅读。这不仅仅是使用hashcode()。没关系,我以前使用过很多字典类型。只是检查它并没有更快,因为它的边缘更少。