给定两个大小为n的最大堆,从两个最大堆的元素中获得一个最大堆大小的最小可能时间复杂度是多少?

时间:2018-04-19 07:18:05

标签: algorithm max structure heap

给定两个大小为n的最大堆,从两个最大堆的元素中获得一个最大堆大小的最小可能时间复杂度是多少?

我已经阅读了几个答案,每个人都说O(n)就是答案,因为我们可以将两个堆中的所有元素放入一个大小为2n的数组中,然后运行构建堆算法这需要O(n)时间复杂度。

但请考虑一下这种方法:

  1. 从两个堆中取出最后一个元素并确定哪个是最小的并将其作为新堆的根[O(1)]
  2. 把旧堆作为这个新根的孩子。
  3. 在此新堆[O(logn)]
  4. 上运行max heapify算法

    总T = O(1 + logn)= O(logn)

    我知道节点X上的max heapify假设X下面的节点已经是最大堆(在我上面讲述的过程中已经满足,因为两个旧堆都是自己的最大堆。)

    我哪里错了?

1 个答案:

答案 0 :(得分:3)

(我假设你的堆模型是二叉树,而不是数组)。

堆的一个属性是底层从左到右填充,没有间隙。当你有两个大小为n的堆时,它们的底层是部分填充的,所以你不能方便地将它们连接成一个更大的堆。

您的证明中的错误是max heapify要求从左到右填充树底层的节点。

请注意,没有方便的方法来使您的想法适应一般的工作。那是因为每个堆的底层可能有1到n / 2个节点,所以你需要触摸O(n)个节点来构建堆。