堆插入,删除k个元素

时间:2010-10-31 19:26:54

标签: algorithm heap

我有以下问题(我认为这是众所周知的/标准的)我在想:

验证列出二进制最小堆中的k个最小元素是O(k)。

我正在考虑遍历BFS中的大型最小堆,维护一个最小堆而不是一个简单的队列。最初,辅助最小堆包含我的大最小堆的根。在每一步,我提取最小值,然后我添加所有子节点(最多2个)。该算法在辅助最小堆上的k extract-mins之后停止。辅助最小堆的大小为O(k)(对于每个最小密钥提取我插入其子项,最多2个)。

问题是extract-min具有O(log k)复杂度,因此该算法具有O(k log k)复杂度。我必须在O(k)中找到一个。

你有任何我可以使用的想法/论文吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

谷歌搜索'堆选择算法',我遇到'弗雷德里克森的堆选择算法',导致this paper(27页......)。

答案 1 :(得分:0)

我想我找到了解决方案。在每一步,我执行增量键,而不是执行extract-min。我搜索了一个数据结构,其中包含增加键,插入键和get-min的O(1)最坏情况时间,我找到了 Brodal queue

有关更多信息,您可以查看Fibonacci heap,因为Brodal队列基于Fibonacci堆开发的概念。

因此,在每个步骤中,我都有以下操作序列:

  1. min = get-min(辅助堆)

  2. 让(v1,v2)成为min的孩子

  3. increase-min(辅助堆,root,v1)

  4. insert(Auxiliary heap,v2)

  5. 这4个操作中的每一个都具有O(1)最坏情况的复杂性。