【问题标题】:Trouble understanding Priority Queue implementation of Dijkstra无法理解 Dijkstra 的优先级队列实现
【发布时间】:2020-04-23 02:57:23
【问题描述】:

我很难理解我们实现 Dijkstra 的逻辑流程到底是什么,更准确地说,我遇到的问题是我们如何实际获取该优先级队列,我们​​是否构建它(优先级Queue ) 当我们在图上执行算法时?还是我看错了?然后就是这样吗?我们是停在那里还是进一步处理这个输出,将获得的信息以其他形式放在优先级队列中,或者这就是我们停止的地方?

我也理解为选定节点生成相应最短路径的过程,通过递归地遵循我们首先形成最短路径的边,但它实际上是如何实现的?

一般来说,我在学习期间实际上能够想出和/或理解算法的合适实现时遇到了很多问题,我对算法的理解很好(在某些情况下,我能够想出一个接近的替代 ) 但我就是想不出聪明的方法来实现它们,有什么建议吗?

【问题讨论】:

  • 嘿,我想这些是许多学习 Dijkstra 的人面临的问题。我建议你先看很多关于优先队列的视频,然后再看很多关于 Dijkstra 最短路径算法的视频。然后,您将能够指出您不了解的内容。回来把你的帖子集中在一个你无法理解的问题上。当前的帖子听起来像是请解释一下优先级队列及其在 Dijkstra 最短路径算法中的用法。

标签: algorithm shortest-path


【解决方案1】:

我最好的建议是先从 bfs 开始。如果你能实现 BFS,你就离 Dijkstra 仅一步之遥。 BFS 使用普通队列(先进先出),Dijkstra 使用优先队列(根据当前到源节点的距离选择元素)。这是唯一的区别。

回答您的具体问题:

  • 我们如何真正获取优先级队列? 你从一个空队列开始。在每次迭代中(Dijkstra 最常见的是迭代实现,而不是递归实现),您从队列中选择具有最高优先级的节点,并将该节点的所有尚未访问的邻居推回队列中
  • 当我们在图上执行算法时,我们是否构建它(优先级队列)?是的,在每次迭代中,你选择一个节点,并将多个节点推入优先级队列李>
  • 然后是这样吗? 是的,差不多就是这样。
  • 次要细节:(1)您需要跟踪哪些节点已被挑选出来(并且永远不要将其推回)(2)可以将一个节点多次推入队列,这很好, (3) 你需要一个trace数组来追溯你到达该节点的路径:每次将一个节点推入队列时,记录该节点的trace为当前访问的节点(刚刚从队列中弹出)

再次,从 BFS 开始,您会发现 Dijkstra 非常简单

【讨论】:

  • 谢谢,这正是我所需要的!我会采纳你和 Shridhar 关于重新审视 BFS 和优先级队列的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多