【发布时间】:2022-01-17 03:14:34
【问题描述】:
所以,我想将列表的最大元素减半 k 次。
我用 heapq 实现了它,在将所有内容乘以 -1 后,得到一个最小堆。
def minStoneSum(self, piles: List[int], k: int) -> int:
h = [-el for el in piles]
heapq.heapify(h)
for i in range(k):
# version 1
newmax = min(h) >> 1
heapq.heapreplace(h, newmax)
# version 2
# newmax = heapq.heappop(h) >> 1
# heapq.heappush(h, newmax)
...
一开始我是用max()获取第一个项目,heapreplace,因为根据the documentation,他们更快:
heapq.heapreplace(heap, item)
... 这一步操作比 heappop() 后跟 heappush() 更有效,并且在使用固定大小的堆时更合适。
heapq.nsmallest(n, iterable, key=None)
... 另外,当 n==1 时,使用内置的 min() 和 max() 函数效率更高
但是,当我使用较大的初始列表和 k 运行它时,它需要很长时间(超过 30 秒),而当我使用 heappop 和 heappush() 运行版本时,它运行得非常快。
heapreplace 真的比 heappop 和 heappush 慢吗?还是我做错了什么?
【问题讨论】:
标签: python performance heap