让我们有一个二进制堆,它由长度为n的数组实现。我们在该数组的末尾写入k个元素。之后,我们要在长度为n + k的该数组上重新堆属性。
复杂度应为O(k +(logn)* log(log(n)))。
我的举动。当然,我们可以使用标准程序恢复复杂度为O(n + k)的完整数组的堆属性。但这不能满足这种复杂性。
我也听说过以下方法。让我们用O(k)在k个最后一个元素上堆一个,然后我们创建一个“新堆”,其中第一个元素更大(如果我们使用max-heaps),然后是大小为n的第一个堆的顶部和第二个堆的顶部大小为k,第一个堆为新堆的左子堆,第二个堆为右子堆。之后,我们通过O(log(n + k))删除顶部元素。但是当我们使用数组表示形式时,我真的不明白如何实现这种方法。
答案 0 :(得分:1)
最简单的方法是对第k个新元素中的每一个应用“堆插入”操作。这具有O(k log(n))的复杂度,如果k远小于n,则它的复杂度要优于O(k + log(n)log(log(n)))