代码之家  ›  专栏  ›  技术社区  ›  Neil G

C++中是否有一个堆类支持改变除了头部以外的元素的优先级?

  •  11
  • Neil G  · 技术社区  · 16 年前

    我有一个事件的优先级队列,但有时事件优先级会改变,所以我想维护从事件请求者到堆的迭代器。如果优先级改变,我希望在日志(n)时间内调整堆。我将始终只有一个迭代器指向堆中的每个元素。

    4 回复  |  直到 12 年前
        1
  •  10
  •   Ferruccio    16 年前

    看看Boost的 mutable heaps .

        2
  •  3
  •   Neil G    12 年前

    我很高兴地报告说Boost现在增加了 Boost.Heap library 与一些 stellar data structures .

    这样做的好处是斐波那契堆支持在固定的摊余时间内更改优先级。

    不幸的是,所有可变堆都是基于节点的(换句话说,它们有@wilx建议的额外间接寻址)。@Feruccio对Boost的可变堆的回答包含代码,如果您愿意在值类型中包含指向句柄的指针,则允许编写基于向量的可变堆。

        3
  •  2
  •   wilx    16 年前

    听起来你需要更多的间接性。将指向事件的指针存储在优先级队列中。当队列的某个元素的优先级发生更改时,请将其删除并重新插入。

        4
  •  0
  •   Nikolai Fetissov    16 年前

    这里的一个警告是,您最终会遇到不稳定的事件排序,即具有相同优先级的事件的顺序未定义(读取“它们将被重新排序”)。