【发布时间】:2019-10-29 17:49:18
【问题描述】:
我正在尝试使用优先级队列实现 Dijkstra 算法。
据我了解,“Dijkstra 算法”允许找到最短的“路径”,因为它将返回一组构成最短路径的顶点 *。
从这里的https://stackoverflow.com/a/20217659/1663462 和 (Dijkstra's_algorithm#Algorithm) 的答案看来,我应该能够只使用 两个 数据结构来实现它:图形和队列数据结构。
但是,在我使用上述两个数据结构的实现中,当我最终到达目标节点时,我没有存储顶点路径吗?换句话说,我只有最短的distance(单个标量值)。
这意味着如何跟踪?我能想到的唯一方法是使用附加数据结构 - 一个数组或哈希映射,其中key 是顶点,value 是它的父节点。
实际问题:
是否需要额外的数据结构来实现(“形成最短路径的顶点集 *”)?如果不是,我如何确定顶点?
【问题讨论】:
-
在我的脑海中,因为我在遍历 Neo4j 图形时做了同样的事情,是的,你需要额外的映射级别。 IIRC 您根据距离添加节点,因此每个距离都需要一个队列,然后始终从与最短距离关联的队列中删除。听起来你的想法倒退了。第一个键基于长度(距离)。这将是整数到队列的映射。然后在队列中是顶点(节点)。由于它们都具有相同的距离(成本因素),我想不出让它们分类的理由。 LIFO 或 FIFO 有效。
-
只是一个想法(尚未全部阅读)。如果您的顶点是对象,您还可以在每个节点中添加一个前驱(您的节点通过最短路径到达它)。这样,一旦到达目标,您就可以简单地使用此实例变量向后遍历。
-
@jottbe 与直接修改节点相比,将前辈存储在单独的表中可能会更好。除了挑剔你是对的。
-
@Paul:好的,我认为你是对的。我只是假设“节点”只是为 dijkstra 算法创建的。
-
所以这意味着 Wikipedia 文章中的算法不准确?
标签: algorithm graph-theory priority-queue dijkstra