【问题标题】:Heapq module implementationHeapq 模块实现
【发布时间】:2019-05-01 22:21:13
【问题描述】:

我正在阅读 heapq 模块源代码,因为我在 CodeReview 上查看了 question 并且我无法理解某些内容。

wikipedia article about heap 中说:

sift-up:在树中向上移动一个节点,只要需要;用于在插入后恢复堆状态。之所以称为“筛选”,是因为节点在树上向上移动,直到达到正确的级别,就像在筛子中一样。

sift-down:在树中向下移动一个节点,类似于 sift-up;用于在删除或替换后恢复堆状态。

但是heappushsource code)的代码是:

def heappush(heap, item):
    """Push item onto heap, maintaining the heap invariant."""
    heap.append(item)
    _siftdown(heap, 0, len(heap)-1)

如果我没看错维基百科,在插入元素时,我希望看到的是 siftup 调用,而不是 siftdown 调用。

heappop (source here) 也是如此:

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

从维基百科的文章中,我期待一个siftdown 的电话,但得到了一个siftup 的电话。

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

【问题讨论】:

  • 在流行音乐之后需要筛选是有道理的。毕竟,您已删除了堆的顶部元素。必须有东西向上移动才能取代它的位置。
  • 那么维基百科在这种情况下是错误的?
  • 哦,我明白了:“筛选:用于在删除或替换后恢复堆状态”但 heappop() 称之为 _siftup()。在这种情况下,我认为维基百科的命名实际上更标准。
  • 这只是与可视化有关。通常堆被想象为根在顶部,然后维基百科的语言是有意义的,但是没有理由不能想象堆在底部的根。我的意思是:现实生活中的树木扎根于土壤,而不是天空。 ;-)
  • @trincot 您认为正在筛选的内容也存在歧义。如果您从根处的元素(您在顶部可视化)开始并将其向下推,则必须将其其中一个子元素向上推。所以有些东西正在朝各个方向发展。

标签: python algorithm data-structures heap standard-library


【解决方案1】:

正如 cmets 中所述,这是一个命名问题。最常见的术语将根称为树的“顶部”,而其他级别的节点位于根的“下方”。我们以该方向绘制树。那就是:

        1
    2       3
  4   5   6   7

因此,可以说将项目从根移动到较低级别是“向下筛选”。

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

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

维基百科,https://en.wikipedia.org/wiki/Tree_structure,说:

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

这个话题在早期被讨论到死,也许最著名的是 Donald Knuth 在计算机编程的艺术中。见https://www.quora.com/Why-are-trees-in-computer-science-generally-drawn-upside-down-from-how-trees-are-in-real-life

【讨论】:

  • 很好的链接解释了为什么树是颠倒的,很好的答案!
猜你喜欢
  • 2012-01-27
  • 2013-11-27
  • 2012-12-20
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多