Python Heapq模块实现

Python Heapq模块实现,python,algorithm,data-structures,heap,standard-library,Python,Algorithm,Data Structures,Heap,Standard Library,我正在阅读heapq模块源代码,因为我在上查看了一篇文章,但我不能理解一些内容 在about堆中,它说: 向上筛选:根据需要在树中向上移动节点;用于在插入后恢复堆条件。之所以称为“筛选”,是因为节点在树上向上移动,直到达到正确的级别,就像在筛选中一样 向下筛选:在树中向下移动节点,类似于向上筛选;用于在删除或替换后恢复堆条件 但是heappush()的代码是: 如果我读对了维基百科,当插入一个元素时,我希望看到一个siftup调用,而不是siftdown调用 类似地,对于heappop(): 从

我正在阅读
heapq
模块源代码,因为我在上查看了一篇文章,但我不能理解一些内容

在about堆中,它说:

向上筛选:根据需要在树中向上移动节点;用于在插入后恢复堆条件。之所以称为“筛选”,是因为节点在树上向上移动,直到达到正确的级别,就像在筛选中一样

向下筛选:在树中向下移动节点,类似于向上筛选;用于在删除或替换后恢复堆条件

但是
heappush
()的代码是:

如果我读对了维基百科,当插入一个元素时,我希望看到一个
siftup
调用,而不是
siftdown
调用

类似地,对于
heappop
():

从维基百科的文章中,我期待着一个
siftdown
呼叫,但得到了一个
siftup
呼叫


这是维基百科中的错误还是在
heapq
模块中的错误?还是我的理解有误?

如评论中所述,这是一个术语问题。最常见的术语称根为树的“顶部”,其他级别的节点位于根的“下方”。我们按这个方向画树。即:

        1
    2       3
  4   5   6   7
因此,有理由说,将项目从根目录移动到较低级别就是“向下筛选”

你可以提出这样的论点,就像有人在评论中所做的那样,将某个对象移动到较低的级别会增加其在支持数组中的索引,因此将其称为“筛选”是有意义的。但是人们正在可视化树模型,而不是数组实现。当谈到模型时,您的术语应该与模型一致

我总是觉得有点烦人,
heapq
的作者决定使用非标准术语。有人可能会说他在谈论实施,但我对此表示怀疑。评论说,“筛选:在树中向上移动节点…”显然,他指的是树模型

维基百科说:

树形结构或树形图是以图形形式表示结构层次性质的一种方法。它被命名为“树结构”,因为经典的表示类似于一棵树,尽管与实际的树相比,图表通常是颠倒的,“根”在顶部,“叶”在底部


这个话题在早期就被讨论到了极点,也许最著名的是唐纳德·克努特在《计算机编程艺术》一书中。请参阅。

在流行音乐之后,您需要进行筛选是有道理的。毕竟,您删除了堆的顶部元素。有些东西必须向上移动才能取而代之。那么wikipedia在这种情况下是错误的吗?哦,我明白了:“向下筛选:用于在删除或替换后恢复堆状态”,但是
heappop()
调用它
\u siftup()
。在这种情况下,我认为维基百科的命名实际上更为标准。这与可视化有关。通常情况下,堆被想象成根在顶部,然后Wikipedia的语言就有了意义,但是没有理由不能想象堆被想象成根在底部。我的意思是:现实生活中的树木根在土壤中,而不是在天空中@TrimCOT在你所考虑的筛选器中也存在歧义。如果从根元素开始(在顶部可视化)并向下推它,则必须向上推它的一个子元素。所以有东西在向各个方向移动。解释树为什么倒立的好链接,很好的答案!
def heappop(heap):
    """Pop the smallest item off the heap, maintaining the heap invariant."""
    lastelt = heap.pop()    # raises appropriate IndexError if heap is empty
    if heap:
        returnitem = heap[0]
        heap[0] = lastelt
        _siftup(heap, 0)
        return returnitem
return lastelt
        1
    2       3
  4   5   6   7