您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

合并两个最大堆的算法?

合并两个最大堆的算法?

这取决于堆的类型。

如果这是一个标准堆,其中每个节点最多有两个子节点,并且叶子被放在最多两个不同的行中而被填满,那么合并的效果就不会比O(n)好。

只需将两个数组放在一起,并从中创建一个新堆,就需要O(n)。

为了获得更好的合并性能,可以使用另一个可以在O(1)摊销后合并的Fibonacci-Heap之类的堆变量。

请注意,将第一个堆的所有元素一个一个地插入第二个堆,或者反之亦然,因为插入需要O(log(n))。正如您的评论所指出的,您似乎并不知道在一开始如何最佳地构建堆(再次针对标准二进制堆)

在这里省略了一个证明,但是您可以解释这一点,因为您已经在底层完成了大部分堆操作,而不必交换很多内容来重新建立堆条件。您已经对较小的“子堆”进行了操作,这要比将每个元素插入其中一个堆中的操作要好得多=>然后,您将对整个堆进行每次操作,每次都需要O(n) 。

二项式堆允许合并O(log(n))并符合O(log(n)^ 2)的要求。

其他 2022/1/1 18:14:21 有714人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶