📜  Python的优先队列

📅  最后修改于: 2021-10-28 01:56:15             🧑  作者: Mango

优先级队列是抽象数据结构,其中队列中的每个数据/值都有特定的优先级。例如,在航空公司中,标题为“商务”或“头等舱”的行李比其他行李提前到达。
优先队列是队列的扩展,具有以下属性。
1) 高优先级元素在低优先级元素之前出列。
2) 如果两个元素具有相同的优先级,则按照它们在队列中的顺序进行服务。
优先队列在计算机科学中的各种应用是:
作业调度算法、CPU 和磁盘调度、管理不同进程之间共享的资源等。

优先队列和队列的主要区别:
1)在Queue中,最旧的元素首先出队。而在优先级队列中,基于最高优先级的元素出列。
2)当元素从优先级队列中弹出时,得到的结果要么按升序排序,要么按降序排序。而当元素从一个简单的队列中弹出时,结果中会得到一个数据的 FIFO 顺序。

下面是优先队列的简单实现

# A simple implementation of Priority Queue
# using Queue.
class PriorityQueue(object):
    def __init__(self):
        self.queue = []
  
    def __str__(self):
        return ' '.join([str(i) for i in self.queue])
  
    # for checking if the queue is empty
    def isEmpty(self):
        return len(self.queue) == 0
  
    # for inserting an element in the queue
    def insert(self, data):
        self.queue.append(data)
  
    # for popping an element based on Priority
    def delete(self):
        try:
            max = 0
            for i in range(len(self.queue)):
                if self.queue[i] > self.queue[max]:
                    max = i
            item = self.queue[max]
            del self.queue[max]
            return item
        except IndexError:
            print()
            exit()
  
if __name__ == '__main__':
    myQueue = PriorityQueue()
    myQueue.insert(12)
    myQueue.insert(1)
    myQueue.insert(14)
    myQueue.insert(7)
    print(myQueue)            
    while not myQueue.isEmpty():
        print(myQueue.delete()) 
输出:
12 1 14 7
14
12
7
1

注意上面代码中delete的时间复杂度是O(n)。

更好的实现是使用通常用于实现优先级队列的二叉堆。请注意, Python也在库中提供了heapq

By using heap datastructure to implement Priority Queues, Time complexity:
Insert Operation: O(log(n))
Delete Operation: O(log(n))