Python heapify和heappush的区别是什么?哪个更好?
heapify和heapush将最小项目放在顶部,并且最低项目位于正确的位置。我不明白有什么区别和用法的区别Python heapify和heappush的区别是什么?哪个更好?,python,heap,Python,Heap,heapify和heapush将最小项目放在顶部,并且最低项目位于正确的位置。我不明白有什么区别和用法的区别 import heapq H = [21,1,45,78,3,5] # Covert to a heap # Add element heapq.heappush(H,-100) heapq.heappush(H,-98) heapq.heappush(H,-1) print(H) heapq.heapify(H) print(H) # output: [-100, -98, 2
import heapq
H = [21,1,45,78,3,5]
# Covert to a heap
# Add element
heapq.heappush(H,-100)
heapq.heappush(H,-98)
heapq.heappush(H,-1)
print(H)
heapq.heapify(H)
print(H)
# output: [-100, -98, 21, -1, 3, 5, 45, 78, 1]
# [-100, -98, 5, -1, 3, 21, 45, 78, 1]
heappush
和heapify
之间存在多重差异
heappush
假设数组(H
在您的例子中)已经是一个堆heapify
不--H
只需要是一个列表。请注意,在您的示例中,在执行三个heappush
命令之前,数据结构H
不是堆。(例如,H
以[21,1,45,78,3,5]
开头,但第一项21
大于第二项1
,这违反了堆的定义。)因此,H
也不是heappush
命令之后的堆。(H
变为[-100,-98,21,-1,3,5,45,78,1]
,但第三项21
大于第六项5
,这也违反了堆的定义。)heapify
之后,5
和21
项已交换位置,因此H
是正确的堆heappush
向堆中添加新值heapify
不会添加值——它会重新排列列表中的值heappush
来构建一个堆,或者您可以按任意顺序创建一个项目列表,然后在列表上调用heapify
。heappush
方法的时间复杂度为O(n*log(n)),其中n
是堆的结束大小,而heapify
方法的复杂度为O(n),大大降低。例如,如果要创建包含一百万个项目的堆,heappush
方法最多可以使用20000000
操作,而heapify
方法最多只能使用1000000
操作。这是一个差异系数20
。当然,这些操作并不完全相同,实际的数字也略有不同,因此实际的因子会有所不同,但是heapify
几乎肯定会更快heappush
方法需要许多单独的语句或某种循环来添加项。heapify
方法只要求列表存在。因此,heapify
方法很可能使用更少的代码行和更少的代码复杂性。(将for
循环添加到代码中会增加另一个级别的复杂性,这可能会导致更多错误。)总之,在列表上执行
heapify
几乎总是比创建空列表并使用heappush
添加许多项更好的选择。如果您只添加一些项目,heappush
可能会更好。谢谢Rory。很好的解释。不过,我对复杂性有点困惑。O(log(n))是否不小于O(n)?那么heappush有多慢?@Atarnew:哎呀,我打错了。应该是O(n*log(n))。我刚刚纠正了。谢谢Rory。回答得好。