c++ - 这就是我将两个最小堆组合在一起的方式吗?

标签 c++ heap

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

这是我的想法:

给定两个表示为最小堆的优先级队列,我将第二棵树的节点逐个插入到第一棵树中并修复堆属性。然后我继续此操作,直到第二棵树中的所有节点都位于第一棵树中。

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

我想我可以插入整个树,但这会破坏形状不变性和顺序不变性..我的方法是唯一的方法吗?

最佳答案

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

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

关于c++ - 这就是我将两个最小堆组合在一起的方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29200187/

相关文章:

algorithm - 我对此算法的复杂度 O(n + k log n) 的解释是否正确?

c++ - 检查 4 个点是否构成一个正方形

c++ - 作为函数调用的一部分访问其成员时,右值对象何时被销毁?

iterator - 在二叉堆上实现迭代器

java - 使用最小堆对单词进行排序

elasticsearch - Elasticsearch段建立,堆增加直到崩溃

java - 如何在java中获取比较器的倒数

c++ - 使用 vs 代码调试文件时,如何将文件传递到我的程序中

c++ - 如何在opencv中将二维数组转换为灰度图像?

c++ - 在 DirectX 中取消投影屏幕坐标时出现意外结果