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]
答案 0 :(得分:0)
heappush
和heapify
之间存在多个差异。
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
之后,则5
和21
项目已交换位置,因此H
是正确的堆。heappush
向堆添加新值。 heapify
不会添加值,而是会重新排列列表中的值。heappush
来构建一个堆,或者可以以任何顺序列出项目列表,然后在列表上调用heapify
。 heappush
方法将具有时间复杂度O(n * log(n)),其中n
是堆的结束大小,而heapify
方法将具有复杂度O(n),明显更低。例如,如果要创建一百万个项目的堆,则heappush
方法最多可以使用20,000,000
个操作的顺序,而heapify
方法最多只能使用一个。 1,000,000
个操作的顺序。这是20
差异的一个因素。当然,操作并不完全相同,实际数量也有所不同,因此实际因素会有所不同,但是heapify
几乎可以肯定会更快。heappush
方法需要许多单独的语句或某种循环来添加项。 heapify
方法仅要求列表存在。因此,heapify
方法很可能会使用更少的代码行和更少的代码复杂度。 (在代码中添加for
循环会增加另一级别的复杂性,这可能会导致更多错误。)最后,在列表上进行heapify
几乎总是比创建空列表并使用heappush
添加许多项目更好的选择。如果仅添加一些项目,heappush
可能会更好。