有没有一种高效的算法可以合并以数组形式存储的两个最大堆?
有没有一种高效的算法可以合并以数组形式存储的两个最大堆?
这取决于堆的类型。
如果它是标准堆,其中每个节点最多有两个子节点,并且叶子节点最多在两个不同的行上,那么您无法获得比O(n)更好的合并结果。
只需将两个数组放在一起,并创建一个新的堆,需要O(n)的时间。
为了获得更好的合并性能,您可以使用另一种堆变体,例如Fibonacci堆,其摊销为O(1)。
更新:请注意,单独将第一个堆的所有元素插入第二个堆或反之亦然比较差,因为插入需要O(log n)。
我在此省略了证明,但您可以解释一下,因为您已经完成了大部分在底层堆上的工作,在那里您不必交换太多内容以重新建立堆条件。您已经对较小的“子堆”进行了操作,这比如果您将每个元素插入一个堆中要好得多=>然后,您每次都会对整个堆进行操作,这需要O(n)的时间。
更新2:二项式堆允许在O(log(n))中合并,并且符合您的O(log(n)^ 2)要求。
大小为n和k的两个二叉堆可以在O(log n * log k)次比较中合并。 参见Jörg-R. Sack和Thomas Strothotte,An algorithm for merging heaps, Acta Informatica 22(1985),172-186。