从python heapq学习heap常用操作

9 篇文章 0 订阅
7 篇文章 0 订阅

面试刷题,heap是最经常用到的数据结构。今天从python heapq来大体讲讲这个数据结构的好处。作为一个笼统的概念,这个数据结构呢,partially sorted,所以要是弄个最大/最小值的话比sorted list/array要快一些;但由于并不是完全sorted,所以维持这个性质是由开销的。下面就来分析一下python heapq的接口heapq — Heap queue algorithm — Python 3.11.0 documentation 来看看这个数据结构的操作和使用。

heapq.heappush(heap, item): 基本操作,Olog(n)

heapq.heappop(heap): 基本操作,Olog(n)

heapq.heappushpop, heapq.heapreplace(heap, item): 这两个API其实功能上完全就是push+pop或者pop+push。之所以设置这个接口是因为这两个API其实速度可以和单独地push/pop一样快而不需要两个操作的时间。而且操作可能足够常见:比如LRU_cache中cache到了一定的大小,那么每次有一个新的item,可以直接调用此操作。Olog(n)

heapq.heapify(x):O(n)。这个事情记还是好记的,要是每次调用push的话,是Onlog(n),但Onlog(n)都能得到完全sorted list/array了,所以这个操作实际上是O(n)的。具体上可以bottom up swap,每一个位置的元素只进行一个操作,所以是O(n)的。另外就是这个操作是可以in_place的,heapq的实现也是in_place的。

heapq.merge(*iterables, key=None, reverse=False):可以想象用树实现heap, 那么merge operation只影响其中一个子树的一个pop operation. O(log(n))

heapq.nlargest/nsmallest(k, iterable, key=None): leetcode上也是有这个问题的。nlargest当然可以把整个list都sort一下,但如果k不大的时候,宁可去做k个pop operation。得到O(klog(n))的complexity.

PS: 最后提一下,作为funtional programming实现heap感觉不是很方便啊,这样heap就没有一个attribute记录这个comparator;这样实际编程的时候只能自己去凑现成的comparator (虽然如果只用到nlargest/nsmallest的话可以忽略这个问题)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值