Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 构建堆时从数组中间调用heapify的原因_Algorithm - Fatal编程技术网

Algorithm 构建堆时从数组中间调用heapify的原因

Algorithm 构建堆时从数组中间调用heapify的原因,algorithm,Algorithm,在构建堆时,我们从树的中间开始调用max\u heapify(A,i),即从底部(n/2)开始,直到根以递减方式保持堆属性。我读过一些背后的原因,但我仍然不明白为什么。有人能解释一下原因吗 谢谢。如果我们这样做,时间复杂度在最坏的情况下是线性的(证明的思想是观察到当一个元素被筛选时,另一个元素会向上移动,而元素一旦被移动就永远不会向下移动。因此,每片叶子向下移动的次数为零,每片叶子上一级的元素向上移动的次数最多为1,依此类推。如果我们明确计算这个和,结果是成为O(N)) 如果我们从末尾开始筛选元

在构建堆时,我们从树的中间开始调用
max\u heapify(A,i)
,即从底部(n/2)开始,直到根以递减方式保持堆属性。我读过一些背后的原因,但我仍然不明白为什么。有人能解释一下原因吗


谢谢。

如果我们这样做,时间复杂度在最坏的情况下是线性的(证明的思想是观察到当一个元素被筛选时,另一个元素会向上移动,而元素一旦被移动就永远不会向下移动。因此,每片叶子向下移动的次数为零,每片叶子上一级的元素向上移动的次数最多为1,依此类推。如果我们明确计算这个和,结果是成为
O(N))

如果我们从末尾开始筛选元素,则时间复杂度为
O(N logn)
(例如,如果数组是反向的)

总而言之,这种方法更有效


注意:我们可以从最后一个元素开始,但是一片叶子无论如何都不能向下,所以它将是无用的(尽管时间复杂度将保持线性)。

好吧,
floor(n/2)
不是指树的中间,而是指不是叶子的节点的数量。非常感谢。我仍然没有得到你的第一段,但正如我所理解的:(从(非叶子)节点开始是有效的,因为叶子节点不会下降,从而节省穿过叶子所需的时间)。这是正确的吗?@Medo粗略地说,是的。