Algorithm 迪克斯特拉';带优先级队列的s算法

Algorithm 迪克斯特拉';带优先级队列的s算法,algorithm,priority-queue,dijkstra,Algorithm,Priority Queue,Dijkstra,在Dijkstra算法的实现中,我有一个包含所有节点的数组和一个包含所有节点的优先级队列。每当一个节点退出队列时,我会用新的距离和它的来源更新所有相邻的节点,这样我就可以回溯路径 优先级队列中的节点将使用新的距离进行更新,而阵列中的节点将使用新的距离进行更新。当节点退出队列时,将更新阵列中的最终距离: PathInfo current = pq.remove(); path[current.pos].distance = current.distance; 是否可以同时使用前一个节点的

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

优先级队列中的节点将使用新的距离进行更新,而阵列中的节点将使用新的距离进行更新。当节点退出队列时,将更新阵列中的最终距离:

  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++

数据结构,您可以使用:

也许其他人可以在数组中找到最小值

当您将优先级更新到节点时,还必须同步预传递的数据结构

注意:如果您使用矩阵检查连接的节点,您可以不使用数据结构,因为它不会改变算法复杂度I仍然是O(N^2)(使用直接循环查找具有适当优先级的节点)
数据结构有效当图形具有大量节点和少量连接并存储为已连接节点列表(已释放的图形)时

这里有两种距离:优先级队列具有“暂定距离”,需要更新,而数组具有“最终距离”,不需要更新(因为Dijkstra的算法不需要更新从优先级队列中删除的节点)

您似乎正在不必要地更新数组中的距离。也许更改数组节点中的字段名以记录以下内容也是一个好主意:从
arrayNode.distance
arrayNode.FinalInstance

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


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


但是,如果
减少键()
函数不能正确处理这种情况,并且没有辅助查询函数可以让您手动执行该检查,并且没有机会修复这两个缺陷,那么您需要为此维护冗余信息….

您必须在堆中存储指向节点的链接,并在节点运行时同步这些链接在堆内“移动”。我必须更新数组中的距离。否则,我应该如何比较我PQ中的节点是否可以提供到相邻节点的更好距离?理想情况下,您应该能够从PQ中查找它。如果此操作不可用(并且无法添加到PQ实现中),然后您将需要维护冗余信息。[我将在我的答案中添加一部分]最好是我可以在PQ中维护一个堆,并使用哈希函数将每个节点名称(2D数组中的位置)映射到它的距离。但不确定我将如何实现这一点。请检查我的编辑--if
decreaseKey()
是为您的PQ正确实现的,我认为您不需要其他任何东西。这很有意义。只需在相邻节点之间循环,并在每个节点上使用decreaseKey。您对如何在堆中实现decreaseKey()有何想法?