第一个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
。