如果我们以简要的时间复杂度计算以自上而下的方式构造构建堆,有什么缺点。简单地使用第一个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)
}
答案 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个(每级消除一半)。从上到下不会产生正确的结果;您实现了错误的表达式。