分裂二项式堆

时间:2011-05-10 18:06:05

标签: data-structures

我正在考虑通过给出Binomial heap进行新的拆分操作的想法。

问题是如何将二项式堆(大小n)拆分为二项式堆 大小为k(k

3 个答案:

答案 0 :(得分:1)

您可以使用中位数算法在kth时间内找到集合中O(n)个最大元素。 Source

当你有了这个值时,你可以读取原始堆中的所有值(不需要提取,它们的顺序在读取时无关紧要,只有在新数组中写入。这有额外的好处弄乱原始堆。然后。)并根据它们与kth值的关系放入大堆或小堆中。每次提取均为O(1),并且发生n次。每个插入都是O(lg n),并且发生n次。

Total running time: n +  n  + n lg n = O(n lg n)
                    |    |       |
             selection   |    inserts
                     extraction

答案 1 :(得分:0)

您可以在k * log(n)中执行此操作,只需从原始堆中删除k个元素并将它们移动到新的不同堆即可。 (假设堆是最小堆,如果它是最大堆,那么它可以在(n-k)log(n)中以相同的方式完成)

答案 2 :(得分:0)

由于二项式堆的树可以表示为n的二进制数字,因此只需在n和k之间进行二进制长减法即可在O(log(n))中拆分堆,每次需要“借用”您分割成半棵树的数字。就像二叉树合并一样,只是在树上使用二进制长减法而不是加法。