我正在考虑通过给出Binomial heap进行新的拆分操作的想法。
问题是如何将二项式堆(大小n)拆分为二项式堆
大小为k(k
答案 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))中拆分堆,每次需要“借用”您分割成半棵树的数字。就像二叉树合并一样,只是在树上使用二进制长减法而不是加法。