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

时间:2015-06-14 02:12:55

标签: c++ algorithm graph path-finding

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

  1. 使用一个空的priority_queue,并在初始化时按下起始点,并执行“pop u,push the u of their some some conditions”,in this 如果它是一个共同的邻居,一个节点可能被推两次 另外两个节点。
  2. 使用支持的可变优先级队列 update()/decreaseKey()/increaseKey(),我可以选择数据 boost::heap中的结构或我可以(实际上我)实现一个 我自己的priority_queue,这样,在初始化时需要将所有节点推送到容器,并且需要保留它们的句柄。
  3. 这两种策略的优点和缺点是什么,哪一种更实用?

1 个答案:

答案 0 :(得分:0)

C ++中Dijkstra的优先级队列的常见实现使用std::set,其中最小的项为set.begin(),您可以find确切的项目和{{ 1}}它。您还可以轻松定义一个允许使用类似优先级队列的接口访问erase的外观,并支持额外的update / erase / increaseKey / decreaseKey方法。

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

本文还声称,无论您使用std::priority_queue并丢弃已弹出的陈旧项目,还是使用std::priority_queue并删除旧项目,性能自然都是相同的立即