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

yizhihongxing

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日

相关文章

  • js脚本加载失败问题解决办法

    JS脚本加载失败问题解决办法 在网站开发过程中,JS脚本的加载失败是一个常见的问题。这会导致网站功能无法正常运行,对用户的使用体验造成极大的影响。本文将介绍解决JS脚本加载失败的几种方法。 1. 检查JS脚本路径 JS脚本加载失败最常见的原因是路径错误。当网页引入JS脚本时,需要指定JS文件所在的路径。如果路径错误,浏览器就找不到该文件,自然加载失败。因此,…

    other 2023年6月25日
    00
  • Flutter中http请求抓包的完美解决方案

    下面我来为您详细讲解”Flutter中http请求抓包的完美解决方案”。 背景 在开发Flutter应用时,我们经常需要进行网络请求。然而在调试过程中,有时候我们需要通过抓包来检查请求的数据是否准确。而Flutter并没有提供类似于Charles、Fiddler等工具,用来进行网络抓包。因此为了解决这个问题,我们需要寻找一种解决方案。 解决方案 Flutte…

    other 2023年6月26日
    00
  • linux下安装rzsz

    Linux下安装rzsz rzsz 是 Linux 中一种用于进行文件传输的工具,它可以通过串口或 Telnet 等方式与其他设备进行通信,并传输文件。本文主要介绍如何在 Linux 系统中安装 rzsz 工具。 安装 rzsz 打开终端,使用以下命令更新软件包列表: sudo apt-get update 如果您使用的是不同的 Linux 发行版,请使用该…

    其他 2023年3月28日
    00
  • Swift 指针底层探索分析

    Swift 指针底层探索分析攻略 1. 什么是指针? 指针是一种变量,它存储了内存地址。通过指针,我们可以直接访问和修改内存中的数据。在 Swift 中,指针的使用相对较少,但在某些情况下,使用指针可以提供更高效的内存访问和操作。 2. Swift 中的指针类型 在 Swift 中,有两种主要的指针类型:UnsafePointer 和 UnsafeMutab…

    other 2023年8月2日
    00
  • word文档打开速度慢的几个原因和解决方法

    接下来我将详细讲解“word文档打开速度慢的几个原因和解决方法”的完整攻略,内容包含以下方面: 原因 在解决问题之前,首先需要了解一下它发生的原因,这样才能有针对性地解决问题。下面是word文档打开速度慢的几个原因: 1.文档过大 如果文档的大小超过几MB,那么打开文档的时间就会明显增加,尤其是对于低配置的计算机或者运行较慢的软件,打开时间甚至会超过几分钟。…

    other 2023年6月27日
    00
  • 关于go:在golang中为struct字段指定默认值

    以下是关于在Golang中为struct字段指定默认值的完整攻略,包括基本知识和两个示例。 基本知识 在Golang中,可以为struct字段指定默认值。这样,在创建struct实例时,如果没有为该字段指定值,则会使用默认值。在Golang中为struct字段指定默认值需要以下步骤: 在struct定义中为字段指定默认值 创建struct实例时,如果没有为该…

    other 2023年5月7日
    00
  • umask函数

    umask函数 在UNIX和类UNIX系统中,umask函数是用于设置进程的文件创建权限掩码的函数。当进程创建一个新文件或目录时,文件的权限掩码会应用于该文件,并从文件的权限中减去相应的位。这项技术确保了一个默认的安全级别,以防止新创建的文件对于其他用户或进程可见或访问。 umask的语法和参数 umask函数的语法如下: mode_t umask(mode…

    其他 2023年3月29日
    00
  • 正则表达式匹配IP的表达式(推荐)

    当匹配IP地址时,可以使用正则表达式来进行模式匹配。下面是一个推荐的正则表达式来匹配IP地址的表达式: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ 这个正则表达式的含义如下: ^ 表示匹配字符串的开头。 (?:25[0…

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