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

图中两个节点之间的最短路径(Java),java,path,graph-theory,Java,Path,Graph Theory,我有一个程序,它的节点代表一些进程,进程计算时间是节点的成本。这个图作为节点列表保存在内存中,每个节点都有一个父节点和子节点的列表,以及它的执行时间 我必须找到执行时间最短的路径 每个节点都可以与任何其他节点连接 只有一个开始节点和一个结束节点 一个节点可以有各种“父节点”和“子节点” 有人能告诉我这样做的最佳方法吗?您可以使用。一种方法是使用各种最短路径算法,例如。要使其工作,您需要编写一个“heap”,这是一种数据结构,其中权重最小的节点位于顶部 该算法的思想是跟踪当前路线从起点到当前节

我有一个程序,它的节点代表一些进程,进程计算时间是节点的成本。这个图作为节点列表保存在内存中,每个节点都有一个父节点和子节点的列表,以及它的执行时间

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

  • 每个节点都可以与任何其他节点连接
  • 只有一个开始节点和一个结束节点
  • 一个节点可以有各种“父节点”和“子节点”

有人能告诉我这样做的最佳方法吗?

您可以使用。

一种方法是使用各种最短路径算法,例如。要使其工作,您需要编写一个“heap”,这是一种数据结构,其中权重最小的节点位于顶部


该算法的思想是跟踪当前路线从起点到当前节点的总距离。通常的贪婪算法是只选择路径最短的相邻节点。Dijkstra对此进行了扩展,选择了从起始节点到该节点的总距离最短的节点

JGraph有一个实现。

已经提到过,还有一个在特定条件下性能更好的,可以从中学习很多东西。还有一本关于图算法的好书,其中有很多由Robert Sedgewick编写的Java代码示例,几年前我发现这本书很有用。标题是“Java中的算法,第5部分:图形算法”。

一些关于Java中Dijkstra算法的特别说明:

以及有关性能的说明:

Dijkstra算法的复杂度在很大程度上取决于优先级队列Q的复杂度。如果该队列在我第一次引入时实现得很简单(即,在每次迭代时对其重新排序以找到mininum节点),则该算法在O(n2)中执行,其中n是图中的节点数

在实际优先级队列始终保持有序的情况下,当我们实现它时,复杂性平均为O(nlogm)。对数函数源于collections PriorityQueue类,这是一个在log(m)中执行的堆实现。 在实际优先级队列始终保持有序的情况下,当我们实现它时,复杂性平均为O(nlogm)