【问题标题】:Dijkstra Algorithm in JavaJava中的Dijkstra算法
【发布时间】:2015-03-28 09:34:44
【问题描述】:

我在 Java 中实现 Dijkstra 算法时遇到了一些麻烦。
我使用这个(第一个)伪代码:http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
第 15 行,您需要获取距离最短的顶点。 但是我怎样才能用相应的距离保存距离。
注意: 顶点定义为整数。

我无法正常工作的解决方案:

  1. K = 顶点,V = 距离的地图,问题:长时间搜索以获得最小距离
  2. K = 距离,V = 顶点的 SortedMap,问题:几乎每个距离都定义为 Integer.MAX_VALUE

所以我正在寻找一种将顶点保存到远处的快速方法,并且使用 min dist 获取顶点应该很容易。

【问题讨论】:

  • 我认为您找不到比 Map for you 解决方案更快的东西
  • 或者你可以使用一些已经实现的java图形结构
  • 那么最好的解决方案其实是K=distance和V=List Integer(=vertex)的SortedMap?
  • Fangio SortedMap 听起来不错,但唯一的问题是它不会自动更新宽松的成本。只有在插入时,它才会将顶点按正确的成本顺序排列,但随着成本的放宽,检索可能会出现一些问题,因为检索到的节点可能不是成本最低的节点。所以应该实现自己的最小堆。我提到的 SortedMap 问题也在 java.util.PriorityQueue 中。

标签: java algorithm data-structures dijkstra


【解决方案1】:

尝试使用 PriorityQueue。这样,您可以简单地移除头部,因为它具有所有顶点的最小距离。

在此处查看有关 PriorityQueue 的更多信息: http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

【讨论】:

  • 优先队列对于 Dijkstra 算法来说是一个糟糕的选择,因为您通常需要在每次松弛后修改顶点的成本。这意味着您将需要在优先级队列中找到一个任意节点(不是头部),并且在优先级队列中无法有效地完成。它可以通过不修改每个节点的成本来解决,而是多次插入它——但这需要更多的工作并将算法的内存签名增加到O(|E|)(虽然通常是O(|V|)
  • @amit 我有同样的想法,直到我在这里读到www3.cs.stonybrook.edu/~rezaul/papers/TR-07-54.pdf,对于大多数图表来说,实际插入和删除元素可能比 keyDecrease 更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2014-06-23
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多