繁体   English   中英

Dijkstra的算法具有优先级队列

[英]Dijkstra's algorithm with priority queue

在我对Dijkstra算法的实现中,我有1个包含所有节点的数组和1个包含所有节点的优先级队列。 每当一个节点出列时,我用新的距离和它来自哪里更新所有相邻节点,所以我可以回溯路径。

优先级队列中的节点将使用新距离进行更新,并且阵列中的节点将更新来自新距离的位置。 当节点出列时,阵列中的最终距离会更新:

  PathInfo current = pq.remove();
  path[current.pos].distance = current.distance;

是否可以使用有关前一节点的信息和带距离的优先级队列更新数组?

只要找到更好的距离,就会发生这种情况

      PathInfo key(i, newDistance);
      path[i].distance = newDistance;
      path[i].previous = current.pos;
      pq.decreaseKey(key);

使用基本相同的信息更新我的阵列和优先级队列似乎有点多余。

我目前正在使用常规数组作为PQ中的数据结构。 更新优先级以线性时间完成,并且出队也在线性时间内完成。

我应该在优先级队列中使用什么数据结构?如何更改节点优先级?

我正在使用C ++

这里有两种距离:您的优先级队列具有“暂定距离”,可以更新,而您的阵列具有“最终距离”,而不是(因为Dijkstra的算法不需要更新已从中移除的节点)优先队列)。

您似乎不必要地更新阵列中的距离。 也许最好更改数组节点中的字段名称来记录它:从arrayNode.distancearrayNode.finalDistance

换句话说:看起来您正在使用数组节点输出Dijkstra算法的结果 - 因此您只应在每个数组节点中从优先级队列中删除一次距离。


如果优先级队列实现不提供查询与给定键关联的当前距离的能力,请检查其decreaseKey()操作的行为。 如果decreaseKey()操作拒绝新优先级实际上没有减少的更新,那么您不需要自己执行该检查 - 您只需为当前节点的每个邻居调用它。

但是,如果decreaseKey()函数没有正确处理该情况,并且没有可以让您手动执行该检查的辅助查询函数,并且没有机会修复任何一个缺陷,那么您将需要维护冗余信息为了这个目的....

您可以使用的数据结构:

也许其他一些在阵列中找到最小的。

当您更新节点的优先级时,您还必须同步您预先设置的数据结构。

注意:如果你使用矩阵来检查连接的节点,你可能根本就不使用数据结构,因为它不会改变算法的复杂性我仍然是O(N ^ 2)(使用直接循环找到具有适当优先级的节点)数据结构有效时你图有很多节点和少量连接,并存储为连接节点列表(放电图)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM