这是我如何将两个小堆组合在一起的?

时间:2015-03-22 21:41:13

标签: c++ heap

我目前正在创建一个源代码,将两个满足min heap属性的堆与一个完整二叉树的形状不变量组合在一起。但是,我不确定我所做的是否是正确接受的合并两个堆的方法,以满足我的要求。

以下是我的想法:

给定两个表示为min堆的优先级队列,我将第二个树的节点逐个插入第一个树并修复堆属性。然后我继续这个,直到第二个树中的所有节点都在第一个树中。

从我看到的,这感觉就像一个nlogn算法,因为我必须遍历第二个树中的所有元素,并且每个插入需要大约登录时间,因为完整二叉树的高度最多为logn ..但我认为有更快的方法,但我不确定其他可能的方法是什么。

我在想我可以插入整个树,但是这会打破形状不变并且命令不变。我的方法是唯一的方法吗?

1 个答案:

答案 0 :(得分:2)

实际上,在线性时间内构建堆是可能的,标准函数std::make_heap可以保证线性时间。关于binary heap的维基百科文章解释了该方法。

这意味着您可以通过在包含来自两个堆的元素的范围上调用std::make_heap来简单地合并堆。如果堆具有相似的大小,则这是渐近最优的。可能有一种方法可以利用预先存在的结构来减少常数因子,但我发现它不太可能。