我应该对 dikjstra/A* 算法使用可变优先级队列吗?
Should I use mutable priority queue for dikjstra/A* algorithm?
我正在尝试将 A* 算法和 Dikjstra 算法实现为 A* 的特例(只需将 h(x){return 0;}
传递给 A*),在选择priority_queue时,我有两个选择
- 使用空priority_queue,初始化时按起点,做"啪,推满足一定条件的你的邻居",在此方式,如果一个节点是另外两个节点。
- 使用支持可变优先级队列
update()/decreaseKey()/increaseKey()
,我可以选择数据boost::heap
的结构,或者我可以(实际上我已经)实现priority_queue我自己,这样初始化时需要将所有节点推送到容器中,并且需要保留它们的句柄。
这两种策略的优缺点是什么,哪一种更实用?
在
C++中Dijkstra的优先级队列的常见实现使用std::set
,其中最小的项目是set.begin()
,你可以find
一个精确的项目并erase
它。您还可以轻松定义一个外观,该外观允许使用类似优先级队列的界面访问std::set
,并支持额外的更新/擦除/增加键/减少键方法。
在这里查找Dijkstra使用std::set
和std::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
并立即擦除旧物品,性能自然是一样的。
相关文章:
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 排序数组优先级队列
- 更改运行时优先级队列的排序功能
- 优先级队列构造函数的工作
- 实现优先级队列
- 优先级队列功能比较
- 在C++中打印对的优先级队列的所有值时出现问题
- 使用堆的优先级队列,具有相同键的值不遵循 FIFO(先进先出)
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 是否可以使用简单队列创建优先级队列
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- Cython中带有自定义比较器的优先级队列
- 优先级队列比较器[C++].
- asio::io_service 具有多个线程的优先级队列处理