目前STL Heap不支持减小键,但是可以直接更改向量上的值并再次调用make_heap,即O(n)时间。但是,这不如二进制堆减少密钥有效,这将需要O(logn)时间。
有没有办法使用STL堆函数实现O(logn)时间?
答案 0 :(得分:3)
我很确定没有符合标准的方法 - Wikipedia says so too:
对减少/增加键操作没有标准支持
虽然它确实指向gheap
库,这可能值得一看。
这里的问题是标准没有规定堆结构采用什么形式,也没有强制执行操作的准确程度。 (总的来说,这是一件好事。)
如果实现使用标准二进制堆,那么我认为您可以简单地减少heap[i]
处的元素,然后调用push_heap(heap.begin(), heap.begin() + i + 1)
,这将执行必要的堆栈操作。最终位于i
的元素必须不大于最初的值,因此保留整个堆的heap属性。但是标准不支持这一点,即使它在某些实现中有时会起作用。
答案 1 :(得分:1)
您可以使用pop_heap
,然后递减值push_heap
:
int main() {
//Create the heap
std::vector<int> heap{1,2,3,4,5,6,7};
std::make_heap(heap.begin(), heap.end());
//Decrease key
std::pop_heap(heap.begin(), heap.end());
--*(std::prev(heap.end()));
std::push_heap(heap.begin(), heap.end());
}
编辑:这是你的意思,还是你想减少堆中任何元素的密钥?