奇怪的Python堆:heappop()第一次输出



第一个heappop()不是数组的最小值,而它是第一个索引。

之后,heappop()工作

我想也许是在heappop()之后的自动heapify() ?检查文档但一无所获

>>> a = [412,23,24,24,32,5,324,12,41,125,5,32,41,24,12,5,34,1]
>>> heappop(a)
412
>>> heappop(a)
1
>>> heappop(a)
23
>>> a
[24, 24, 5, 12, 32, 32, 324, 5, 41, 125, 5, 34, 41, 24, 12]

顺便说一句,如果一开始就使用heapify() a,那么heappop()会工作得很好。如能对此作出解释,将不胜感激。谢谢你!

>>> a = [412,23,24,24,32,5,324,12,41,125,5,32,41,24,12,5,34,1]
>>> heapify(a)
>>> a
[1, 5, 5, 5, 32, 24, 12, 12, 24, 125, 412, 32, 41, 24, 324, 23, 34, 41]
>>> heappop(a)
1
>>> heappop(a)
5
>>> heappop(a)
5
>>> heappop(a)
5
>>> heappop(a)
12

文档说:

要创建堆,使用初始化为[]的列表,或者您可以通过heapify()函数将已填充的列表转换为堆。

由于在第一个代码块中没有这样做,因此您的列表不是堆。

heappush,heappop,heappushpop,heapreplace等函数维护堆不变性。但这意味着在调用之前,列表应该是堆。只有这样才能保证列表在调用后仍然是堆。

这些方法具有O(logn)的时间复杂度,因此它们不可能从任何随机列表中生成堆。heapify的时间复杂度为0 (n)。堆的强大之处在于,一旦你建立了它,你就可以利用有效的方法来处理它,而不必再次调用更昂贵的heapify

最新更新