Python heapify和heappush的区别是什么?哪个更好?

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

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, 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。回答得好。