我有一个带有图形的程序,其节点代表一些进程,并且进程计算时间是节点的成本。该图形作为节点列表在内存中维护,每个节点都有一个父节点和子节点列表,并且执行时间。
我必须找到执行时间最短的路径。
有人可以告诉我最好的方法吗?
答案 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)。