【发布时间】:2014-11-02 14:37:47
【问题描述】:
我正在尝试实现 A* 算法并且我需要一个优先级队列,但是 std::priority_queue 对我不起作用,因为我需要查找元素(Node 对象)是否在 @ 987654323@ 或不访问其数据并在必要时对其进行修改。
我可以使用std::priority_queue 以某种方式做到这一点吗?
由于我对 std::priority_queue 没有太多经验,因此我将不胜感激代码建议。
【问题讨论】:
-
你不能使用front()并遍历它吗?
-
boost::bimap 怎么样?
-
请注意,标准库容器通常会在效率低下时避免提供操作。在通常的优先级队列实现中(使用堆),搜索和成员资格测试具有 O(N) 复杂性,这可能是为什么没有内置提供此操作的原因。这对您的应用程序可能是也可能不是问题。只需注意您需要多久测试一次会员资格。
-
必须在每个新节点上进行搜索,花费 O(M),M=队列大小。
-
@mariya:通常,当您需要对优先级队列进行成员资格测试时,您会将堆与有效实现此操作的(散列)集结合起来。成本是 O(N) 内存,因此您可以确定这种权衡是否适合您。每次从堆中添加/删除项目时,请确保从集合中添加/删除项目。如果要实现删除,只需从集合中删除项目,并在从堆中弹出它们时忽略不在集合中的项目。如果您需要更新项目,它会变得有点棘手,但它也是可行的。
标签: c++ stl priority-queue