我正在尝试将A *算法和Dikjstra算法作为A *的一个特例(只是将h(x){return 0;}
传递给A *),在选择priority_queue时,我有两个选择
update()/decreaseKey()/increaseKey()
,我可以选择数据
boost::heap
中的结构或我可以(实际上我)实现一个
我自己的priority_queue,这样,在初始化时需要将所有节点推送到容器,并且需要保留它们的句柄。这两种策略的优点和缺点是什么,哪一种更实用?
答案 0 :(得分:0)
C ++中Dijkstra的优先级队列的常见实现使用std::set
,其中最小的项为set.begin()
,您可以find
确切的项目和{{ 1}}它。您还可以轻松定义一个允许使用类似优先级队列的接口访问erase
的外观,并支持额外的update / erase / increaseKey / decreaseKey方法。
在这里查看Dijkstra实施的代码示例std::set
和std::set
: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::priority_queue
并删除旧项目,性能自然都是相同的立即