这是为什么它是 O(N) 的一个论点。
假设它是一个完整的堆,所以每个非叶节点都有两个孩子。(即使不是这样,它仍然有效,但更烦人。)
将硬币放在树中的每个节点上。每次我们进行交换时,我们都会花费其中一个硬币。(请注意,当元素在堆中交换时,硬币不会与它们交换。)如果我们运行 MAX-HEAPIFY,并且有剩余的硬币,这意味着我们进行的交换比树中的节点少,因此 MAX-HEAPIFY 执行 O(N) 交换。
声明:在 MAX-HEAPIFY 运行完成后,堆总是有至少一条从根到叶的路径,路径的每个节点上都有硬币。
归纳证明:对于单节点堆,我们不需要做任何交换,所以我们不需要花费任何硬币。因此,一个节点可以保留其硬币,并且我们有一条从根到叶(长度为 1)的完整路径,硬币完好无损。
现在,假设我们有一个带有左右子堆的堆,并且 MAX-HEAPIFY 已经在两者上运行。通过归纳假设,每个都有至少一条从根到叶的路径,上面有硬币,所以我们至少有两条从根到叶的有硬币的路径,每个孩子一个。为了建立 MAX-HEAP 属性,根需要走的最远距离是一直交换到树的底部。假设它向下交换到左子树,并且一直向下交换到底部。对于每次交换,我们需要花费硬币,所以我们从根交换到的节点花费它。
在此过程中,我们将所有硬币都花在了从根到叶的路径之一上,但请记住,我们最初至少有两个!因此,在整个堆上运行 MAX-HEAPIFY 后,我们仍然有一条完整的从根到叶的路径。因此,MAX-HEAPIFY 花费的硬币比树中的节点少。因此,交换次数为 O(N)。QED。