我应该对 dikjstra/A* 算法使用可变优先级队列吗?

Should I use mutable priority queue for dikjstra/A* algorithm?

本文关键字:优先级 队列 dikjstra 算法 我应该      更新时间:2023-10-16

我正在尝试将 A* 算法和 Dikjstra 算法实现为 A* 的特例(只需将 h(x){return 0;}传递给 A*),在选择priority_queue时,我有两个选择

  1. 使用空priority_queue,初始化时按起点,做"啪,推满足一定条件的你的邻居",在此方式,如果一个节点是另外两个节点。
  2. 使用支持可变优先级队列 update()/decreaseKey()/increaseKey(),我可以选择数据boost::heap的结构,或者我可以(实际上我已经)实现priority_queue我自己,这样初始化时需要将所有节点推送到容器中,并且需要保留它们的句柄。

这两种策略的优缺点是什么,哪一种更实用?

C++中Dijkstra的优先级队列的常见实现使用std::set,其中最小的项目是set.begin(),你可以find一个精确的项目并erase它。您还可以轻松定义一个外观,该外观允许使用类似优先级队列的界面访问std::set,并支持额外的更新/擦除/增加键/减少键方法。

在这里查找Dijkstra使用std::setstd::priority_queue实现的代码示例:https://www.topcoder.com/community/data-science/data-science-tutorials/power-up-c-with-the-standard-template-library-part-2/#dijkstra2

本文还声称,无论是使用std::priority_queue并丢弃弹出的陈旧物品,还是使用std::set并立即擦除旧物品,性能自然是一样的。