队列-优先级队列

队列-优先级队列

1. 定义:

优先级队列是一种特殊的队列,其中每个元素都有一定的优先级。元素的出队顺序是根据它们的优先级决定的,而不是它们被加入队列的顺序。高优先级的元素会先于低优先级的元素出队。

2. 实现方式:

优先级队列通常通过堆(特别是二叉堆)来实现,以保证高效的元素插入和删除操作。最小堆用于实现最小优先级队列,而最大堆用于实现最大优先级队列。

import heapq

class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]

# 示例用法
if __name__ == "__main__":
    pq = PriorityQueue()
    pq.push('task1', 5)
    pq.push('task2', 1)
    pq.push('task3', 3)
    pq.push('task4', 7)

    print(pq.pop())  # 输出:task4
    print(pq.pop())  # 输出:task1
    print(pq.pop())  # 输出:task3
    print(pq.pop())  # 输出:task2

3. 操作:

主要操作包括插入(添加元素到优先级队列)、删除(移除优先级最高或最低的元素)和peek(查看优先级最高或最低的元素),以及isEmpty(检查队列是否为空)。

class PriorityQueue:
    def __init__(self):
        self._queue = []

    def push(self, item, priority):
        self._queue.append((priority, item))
        self._queue.sort(reverse=True)  # 根据优先级排序,优先级高的在前面

    def pop(self):
        if self.is_empty():
            raise IndexError("pop from an empty priority queue")
        return self._queue.pop(0)[1]  # 返回优先级最高的元素

    def peek(self):
        if self.is_empty():
            return None
        return self._queue[0][1]  # 返回优先级最高的元素

    def is_empty(self):
        return len(self._queue) == 0

# 示例用法
if __name__ == "__main__":
    pq = PriorityQueue()
    pq.push('task1', 5)
    pq.push('task2', 1)
    pq.push('task3', 3)
    pq.push('task4', 7)

    print(pq.peek())  # 输出:task4
    print(pq.pop())   # 输出:task4

    print(pq.peek())  # 输出:task1
    print(pq.pop())   # 输出:task1

    print(pq.is_empty())  # 输出:False

    print(pq.pop())   # 输出:task3
    print(pq.pop())   # 输出:task2

    print(pq.is_empty())  # 输出:True

4. 应用:

优先级队列在多种场景中有广泛应用,如计算机操作系统中的任务调度、Dijkstra算法中的顶点选择、医院急诊科的病患处理等。

5. 特性:

优先级队列的一个重要特性是其无法保证具有相同优先级的元素的出队顺序。如果多个元素有相同的优先级,它们出队的顺序可能是任意的。

posted @ 2024-04-13 16:43  Rescal_子轩  阅读(2)  评论(0编辑  收藏  举报