Python 的标准库 heapq 默认实现的是 小根堆/最小堆,官方文档(heapq)也是这么说的。但是 LeetCode 很多题用到 优先队列/大根堆/最大堆 的时候,Python 只能用 小根堆/最小堆 去实现,有点儿不方便。于是我们就很疑惑啦,为什么 heapq 没有实现 大根堆/最大堆 呢?或者你给个指定 大根堆/最大堆 或是 小根堆/最小堆 的参数也行啊。
嗯,其实 heapq 只是默认实现的是 小根堆/最小堆,不代表它没实现 大根堆/最大堆,如果你只看官方文档,你是看不出来 大根堆/最大堆 的 API 的(因为官方文档只给了 小根堆/最小堆 的 API),这个需要你去看源码 heapq.py ~
好了,以上都是废话,下面进入正题~
| 小根堆/最小堆 | 大根堆/最大堆 |
|---|---|
| heapq.heappush | 无 |
| heapq.heappop | heapq._heappop_max |
| heapq.heapify | heapq._heapify_max |
| heapq.heapreplace | heapq._heapreplace_max |
注:以上 大根堆/最大堆 的 API,我也是今天才发现的,只在 LeetCode 上做了简单测试,而在实际提交中,还没来得及用 ~ 🤣
源码中没有 heappush 对应的 _heappush_max 方法,具体 大根堆/最大堆 怎么用,大家还是自己摸索吧~ 😂
上面 大根堆/最大堆 的 API 是用 Python 实现的,也可以添加如下 import 语句,使用 C 实现的 API ~
from _heapq import _heapify_max as heapify
from _heapq import _heappop_max as heappop
from _heapq import _heapreplace_max as heapreplace