我有以下问题(我认为这是众所周知的/标准的)我在想:
验证列出二进制最小堆中的k个最小元素是O(k)。
我正在考虑遍历BFS中的大型最小堆,维护一个最小堆而不是一个简单的队列。最初,辅助最小堆包含我的大最小堆的根。在每一步,我提取最小值,然后我添加所有子节点(最多2个)。该算法在辅助最小堆上的k extract-mins之后停止。辅助最小堆的大小为O(k)(对于每个最小密钥提取我插入其子项,最多2个)。
问题是extract-min具有O(log k)复杂度,因此该算法具有O(k log k)复杂度。我必须在O(k)中找到一个。
你有任何我可以使用的想法/论文吗?
谢谢!
答案 0 :(得分:2)
谷歌搜索'堆选择算法',我遇到'弗雷德里克森的堆选择算法',导致this paper(27页......)。
答案 1 :(得分:0)
我想我找到了解决方案。在每一步,我执行增量键,而不是执行extract-min。我搜索了一个数据结构,其中包含增加键,插入键和get-min的O(1)最坏情况时间,我找到了 Brodal queue 。
有关更多信息,您可以查看Fibonacci heap,因为Brodal队列基于Fibonacci堆开发的概念。
因此,在每个步骤中,我都有以下操作序列:
min = get-min(辅助堆)
让(v1,v2)成为min的孩子
increase-min(辅助堆,root,v1)
insert(Auxiliary heap,v2)
这4个操作中的每一个都具有O(1)最坏情况的复杂性。