【问题标题】:Why does Dijkstra's algorithm need to use the deleteMin() and decreaseKey()?为什么 Dijkstra 的算法需要用到 deleteMin() 和 reductionKey()?
【发布时间】:2012-06-23 15:30:23
【问题描述】:

在大多数伪代码中,我通常会发现以下内容:

  • DeleteMin(返回键最小的元素并从集合中删除。)

  • DecreaseKey(适应特定元素键值的减少)

  • 为什么使用 DeleteMin 检索最小元素 - 为什么不是随机元素?
  • DecreaseKey 的用途是什么?在伪代码中,它总是在元素的值更改后调用。它在做什么?

【问题讨论】:

  • 你说的是heap,而不是Dijkstra的算法?
  • 如果你随机取下一个节点(不是最小距离),算法不正确。
  • @PetarMinchev 为什么会不正确?重新调整键值的顺序有什么关系?
  • @PetarMinchev:我不同意这是一个骗局。另一个问题特别问:为什么我们不重新添加 v,而这个问题问 - 为什么首先要修改?它还询问了 deleteMin() 步骤,该步骤发生在修改之前。

标签: algorithm language-agnostic computer-science dijkstra


【解决方案1】:

为什么使用 DeleteMin 来检索最小元素 - 为什么不呢 随机的?

我们从Q 的集合中检索并删除最小元素 开放顶点,因为它确保最小化(稍后在证明中使用)。 没有它 - 无法保证最小化功能,并且解决方案不会是最佳的(不会是最短路径)。请记住,一旦我们找到了到v 的路径,我们就会将其从Q 中删除,并且永远不会重新打开它,因此我们取出的边必须具有可用路径最小的边。

请注意,对于这个(最小)顶点,让它为v:对于Q 中的每个u d(u) + x <= d(v) - 因为在没有负边时使用dijkstra 算法,x >=0。
对于任何其他顶点 - 这不是最小的 - 我们不能保证没有更短的路径尚未被发现。

DecreaseKey 的目的是什么?在伪代码中它总是被调用 在元素的值改变之后。它在做什么?

使用减少是因为我们可能找到了一条新的、更好的通往连接到我们找到的最后一个顶点的顶点的路径。 这一步是 dijkstra 算法正在做的松弛步骤。 请记住,dijkstra 算法始终保持到目前为止找到的到每个顶点的最短路径,因为最后一步可能已经找到了到某个顶点的新最短路径 -这一步是更新目前找到的最短路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2019-05-01
    • 2020-08-02
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多