python计算最大优先级队列实例

Python实现最大优先级队列的方式

1. 定义优先级队列

我们可以通过以下方式定义一个优先级队列:

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

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

    def size(self):
        return len(self.items)

    def enqueue(self, item, priority):
        # 优先级高的在队首,优先级相同时,先插入的在前面
        index = 0
        for i, (p, _) in enumerate(self.items):
            if priority >= p:
                index = i+1
            else:
                break
        self.items.insert(index, (priority, item))

    def dequeue(self):
        return self.items.pop()[1]

    def peek(self):
        return self.items[-1][1]

    def __str__(self):
        return str(self.items)

在以上代码中,

  • __init__ 方法初始化了一个空列表用于存储队列元素;
  • is_empty 方法检查队列是否为空;
  • size 方法返回队列长度;
  • enqueue 方法接收两个参数,一个是元素,一个是优先级,按照优先级高低插入队列;
  • dequeue 方法弹出队列中优先级最高的元素;
  • peek 方法返回队列中优先级最高的元素,但是不弹出;
  • __str__ 方法将队列转成字符串输出。

2. 示例说明

2.1 一般情况

q = PriorityQueue()
q.enqueue('C', 5)
q.enqueue('A', 10)
q.enqueue('B', 7)
print(q) # 输出 [(10, 'A'), (7, 'B'), (5, 'C')]
print(q.dequeue()) # 输出 A
print(q.peek()) # 输出 B
print(q) # 输出 [(7, 'B'), (5, 'C')]

以上代码首先初始化一个新的优先级队列 q,然后按照优先级高低依次插入三个元素。调用 enqueue 方法之后,队列中的元素顺序是:A、B、C。然后依次调用 dequeuepeek 方法获取队列中优先级最高的元素,得到 A 和 B。最后打印队列时,元素顺序变成了 B、C。

2.2 优先级相同时

q = PriorityQueue()
q.enqueue('C', 5)
q.enqueue('A', 5)
q.enqueue('B', 5)
print(q) # 输出 [(5, 'C'), (5, 'A'), (5, 'B')]
print(q.dequeue()) # 输出 C
print(q.peek()) # 输出 A
print(q) # 输出 [(5, 'A'), (5, 'B')]

以上代码同样初始化一个新的优先级队列 q,然后插入三个优先级相等的元素。队列中的元素顺序是:C、A、B,因为插入顺序的先后。然后依次调用 dequeuepeek 方法获取队列中优先级最高的元素,得到 C 和 A。最后打印队列时,元素顺序变成了 A、B。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python计算最大优先级队列实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java Spring循环依赖原理与bean的生命周期图文案例详解

    Java Spring是一套开源的JavaEE框架,它的核心是IoC(控制反转)和AOP(面向切面编程)。在Spring中,循环依赖是一个比较重要的概念,本文将详细讲解Java Spring循环依赖原理与bean的生命周期。 什么是循环依赖 在Spring容器中,当Bean A依赖于Bean B,并且Bean B又依赖于Bean A时,我们就称这种情况为循环…

    other 2023年6月27日
    00
  • Android使用Handler实现定时器与倒计时器功能

    下面是使用Handler实现定时器和倒计时器的攻略: 一、基本原理 在Android中,我们可以使用Handler和TimerTask分别实现定时器和倒计时器功能。其中,Handler是Android中非常常用的线程通信工具,TimerTask则是Java中的一个计时器任务。 实现过程大体分为以下几步: 定义一个Handler对象或自定义Handler类; …

    other 2023年6月27日
    00
  • Android自定义格式显示Button的布局思路

    Android自定义格式显示Button的布局思路攻略 在Android中,我们可以通过自定义布局来实现对Button的格式显示进行个性化定制。下面是一个详细的攻略,包含了两个示例说明。 步骤一:创建自定义布局文件 首先,我们需要创建一个自定义的布局文件,用于定义Button的显示格式。可以使用XML来描述布局的结构和样式。 示例代码: <!– cu…

    other 2023年8月26日
    00
  • SpringBoot 配置文件加密的步骤

    SpringBoot 配置文件加密可以保护敏感的配置信息,比如数据库密码等,防止被恶意获取。下面是一些可能用到的步骤。 安装 JCE JCE(Java Cryptography Extension)是Java加密扩展的缩写,如果你需要使用高强度加密算法,比如AES,那么需要下载安装对应的JCE版本。在Oracle官网下载后,将jar包解压到 $JAVA_HO…

    other 2023年6月25日
    00
  • SpringBoot整合Spring Boot Admin实现服务监控的方法

    SpringBoot整合Spring Boot Admin实现服务监控的方法 Spring Boot Admin是一个用于监控和管理Spring Boot应用程序的开源工具。它提供了一个用户友好的Web界面,可以实时监控应用程序的运行状态、健康状况、日志等信息。下面是整合Spring Boot Admin实现服务监控的详细攻略。 步骤一:添加依赖 首先,在你…

    other 2023年7月27日
    00
  • C++实现中缀表达式转后缀表达式

    C++实现中缀表达式转后缀表达式攻略 中缀表达式是我们通常使用的数学表达式,例如2 + 3 * 4。而后缀表达式(也称为逆波兰表达式)是一种将操作符放在操作数之后的表达式,例如2 3 4 * +。在C++中,我们可以使用栈(stack)数据结构来实现中缀表达式转后缀表达式的算法。 以下是实现中缀表达式转后缀表达式的完整攻略: 步骤1:创建一个空栈和一个空字符…

    other 2023年8月5日
    00
  • C/C++实现segy文件的读取详解

    C/C++实现segy文件的读取详解 背景知识 SEGY文件是地震勘探中的一种数据格式,常用于地震波形数据的存储、传输和处理。SEGY文件的数据结构是按二进制格式排列的,因此需要用二进制读写的方式进行操作。 读取SEGY文件的过程 打开SEGY文件 可以使用C/C++中标准的文件操作函数fopen()打开SEGY文件,此函数返回一个文件指针(FILE *fp…

    other 2023年6月26日
    00
  • Mysql InnoDB引擎中的数据页结构详解

    那么让我们通过以下步骤详细讲解Mysql InnoDB引擎中数据页结构的攻略: 1. 什么是InnoDB引擎中的数据页? InnoDB是Mysql的一种存储引擎,用于存储和管理数据库中的数据。而这些数据则通过数据页的形式保存在Mysql数据文件(如 .ibd 文件)中。因此,我们可以把数据页看做是InnoDB数据文件中的最小单位,每一页的大小默认为16KB。…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部