python - heapify 和 heappush 有什么区别?哪个更好?
问题描述
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
只需要是一个列表。请注意,在您的示例中,在执行三个命令H
之前,您的数据结构不是堆。heappush
(例如,H
开头为[21,1,45,78,3,5]
,但第一项21
大于第二项1
,这违反了堆的定义。)因此,命令H
之后也不是堆。heappush
(H
变为[-100, -98, 21, -1, 3, 5, 45, 78, 1]
but 第 3 项21
大于第 6 项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
可能会更好。
推荐阅读
- python - 如何从字典列表创建数据框
- c++ - 如何在 nlohmann::json 文件 C++ 中擦除项目内的项目
- mockito - 为什么 mockito.when(jsonObjectSpy.put(...)).thenThrow(...),它实际上改变了 jsonObjectSpy
- npm - 纱线测试因 jasmine-ts yargs 依赖而失败
- excel - 如果一个单元格已填充而另一个单元格错误,则为条件格式
- coq - 在 Coq 中,@ 符号是什么意思——尤其是在 Gallina 术语的上下文中?
- flask - 使用 Flask-Login 限制对 Google AppEngine 上静态文件的访问
- java - ArrayList 的 collect() 上的 java.lang.ClassCastException
- javascript - 如何使用静态托管创建动态链接?
- c# - 使用 Unity 和 Photon PUN,有没有办法在运行时使用 SetTile() 同步更改对瓷砖地图的更改?