Dijkstra的算法具有优先级队列

时间:2013-02-19 14:16:04

标签: algorithm priority-queue dijkstra

在我对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 ++

2 个答案:

答案 0 :(得分:1)

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

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

换句话说:您似乎正在使用数组节点输出Dijkstra算法的结果 - 因此,只有在从优先级队列中删除时,才应在每个数组节点中设置一次距离。


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

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

答案 1 :(得分:0)

您可以使用的数据结构:

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

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

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