heapify和heappush有什么区别?哪个更好?

时间:2019-06-19 18:30:58

标签: 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, 21, -1, 3, 5, 45, 78, 1]
# [-100, -98, 5, -1, 3, 21, 45, 78, 1]

1 个答案:

答案 0 :(得分:0)

heappushheapify之间存在多个差异。

  1. heappush假定数组(在您的情况下为H)已经是堆。 heapify并非-H仅需要是一个列表。请注意,在您的示例中,执行三个H命令之前,数据结构heappush不是堆。 (例如,H[21,1,45,78,3,5]开头,但是第一项21大于第二项1,这违反了堆的定义。)结果,H也不是heappush命令之后的堆。 (H变为[-100, -98, 21, -1, 3, 5, 45, 78, 1],但第三项21大于第六项5,这也违反了堆的定义。)在heapify之后,则521项目已交换位置,因此H是正确的堆。
  2. heappush向堆添加新值。 heapify不会添加值,而是会重新排列列表中的值。
  3. 您可以通过创建一个空堆然后为要添加的每个项目调用heappush来构建一个堆,或者可以以任何顺序列出项目列表,然后在列表上调用heapifyheappush方法将具有时间复杂度O(n * log(n)),其中n是堆的结束大小,而heapify方法将具有复杂度O(n),明显更低。例如,如果要创建一百万个项目的堆,则heappush方法最多可以使用20,000,000个操作的顺序,而heapify方法最多只能使用一个。 1,000,000个操作的顺序。这是20差异的一个因素。当然,操作并不完全相同,实际数量也有所不同,因此实际因素会有所不同,但是heapify几乎可以肯定会更快。
  4. 构建堆的heappush方法需要许多单独的语句或某种循环来添加项。 heapify方法仅要求列表存在。因此,heapify方法很可能会使用更少的代码行和更少的代码复杂度。 (在代码中添加for循环会增加另一级别的复杂性,这可能会导致更多错误。)

最后,在列表上进行heapify几乎总是比创建空列表并使用heappush添加许多项目更好的选择。如果仅添加一些项目,heappush可能会更好。

相关问题