图中两个节点之间的最短路径(Java)

时间:2009-08-04 09:15:32

标签: java path graph-theory

我有一个带有图形的程序,其节点代表一些进程,并且进程计算时间是节点的成本。该图形作为节点列表在内存中维护,每个节点都有一个父节点和子节点列表,并且执行时间。

我必须找到执行时间最短的路径。

  • 每个节点都可以与任何其他节点连接。
  • 只有一个起始节点和一个终端节点。
  • 一个节点可以有各种“父”和“子”

有人可以告诉我最好的方法吗?

5 个答案:

答案 0 :(得分:10)

您可以使用Dijkstra's Algorithm

答案 1 :(得分:5)

Dijkstra已经被提及,还有A* algorithm在某些条件下可以更好地表现,并且可以从中学到很多东西。还有一本关于图算法的好书,其中包含Robert Sedgewick的大量Java代码示例,我在几年前发现它很有用。标题是“Java中的算法,第5部分:图算法”

答案 2 :(得分:4)

一种方法是使用各种最短路径算法,例如Dijkstra's algorithm。为此,您需要编写一个“堆”代码,这是一个数据结构,其中权重年龄最小的节点位于顶部。

算法背后的想法是跟踪当前路线从开始到当前节点的总距离。通常的贪婪算法是您只选择具有最短路径的相邻节点的算法。 Dijkstra通过选择节点来扩展这一点,该节点将提供从起始节点到该节点的最短总距离。

答案 3 :(得分:2)

JGraph有Dijkstra algorithm的实现。

答案 4 :(得分:1)

特别注意Java中的Dijkstra算法:

http://renaud.waldura.com/doc/java/dijkstra/

关于表现的说明:

  

Dijkstra算法的复杂性在很大程度上取决于优先级队列Q的复杂性。如果这个队列在我第一次引入它时天真地实现(即在每次迭代时重新排序以找到最小节点),算法执行在O(n2)中,其中n是图中节点的数量。

     

随着真正的优先级队列始终保持有序,正如我们实现的那样,复杂性平均为O(n log m)。对数函数源于集合PriorityQueue类,这是一个以log(m)执行的堆实现。   随着真正的优先级队列始终保持有序,在我们实现它时,复杂性平均为O(n log m)。