在O(logn)时间内使用STL堆实现Decrease Key

时间:2012-03-24 06:49:54

标签: c++ stl heap

目前STL Heap不支持减小键,但是可以直接更改向量上的值并再次调用make_heap,即O(n)时间。但是,这不如二进制堆减少密钥有效,这将需要O(logn)时间。

有没有办法使用STL堆函数实现O(logn)时间?

2 个答案:

答案 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());
}

编辑:这是你的意思,还是你想减少堆中任何元素的密钥?