Python中的堆和优先队列

本文介绍了Python中的heapq模块和queue.PriorityQueue类,详细讲解了它们的功能和使用方法,包括heappush、heappop和heapify操作。在解决LeetCode的top-K问题时,如215和347,可以利用heapq实现优先队列,注意Python的heapq是小顶堆,若需大顶堆需通过负数处理。文章还提供了相关问题的解题思路。
摘要由CSDN通过智能技术生成
分别是heapq和queue.PriorityQueue这两个模块
import heapq        

from queue import PriorityQueue as PQ
PriorityQueue模块定义如下所示:
class PriorityQueue(Queue):
    '''Variant of Queue that retrieves open entries in priority order (lowest first).

    Entries are typically tuples of the form:  (priority number, data).
    '''

    def _init(self, maxsize):
        self.queue = []

    def _qsize(self):
        return len(self.queue)

    def _put(self, item):
        heappush(self.queue, item)

    def _get(self):
        return heappop(self.queue)
他含有一个属性queue,输出队列中每个元素,三个方法,分别是qsize(),代表优先级队列中元素个数,put(),用heappush()方法将元素放入队列,get(),用heappop()方法将元素从队列取出。注意这个库在解答leetcode相关问题时(比如top-K问题,leetcode-215,347等)不能用。
例子如下
from queue import PriorityQueue as PQ
pq = PQ()
pq.put((-2, 'c'))
pq.put((-3, 'b'))
pq.put((-4,'a'))
pq.queue # output: [(-4, 'a'), (-2, 'c'), (-3, 'b')]
#只能是最小堆,所以按照元素从小到大(如果元素是list或者tuple,那么以第一个元素的顺序)的顺序出队
pq.get() # output: (-4, 'a')
#每当堆首元素出队后,剩下的元素又会重新排成堆
pq.get() #output: [(-3, 'b'), (-2, 'c')]
pq.get() # output: (-3,'b')
pq.get() # output: (-2,'c')
#最后结果为空
pq.queue # output:[]
heappush模块代码如下,功能:将item添加到当前最小堆最后,并再恢复成最小堆(只是把元素插到堆尾再调整,之前已经是堆了,现在只有最后一个元素可能不满足堆得要求,调整也只会沿着一条路径自底向上,时间复杂度
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值