siftdown函数的实现违反了堆正式定义?

时间:2016-07-22 09:37:49

标签: python heap

我现在正试图理解堆的实现,并查看python的heapq模块 https://github.com/python-git/python/blob/master/Lib/heapq.py
Line236是siftdown代码的开始,奇怪的是,它看起来像是一个siftup,因为它在堆数组的最后一个元素上添加了一个newitem,并尝试将最后一个元素向上移动到正确的位置。 BR />

while pos > startpos:
        parentpos = (pos - 1) >> 1
        parent = heap[parentpos]
        if newitem < parent:
            heap[pos] = parent
            pos = parentpos
            continue
        break

它将当前位置的索引减少到(pos-1)// 2,最后pos可以转到索引0。 所以对我来说这看起来像是一个siftup。我误解了什么吗?

1 个答案:

答案 0 :(得分:1)

这只是一个命名冲突。他们所谓的“siftup”正在向树叶筛选。也许这样的想法是,在最小堆中,较大的物品向上移动到叶子上。

他们的“大幅下降”走向了根源。

它与我们计算机人通常(?)所认为的树一样颠倒,但它是一致的。如果你想象一棵物理树 - 在院子里生长的东西和秋天的叶子,我必须耙起并处理它,这是有道理的。