我试图想到一个主意,使一个新的分支操作,通过给予Binomial heap。斯普利特二项堆
问题是如何在最小运行时间内将二叉堆(size n)拆分成大小为k(k < n)的二项式堆 和大小为n-k的二项堆。
我试图想到一个主意,使一个新的分支操作,通过给予Binomial heap。斯普利特二项堆
问题是如何在最小运行时间内将二叉堆(size n)拆分成大小为k(k < n)的二项式堆 和大小为n-k的二项堆。
你可以找到O(n)
时间中位数算法的中位数一组的kth
最大的元素。 Source。
当你有一个值,你可以阅读从原来堆的所有值(不需要解压,它们的顺序读取上并不重要,只有在新的阵列写。这有额外的好处不要混淆原始堆,Yay),并将其放入大堆或小堆中,具体取决于它们与kth
值之间的关系。每次提取是O(1)
并发生n
次。每个插入是O(lg n)
并且发生n
次。
Total running time: n + n + n lg n = O(n lg n)
| | |
selection | inserts
extraction
您可以通过简单地从原来的堆取出k个元素,并将它们转移到一个新的不同的堆在K *的log(n)做到这一点。 (这个假设堆是最小堆,如果它是一个最大堆那么它可以在(NK)的log(n)来完成同样的方式)
会是什么有这种拆分操作的好处(还有一个原因堆是分裂50/50)?你试过什么了? – Davidann 2011-05-10 18:12:02