要构建一个 MAX 堆树,我们可以siftDown
或siftUp
,通过从根开始筛选并将其与它的两个孩子进行比较,然后用两个孩子中较大的元素替换它,如果两个孩子都较小,则停止,否则,我们继续向下筛选该元素,直到到达叶节点(或者当然再次,直到该元素大于其两个子节点)。
现在我们只需要这样做n/2
,因为叶子的数量是n/2
,并且当我们在最后一层(叶子之前)上完成对最后一个元素的堆化时,叶子将满足堆属性 - 所以我们将剩下n/2
要堆积的元素。
现在,如果我们使用siftUp
,我们将从叶子开始,最终我们需要将所有n
元素堆起来。
我的问题是:当我们使用时siftDown
,我们基本上不是在进行两次比较(将元素与其两个子元素进行比较),而不是在使用时仅进行一次比较siftUp
,因为我们只将该元素与其一个父元素进行比较?如果是,那是否意味着我们将复杂性加倍并最终得到与筛选相同的复杂性?