1. PriorityQueue介绍
1.1 优先队列
1.1.1 原理
最小堆原理
1.1.2 表现形式
-
纯数入队的pq
-
类入队的pq
1.2 比较函数修改
如果入队的是类数据,则需要重新定义小于号,即__lt__()
函数
优先队列,默认是最小堆,即出队列是较小的数据
如果需要使用最大堆,即出队列时先出较大的数据,则反过来定义__lt__()
函数,自身数据大于别人数据
当然也可以定义__gt__()
函数,但是当这两个函数同时定义的时候,默认优先考虑__lt__()
函数的定义
2. 代码实例
这里以类入队列为例实现最大堆和最小堆:
if __name__ == "__main__":
class StateMaxHeap:
def __init__(self, id):
self.id = id
# def __gt__(self, other):
# return self.id > other.id
'''
最大堆,重新定义小于号,自身的数据大于别人的数据(反向)
get操作的时候,先出较大的数据
'''
def __lt__(self, other):
return self.id > other.id
class StateMinHeap:
def __init__(self, id):
self.id = id
# def __gt__(self, other):
# return self.id > other.id
'''
最小堆,重新定义小于号,自身的数据小于别人的数据(正向)
get操作的时候,先出较小的数据
'''
def __lt__(self, other):
return self.id < other.id
s1, s2, s3 = StateMaxHeap(2), StateMaxHeap(4), StateMaxHeap(9)
s_min1, s_min2, s_min3 = StateMinHeap(22), StateMinHeap(44), StateMinHeap(8)
pq = PriorityQueue()
pq.put(s1)
pq.put(s3)
pq.put(s2)
print(pq.get().id)
print(pq.get().id)
print(pq.get().id)
# 9 4 2
pq.put(s_min1)
pq.put(s_min2)
pq.put(s_min3)
print(pq.get_nowait().id)
print(pq.get_nowait().id)
print(pq.get_nowait().id)
# 44 22 8