Python:优先队列的使用及类的自定义比较函数

Priority_queue模块

该模块定义的优先级队列,其内部使用了 heapq 模块,所以它的时间复杂度和heapq是相同的。

当一个对象的所有元素都是可比较的时,默认情况下是根据队列中的对象的第一个元素进行排序,越小的优先级越高,排在越前面。当第一个元素相同时,依次比较后续的元素的大小来进行排序。

由于 PriorityQueue 是继承自 Queue 类,所以很多函数的用法可以直接参照于 Queue 类中的函数。

from queue import PriorityQueue as PQ
pq = PQ()
pq.put((1, 'a'))
pq.put((2, 'c'))
pq.put((2, 'b'))
pq.put((2, 'b'))
print(pq.queue) # [(1, 'a'), (2, 'b'), (2, 'b'), (2, 'c')]
item0 = pq.get() # (1, 'a')
print(pq.queue) # [(2, 'b'), (2, 'b'), (2, 'c')]

print(pq.qsize()) # 优先队列的尺寸

while not pq.empty():
    print(pq.get())

对于自定义的类使用优先队列,在入队的时候需要根据类的某一属性进行比较。

方法:使用重载方法__lt__,__lt__是python中用于进行特定比较的方法。

 

import queue
class person(object):
    def __init__(self,name,score):
        self.name = name
        self.score = score
    def __lt__(self, other):
        return self.score > other.score
 
 
p1 = person("张三",15)
p2 = person("李四",23)
p3 = person("王五",12)
p4 = person("朱五",32)
que = queue.PriorityQueue()
que.put(p1)
que.put(p2)
que.put(p4)
que.put(p3)
 
print(que.get().name)
print(que.get().name)
print(que.get().name)
print(que.get().name)

其中,__lt__定义了根据score属性进行从大到小的排列。即当PriorityQueue入队一个类实例的时候,会自动根据score属性进行比较。

 这里给出一个例子

 我们需要按照小白鼠的重量从大到小排序,再输出它们的帽子颜色。 


class Node : 
    def __init__(self, w, col) : 
        self.w = w 
        self.col = col 
    def __lt__(self, other) : 
        return self.w > other.w # 按w从大到小排序
        
N = int(input()) 
lst = [] 

for i in range(N) : 
    w, col = input().split()
    lst.append(Node(int(w), col))

lst.sort() # 排序

for i in range(N) : 
    print(lst[i].col)

使用优先队列的写法

from queue import PriorityQueue 

class Node : 
    def __init__(self, w, col) : 
        self.w = w 
        self.col = col 
    def __lt__(self, other) : 
        return self.w > other.w 
        
q = PriorityQueue() 
n = int(input())

for i in range(n) : 
    w, col = input().split() 
    w = int(w)
    q.put(Node(w, col)) 
    
while q.qsize() : 
    print(q.get().col)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UCSD.KS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值