【问题标题】:Dynamic queue for implementing Breadth-First algorithm efficiently高效实现广度优先算法的动态队列
【发布时间】:2011-01-06 18:34:50
【问题描述】:

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

我已经弄清楚了算法,但您可能很清楚,该算法需要一个队列 ADS 来跟踪所有需要搜索的边(以正确的顺序)。

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

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

非常感谢任何提示/指针!

【问题讨论】:

  • 我要问的第一件事是你真的有问题吗 - 它让你等待吗?第二个是如果它让你等待你是否抽样看看它花费最多的时间在做什么。 FIFO 可能是一个问题,但先验可能不是。正如一个大概的猜测,您应该能够每微秒处理 1 个节点,所以我认为速度不会成为问题。
  • 我宁愿使用某种专门的队列,因为它比一直对队列进行排序要好。虽然这不是必须的,但我只是想了解更多关于队列以及如何完成它们的信息。
  • 我想我不明白你为什么需要排序,但无论如何,@Kim 的回答看起来不错。

标签: java performance queue breadth-first-search


【解决方案1】:

我认为你的问题与这个话题密切相关:Breadth-First search in Java

除非您有充分的理由,否则不要使用 ArrayList。确实。 Java 已经提供了一组很棒的队列实现——请参阅Queue 接口了解详细信息。

在您的情况下,选择 LinkedList 作为您的队列实现可能就足够了。另请参阅http://www.codeproject.com/KB/java/BFSDFS.aspx,了解使用 LinkedList 作为队列的广度优先搜索实现的简单示例。

【讨论】:

  • 啊哈,我知道你可以像这样使用 LinkedList。嗯,这不是太棘手。我相信有些人会研究队列效率技术!
  • 如果您需要对元素进行排序,您可能还需要查看 PriorityQueue。 @Keith 建议使用 Set 进行快速图形着色。我认为广度优先示例代码也使用了一个集合来达到这个效果。
【解决方案2】:

请记住,您将需要一个快速测试来查看您的对象是否已经在队列中。 ArrayListQueue 都不提供此功能(他们的 contains 检查是 O(n))。如果您可以通过添加一个额外的字段来修改您正在处理的对象,那么这很容易。如果没有,您需要保持某种快速的Set(可能是HashSet)来跟踪队列中的对象。

【讨论】:

  • 我知道这真的很有趣。我可以轻松地引入之前遍历过的对象的 HashSet,并确保它们没有被添加到队列中(它们的边缘)。
  • 这将通过HashSet``contains() 方法?这是因为它使用hashCode() 查找而更快吗?
  • 是的,HashSet.contains 很快。如果您想了解为什么它们很快,请阅读哈希表。这不仅仅是使用 hashcode()。
  • 没关系,我以前用过很多字典类型。只是检查它并没有更快,因为它的边缘更少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多