【进阶-队列】优先队列PriorityQueue

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

猜你喜欢

转载自blog.csdn.net/u010859970/article/details/122980900