我有一个事件的优先级队列,但有时事件优先级会改变,所以我想将事件请求者的迭代器维护到堆中。如果优先级发生变化,我希望在log(n)时间内调整堆。我将始终只有一个迭代器指向堆中的每个元素。
我有一个事件的优先级队列,但有时事件优先级会改变,所以我想将事件请求者的迭代器维护到堆中。如果优先级发生变化,我希望在log(n)时间内调整堆。我将始终只有一个迭代器指向堆中的每个元素。
看看Boost的 可变的堆。
看看Boost的 可变的堆。
我很高兴地报告说Boost现在增加了一个 Boost.Heap库 和一些 恒星数据结构。
这样做的好处是Fibonacci堆支持在不变的摊销时间内改变优先级。
不幸的是,所有可变堆都是基于节点的(换句话说,它们具有@wilx建议的额外间接)。 @ Feruccio对Boost的“可变堆”的回答有一些代码,如果你愿意拥有指向值类型中包含的句柄的指针,它可以编写基于矢量的可变堆。
这听起来像你需要更多的间接。存储指向优先级队列中事件的指针。当队列的某个元素的优先级发生变化时,将其删除并重新插入。
这里的警告是你最终得到不稳定的事件排序,即未定义具有相同优先级的事件的排序(读取'它们将被重新排序'。)