我需要找到最有效的算法来合并2个max-sheaps。
一些重要事实:堆被表示为二叉树,这意味着每个节点有3个字段 - 值(键),指向右子节点的指针和指向左子节点的指针。
我的想法:获取第二个堆的最后一个叶子并将其作为新堆的根。所以我们得到一个新的堆,当左子是合法的最大堆,而右子是合法的最大堆。问题(我认为)只是根不是最大元素的事实 - 所以我们可以从根运行函数 Max-Heapify ,我认为它应该解决问题。
最差情况下的总运行时间 - O(logn) - 因为以root作为根 O(1),并且最大 - Heapify < / strong>是 O(登录)。
你怎么看?我对么? 是否有更有效的算法来合并2个max-sheaps? (请考虑表示是二叉树的事实)
答案 0 :(得分:0)
您提出的方法存在两个问题。首先是表示:通常堆被表示为数组,而不是具有指针的单个节点,这将需要$('#tab1-slideout span').click(function (event) {
event.stopPropagation();
manageToggleStateTab1();
});
交错操作。
即使您对前面的数组存储没有问题,也需要考虑形状属性。除非你非常幸运,否则左右堆不会是正确的大小,结果是一个有效的堆(也就是说,叶子的深度最多为1,并且所有的更深的叶子在左边。)
有关合并二进制堆的更多信息,请参阅Algorithm for merging two max heaps?。但是,如果您不使用数组表示,那么并非所有的内容都必须适用。