有没有一种有效的算法来合并存储为数组的2个max-heap?
这取决于堆的类型。
如果这是一个标准堆,其中每个节点最多有两个子节点,并且叶子被放在最多两个不同的行中而被填满,那么合并的效果就不会比O(n)好。
只需将两个数组放在一起,并从中创建一个新堆,就需要O(n)。
为了获得更好的合并性能,可以使用另一个可以在O(1)摊销后合并的Fibonacci-Heap之类的堆变量。
更新: 请注意,将第一个堆的所有元素一个接一个地插入第二个堆,或者反之亦然,因为插入需要O(log(n))。正如您的评论所指出的,您似乎并不知道在一开始如何最佳地构建堆(再次针对标准二进制堆)
我在这里省略了一个证明,但是您可以解释这一点,因为您已经在底层完成了大部分堆操作,而不必交换很多内容来重新建立堆条件。您已经对较小的“子堆”进行了操作,这要比将每个元素插入其中一个堆中的操作要好得多=>然后,您将对整个堆进行每次操作,每次都需要O(n) 。
更新2: 二项式堆允许合并O(log(n))并符合O(log(n)^ 2)的要求。