[英]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.distance
到arrayNode.finalDistance
。
换句话说:看起来您正在使用数组节点输出Dijkstra算法的结果 - 因此您只应在每个数组节点中从优先级队列中删除一次距离。
如果优先级队列实现不提供查询与给定键关联的当前距离的能力,请检查其decreaseKey()
操作的行为。 如果decreaseKey()
操作拒绝新优先级实际上没有减少的更新,那么您不需要自己执行该检查 - 您只需为当前节点的每个邻居调用它。
但是,如果decreaseKey()
函数没有正确处理该情况,并且没有可以让您手动执行该检查的辅助查询函数,并且没有机会修复任何一个缺陷,那么您将需要维护冗余信息为了这个目的....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.