首页 > 其他分享 >队列-优先级队列

队列-优先级队列

时间:2024-04-13 16:55:54浏览次数:12  
标签:__ pq 优先级 队列 self print

队列-优先级队列

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. 特性:

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

标签:__,pq,优先级,队列,self,print
From: https://www.cnblogs.com/zx-demo/p/18133056

相关文章

  • 数据结构-队列
    数据结构-队列1.定义:队列是一种遵循先进先出(FIFO,FirstInFirstOut)原则的线性数据结构。在队列中,元素从一端添加(队尾),从另一端移除(队头)。classQueue:def__init__(self):self.items=[]主要操作:队列的主要操作包括enqueue(向队尾添加元素)、dequeue(从队头......
  • JDK11下的优先级队列小问题
    优先级队列中存了我自定义的对象,比较规则写好了,存完了之后我去修改堆中对象的值(比较器中写的值),发现堆没有即刻相应调整,导致结果不对但是每次我让堆中出一个,再进一个堆就调整好了暂时不知道什么原因,猜测可能是堆中存对象的话需要改动才会调整。......
  • 【1】消息队列概念
    一、什么是消息队列消息队列中间件,又称为消息队列或者消息中间件,是在消息的传输过程中保存消息的容器。二、消息队列模型JMS规范目前支持两种消息模型:点对点(pointtopoint,queue)和发布/订阅(publish/subscribe,topic)。消息不可重复消费。2.1、点对点模型点对点模式是基于队列......
  • Kafka做消息队列的原理
    Kafka作为消息队列的实现原理主要基于其分布式架构和日志式存储机制。以下是Kafka作为消息队列工作的核心原理:1.分布式架构与分区:Kafka采用分布式架构,将数据分布存储在多个节点(称为Broker)上,以实现数据的水平扩展和并行处理。Kafka中的消息流被组织成主题(Topic),每个主题可以包......
  • 队列 - 双端队列实现
    之前实现的单端队列,只能从队列的尾部进,头部出.但现在我们来实现一种从两端都可进行出队入队的结构,即双端队列deque.在计算机中,双端队列最常用的一个场景是存储一系列的撤销操作.当然用户点击了某个操作,则此操作会被存在一个双端队列中,类似栈里.当用户点击撤销操......
  • 说说你对栈、队列的理解?应用场景?
    一、栈栈(stack)又名堆栈,它是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表表尾这一端被称为栈顶,相反地另一端被称为栈底,向栈顶插入元素被称为进栈、入栈、压栈,从栈顶删除元素又称作出栈所以其按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶......
  • 队列的基本操作
    (一)结构体定义一个顺序队列typedefstruct{chardata[maxsize];intrear,front; }sqQueue;(二)队列的初始化头尾两个指针指向0voidInitQueue(sqQueue*s){ (*s).rear=(*s).front=0;}(三)进队操作 注意循环队列的使用intEnQueue(sqQueue*Q,charx)//入队{ ......
  • 数据结构之队列(java语言版)
    队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO,First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列和出队列。队列的种类也很多,单向队列,双向队列,循......
  • 数据结构之队列(c语言版)
    队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO,First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列和出队列。队列的种类也很多,单向队列,双向队列,循......
  • 双端队列
    这里对做法补充一下首先肯定有两个考虑对象嘛,考虑双端队列或者考虑数值,既然双端队列是不好考虑的(指正着想),那就考虑数值喽(反着想,最终的序列一定是确定的)然后是一个证明,其实我自己的排序方法是一个数一个数看的,对于当前循环到的数,比如处于递减状态,我们考虑这个数所有的下标,把能接......