Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有效实现广度优先算法的动态队列_Java_Performance_Queue_Breadth First Search - Fatal编程技术网

Java 有效实现广度优先算法的动态队列

Java 有效实现广度优先算法的动态队列,java,performance,queue,breadth-first-search,Java,Performance,Queue,Breadth First Search,我正在构建一个广度优先的图形搜索算法,用于搜索伦敦地铁 我已经计算出了算法,但正如您所知,该算法需要一个队列来跟踪所有需要搜索的边(以正确的顺序) 我一直在阅读有关管理队列和大量或非常大量排队项目(边缘)的效率问题的文章 有谁能告诉我如何实现一个基于Java ArrayList的队列,它可以跟踪前端和后端,并在内存增长时有效地管理内存 非常感谢您的任何提示/建议 我认为你的问题与这个话题密切相关: 除非有很好的理由,否则不要使用ArrayList。Java已经提供了大量的队列实现——有关详细信息

我正在构建一个广度优先的图形搜索算法,用于搜索伦敦地铁

我已经计算出了算法,但正如您所知,该算法需要一个队列来跟踪所有需要搜索的边(以正确的顺序)

我一直在阅读有关管理队列和大量或非常大量排队项目(边缘)的效率问题的文章

有谁能告诉我如何实现一个基于Java ArrayList的队列,它可以跟踪前端和后端,并在内存增长时有效地管理内存


非常感谢您的任何提示/建议

我认为你的问题与这个话题密切相关:

除非有很好的理由,否则不要使用ArrayList。Java已经提供了大量的队列实现——有关详细信息,请参见接口


在您的情况下,选择作为队列实现可能就足够了。有关使用LinkedList作为队列的广度优先搜索实现的简单示例,请参见。

请记住,您需要进行快速测试,以查看对象是否已在队列中。
ArrayList
Queue
都不提供此功能(它们的
包含的
检查是
O(n)
)。如果您可以通过添加一个额外的字段来修改正在处理的对象,那么就很容易了。如果没有,您将需要维护某种快速的
集(可能是
哈希集
),以跟踪队列中的对象。

我要问的第一件事是,您是否真的有问题?这会让您等待吗?第二个问题是,如果它让你等待,那么你可以取样看看它花了多少时间在做什么。先进先出可能是个问题,但这是一个先验的问题,可能不是。正如一个大概的猜测,您应该能够每微秒处理1个节点,因此我认为速度不会是一个问题。我宁愿使用某种专门的队列,因为这样比一直对队列进行排序更好。虽然没有必要这样做,但我只是想了解更多关于队列的信息以及如何进行排序。我想我不明白为什么需要排序,但无论如何,@Kim的答案看起来不错。啊哈,我知道你可以像那样使用LinkedList。嗯,这不太棘手。我相信有些人会研究队列效率技术!如果需要对元素进行排序,可能还需要签出PriorityQueue。以及@Keith关于使用集合进行快速图着色的建议。我认为广度优先的示例代码也使用了一个集合来达到这个效果。我觉得这非常有趣。我可以很容易地引入以前遍历过的对象的哈希集,并确保它们没有添加到队列(它们的边)。这将通过
HashSet``contains()
方法实现?这是因为它使用了
hashCode()
lookup而更快吗?是的,HashSet.contains很快。如果你想了解哈希表为何如此之快,请仔细阅读。这不仅仅是使用hashcode()。没关系,我以前使用过很多字典类型。只是检查它并没有更快,因为它的边缘更少。