我现在正试图理解堆的实现,并查看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。我误解了什么吗?
答案 0 :(得分:1)
这只是一个命名冲突。他们所谓的“siftup”正在向树叶筛选。也许这样的想法是,在最小堆中,较大的物品向上移动到叶子上。
他们的“大幅下降”走向了根源。
它与我们计算机人通常(?)所认为的树一样颠倒,但它是一致的。如果你想象一棵物理树 - 在院子里生长的东西和秋天的叶子,我必须耙起并处理它,这是有道理的。