【发布时间】:2015-06-22 03:46:30
【问题描述】:
如果我有一个最大堆,并且如果我需要更改最大元素,则归结为单个气泡下降算法。有没有办法通过 C++ 标准库做到这一点,而无需手动编码算法?
我知道它应该等同于 pop_heap + push_heap,但这是 2 次冒泡操作,而不仅仅是一次。
那么 - 这个冒泡算法是通过库 API 公开的吗?
【问题讨论】:
如果我有一个最大堆,并且如果我需要更改最大元素,则归结为单个气泡下降算法。有没有办法通过 C++ 标准库做到这一点,而无需手动编码算法?
我知道它应该等同于 pop_heap + push_heap,但这是 2 次冒泡操作,而不仅仅是一次。
那么 - 这个冒泡算法是通过库 API 公开的吗?
【问题讨论】:
如果您愿意在自己的容器v 上调用std::pop_heap(),那么您可以在弹出堆之前先在容器上的“修改”元素上先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();
}
这“有效”是因为std::pop_heap() 被定义为交换第一个和最后一个元素并冒泡。但是,还规定了输入序列应该是有效堆。如果我们能够定义一个专门的比较操作,允许新推回的项目在它已经在最后一个位置时报告自己属于最后一个位置,那么它在技术上可以满足要求。
【讨论】:
你会得到最接近的是std::make_heap,这可能比简单的弹出/推送慢。
然而,boost heap(s?) 有“Fixup Interface”,它允许您根据需要进行修改。 http://www.boost.org/doc/libs/1_51_0/doc/html/heap/concepts.html#heap.concepts.mutability
【讨论】:
std::make_heap 会比pop 和push 大堆慢很多。对于小堆,它可能会更快。
make_heap 是如何实现的,但是可能对于除了一个元素之外已经是堆的东西来说它可能非常快. 可能它甚至是最适合这种情况的。虽然取决于实施。而且我完全在推测,无论初始布局如何,都可能或多或少地要求 make_heap 实现是相同的运行时。
make_heap 将无法扩展。