如果我有最大堆,并且如果我需要更改max元素,则归结为单个冒泡算法。有没有办法通过C ++标准库来实现这一点,而无需手动编写算法?
据我所知,它应该等同于pop_heap + push_heap,但是这是2次冒泡操作,而不仅仅是一次。
那么 - 这个通过库API公开的冒泡算法是什么?
答案 0 :(得分:10)
如果您愿意在自己的容器std::pop_heap()
上致电v
,那么您可以先在容器上v.push_back()
进行修改"}弹出堆之前的元素。然后,缩小v
。
// Precondition is that v is already a heap.
void change_max_element (std::vector<int> &v, int modified_value) {
v.push_back(modified_value);
std::pop_heap(v.begin(), v.end());
v.pop_back();
}
这&#34;工作&#34;因为std::pop_heap()
被定义为交换第一个和最后一个元素并且向下冒泡。但是,还要求输入序列应该是有效堆。如果我们能够定义一个专门的比较操作,允许新推回的项目报告自己属于最后一个位置(如果它已经在最后一个位置),那么它在技术上可以满足要求。
答案 1 :(得分:1)
您最接近的是std::make_heap
,可能比简单地弹出/推送慢。
但是,boost heap(s?)有&#34; Fixup Interface&#34;它允许你想要的修改。 http://www.boost.org/doc/libs/1_51_0/doc/html/heap/concepts.html#heap.concepts.mutability