heapq.heappushpop如何比python中的heappop和heappush更高效

Meh*_*ill 5 heap python-3.x

在 heapq 的文档中,它写道

heapq.heappushpop(堆,项目)

将项目推送到堆上,然后弹出并返回堆中最小的项目。组合操作比 heappush() 后单独调用 heappop() 运行效率更高。

为什么它更有效率?
它的效率也高得多吗?

sou*_*oon 7

  • heappop就是弹出第一个元素,然后将最后一个元素移到第一个位置填充,然后进行下沉操作,通过连续交换将元素向下移动。因此恢复头部
    然后O(logn)
    headpush,将元素放在最后一个位置,然后像冒泡一样heappop但反转
    另一个O(logn)

  • while heappushpop,弹出第一个元素,而不是将最后一个元素移动到顶部,而是将新元素放在顶部,然后做下沉动作。这与 几乎相同的操作heappop
    只有一个O(logn)

如上所述,尽管它们都是O(logn),但很容易看出比那时heappushpop更快。heappopheappush