可变优先级队列允许密钥增加

时间:2011-09-06 06:57:36

标签: c++ data-structures

在实现图搜索算法时,我需要一个允许优先级更改的优先级队列。到目前为止,我一直在使用(detail命名空间,因此未记录)boost d_ary_heap_indirect,但刚刚被告知未定义优先级增加(我现在也看到了在concept documentation)。

所以,我需要找到一个允许增加和减少的结构。我已经尝试过简单地使用vectorpush_heap / pop_heap / make_heap,但更新太慢了。有哪些替代方案?我看到boost在待定(再次,未记录)的目录mutable_queuerelaxed_heap中有两个类,但我只能在五年的maillist线程中找到它们。它们之间有什么区别,它们是否允许增加和减少?是否有任何未正式接受的实施?

2 个答案:

答案 0 :(得分:2)

将值放入堆中。您需要做的就是修改该值,然后通过向上或向下冒泡来恢复堆不变量。

回想一下,堆本质上是一个二叉树,其中每个节点都大于它的两个子节点。

因此,如果增加节点的值,则检查它是否已变得大于其父节点,如果是,则交换它们,然后重复将节点拉向树根,直到不再需要交换节点为止。

如果您减少节点的值,那么如果您现在小于两个子节点中的最大值。重复将节点推向树叶,直到您不再需要交换为止。

答案 1 :(得分:1)

Boost.MultiIndex库具有容器,该容器具有update对象状态的操作,并将相应地更新索引。

在您的情况下,modify成员函数似乎适合。来自文档:

struct change_name
{
  change_name(const std::string& new_name):new_name(new_name){}

  void operator()(employee& e)
  {
    e.name=new_name;
  }

private:
  std::string new_name;
};

typedef employee_set::index<name>::type employee_set_by_name;
employee_set_by_name& name_index = es.get<name>();

employee_set_by_name::iterator it = name_index.find("Anna Jones");
name_index.modify(it,change_name("Anna Smith"));