如果我们以Top Down Manner迭代build-max-heap会发生什么

时间:2017-09-08 05:00:06

标签: algorithm heap max-heap

如果我们以简要的时间复杂度计算以自上而下的方式构造构建堆,有什么缺点。简单地使用第一个buid-max-heap堆算法比常用的第二算法

Build-max-heap(A)
{
   A.heap-size=A.length
   for(i=1 to [A.lenth]/2)
   max-heapify(A,i)
}

Build-max-heap(A)
{
   A.heap-size=A.length
   for(i=[A.lenth]/2 downto 1)
   max-heapify(A,i)
}

2 个答案:

答案 0 :(得分:1)

如上所述,您的第一个示例不会执行任何操作,因为i小于[A.length/2]。我怀疑你的意思是你的第一个例子:

for (i=1 to [A.length]/2)

假设这是你的意思,从顶部执行 min-heapify ,down将不会产生有效的堆。考虑原始数组[4,3,2,1],它代表这棵树:

        4
      3   2
    1

在第一次迭代中,您想要向下移动4。因此,您将它与最小的子项交换并获取数组[2,3,4,1]

接下来,您要过滤3.因此,您将其与最小的孩子交换并获得[2,1,4,3]。你现在已经完成了,你的“堆”看起来像这样:

        2
      1   4
    3

哪个不是有效的堆。

当你从中间向上,然后最小的项目可以过滤到顶部。但是当你从上到下时,最小的物品可能永远不会到达顶部。

答案 1 :(得分:0)

最大或最小堆是嵌套的最大或最小函数的实现, 例如 $sql = "SELECT option_value FROM " . $val . "_options WHERE option_name = 'home'"; ,它是{strong>所有数组元素的max(max(max(a, b), max(c, d)), ...)min()的一种表达式树,也就是说,您正在实现max()max(a, b, c, ...)。为了产生正确的结果,您需要收集最小或最大元素进行比较。为此,您需要对底部的元素进行广泛的比较,然后向上比较,将需要比较的元素数除以每级2个(每级消除一半)。从上到下不会产生正确的结果;您实现了错误的表达式。