iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python 堆和优先队列的使用
  • 554
分享到

python 堆和优先队列的使用

队列python 2023-01-31 05:01:45 554人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python里面的堆是通过在列表中维护堆的性质实现的。这一点与c++中heap一系列的算法类似,底层是通过堆vector的维护获取堆的性质。 Python堆的部分api,其他API查阅文档python_heap_API和 h

python里面的堆是通过在列表中维护堆的性质实现的。这一点与c++中heap一系列的算法类似,底层是通过堆vector的维护获取堆的性质。
Python堆的部分api,其他API查阅文档python_heap_API和
heapq的源代码

import heapq
#向堆中插入元素,heapq会维护列表heap中的元素保持堆的性质
heapq.heappush(heap, item)
#heapq把列表x转换成堆
heapq.heapify(x)
#从可迭代的迭代器中返回最大的n个数,可以指定比较的key
heapq.nlargest(n, iterable[, key])
#从可迭代的迭代器中返回最小的n个数,可以指定比较的key
heapq.nsmallest(n, iterable[, key])
#从堆中删除元素,返回值是堆中最小或者最大的元素
heapq.heappop(heap)

1.1.内置类型

从上述源代码可以看出来,heapq使用的内置的小于号,或者类的__lt__比较运算来进行比较。

def heapq_int():
    heap = []
    #以堆的形式插入堆
    heapq.heappush(heap,10)
    heapq.heappush(heap,1)
    heapq.heappush(heap,10/2)
    [heapq.heappush(heap,i) for i in  range(10)]
    [heapq.heappush(heap,10 - i) for i in  range(10)]
    #最大的10个元素
    print heapq.nlargest(10,heap)
    #输出所有元素
    print [heapq.heappop(heap) for i in range(len(heap))]

1.2.元组类型

元素会默认调用内置比较函数cmp

def heapq_tuple():
    heap = []
    #向推中插入元组
    heapq.heappush(heap,(10,'ten'))
    heapq.heappush(heap,(1,'one'))
    heapq.heappush(heap,(10/2,'five'))
    while heap:
        print heapq.heappop(heap),
    print

1.2.类类型

类类型,使用的是小于号_lt_,当然没有重写但是有其他的比较函数例如:_le_,_gt_,_cmp_,也是会调用的,和小于号等价的都可以调用(测试了gt),具体的这些操作之间的关系我也没有研究过。如果类里面没有重写_lt_,会调用其他的比较操作符,从源代码可以看出来,如果没有_lt_,那么会调用_ge_函数。
所以可以重写上述的那些函数:

class Skill(object):
    def __init__(self,priority,description):
        self.priority = priority
        self.description = description
    def __lt__(self,other):#operator < 
        return self.priority < other.priority
    def __ge__(self,other):#oprator >=
        return self.priority >= other.priority
    def __le__(self,other):#oprator <=
        return self.priority <= other.priority
    def __cmp__(self,other):
        #call global(builtin) function cmp for int
        return cmp(self.priority,other.priority)
    def __str__(self):
        return '(' + str(self.priority)+',\'' + self.description + '\')'

def heapq_class():
    heap  = []
    heapq.heappush(heap,Skill(5,'proficient'))
    heapq.heappush(heap,Skill(10,'expert'))
    heapq.heappush(heap,Skill(1,'novice'))
    while heap:
        print heapq.heappop(heap),
    print 

所以如果要用到自己定义的类型,可以重写上述函数,就可以使用heapq函数了。

2.PriorityQueue

PriorityQueue的python源代码PriorityQueue
从源代码可以看出来,PriorityQueue使用的就是heapq来实现的,所以可以认为两者算法本质上是一样的。当然PriorityQueue考虑到了线程安全的问题。
下面给出PriorityQueue的部分API和使用方法。
参考Queue

#向队列中添加元素
Queue.put(item[, block[, timeout]])
#从队列中获取元素
Queue.get([block[, timeout]])
#队列判空
Queue.empty()
#队列大小
Queue.qsize()

2.1.内置类型

直接调用内置函数cmp进行比较

try:
    import Queue as Q #python version < 3.0
except ImportError:
    import queue as Q #python3.*
def PriorityQueue_int():
    que = Q.PriorityQueue()
    que.put(10)
    que.put(1)
    que.put(5)
    while not que.empty():
        print que.get(),
    print

2.2.元组类型

def PriorityQueue_tuple():
    que = Q.PriorityQueue()
    que.put((10,'ten'))
    que.put((1,'one'))
    que.put((10/2,'five'))
    while not que.empty():
        print que.get(),
    print

2.2.自定义类型

class Skill(object):
    def __init__(self,priority,description):
        self.priority = priority
        self.description = description
    #下面两个方法重写一个就可以了
    def __lt__(self,other):#operator < 
        return self.priority < other.priority
    def __cmp__(self,other):
        #call global(builtin) function cmp for int
        return cmp(self.priority,other.priority)
    def __str__(self):
        return '(' + str(self.priority)+',\'' + self.description + '\')'

def PriorityQueue_class():
    que = Q.PriorityQueue()
    skill5 = Skill(5,'proficient')
    skill6 = Skill(6,'proficient6')
    que.put(skill6)
    que.put(Skill(5,'proficient'))
    que.put(Skill(10,'expert'))
    que.put(Skill(1,'novice'))
    while not que.empty():
        print que.get(),
    print

其他的一些方法的使用还是需要参考给出的文档的。
最后一点,让我比较奇怪的是(可能我并没有找到),没有提供像排序函数那样,指定比较方法函数,这点和c++有点区别。
这篇文档参考:参考文档

--结束END--

本文标题: python 堆和优先队列的使用

本文链接: https://www.lsjlt.com/news/188217.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python 堆和优先队列的使用
    python里面的堆是通过在列表中维护堆的性质实现的。这一点与C++中heap一系列的算法类似,底层是通过堆vector的维护获取堆的性质。 python堆的部分API,其他API查阅文档python_heap_API和 h...
    99+
    2023-01-31
    队列 python
  • Python中的优先队列(priority queue)和堆(heap)
    目录队列和优先队列(Priority Queue)堆(heap)简介初始化构建堆堆的插入(节点上浮)堆的删除(节点下浮)堆的应用队列和优先队列(Priority Queue) 队列是...
    99+
    2022-11-11
  • Python中的堆和优先队列的使用场景有哪些?
    Python中的堆和优先队列的使用场景有哪些?堆是一种特殊的二叉树结构,常用于高效地维护一个动态的集合。Python中的heapq模块提供了堆的实现,可以方便地进行堆的操作。优先队列也是一种特殊的数据结构,不同于普通的队列,它的每个元素都有...
    99+
    2023-10-28
    使用场景 优先队列
  • C#实现优先队列和堆排序
    目录优先队列1.API2.初级实现3.堆的定义二叉堆表示法4.堆的算法上浮(由下至上的堆的有序化)下沉(由上至下的堆的有序化)改进堆排序1.堆的构造2.下沉排序先下沉后上浮优先队列 ...
    99+
    2022-11-13
  • Python中的堆和优先队列是如何实现的?
    Python中的堆和优先队列是如何实现的?堆和优先队列是在计算机科学中常用的数据结构。在Python中,我们可以使用heapq模块来实现堆和优先队列。堆是一种特殊的完全二叉树,在堆中,每个父节点的值都比它的子节点的值要小(或大),这样的堆被...
    99+
    2023-10-22
    实现 优先队列
  • java利用Heap堆实现PriorityQueue优先队列
    本篇内容介绍了“java利用Heap堆实现PriorityQueue优先队列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先做一个优先队列...
    99+
    2023-06-03
  • Java数据结构之堆(优先队列)的实现
    堆(优先队列)是一种典型的数据结构,其形状是一棵完全二叉树,一般用于求解topk问题。根据双亲节点大于等于孩子节点或双亲节点小于等于孩子节点,可分为大顶堆和小顶堆,本文实现大顶堆。 ...
    99+
    2022-11-13
  • java的优先级队列怎么使用
    Java的优先级队列可以使用`java.util.PriorityQueue`类来实现。下面是一个使用优先级队列的示例:```jav...
    99+
    2023-09-07
    java
  • Java优先级队列怎么使用
    Java中的优先级队列可以使用`java.util.PriorityQueue`类来实现。以下是使用优先级队列的基本步骤:1. 导入...
    99+
    2023-08-08
    Java
  • kafka优先级队列怎么使用
    Kafka没有内置的优先级队列,但可以通过以下方法实现一个简单的优先级队列:1. 使用Kafka的topic作为队列。2. 将消息的...
    99+
    2023-08-08
    kafka
  • java编程实现优先队列的二叉堆代码分享
    这里主要介绍的是优先队列的二叉堆Java实现,代码如下:package practice;import edu.princeton.cs.algs4.StdRandom;public class TestMain { public sta...
    99+
    2023-05-30
    java 算法 二叉堆
  • 详解c++优先队列priority_queue的用法
    既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具...
    99+
    2022-11-12
  • 用Python实现数据结构之优先级队列
    如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构 最简单的优先级队列可能就是一堆不...
    99+
    2023-01-30
    优先级 数据结构 队列
  • C++深入刨析优先级队列priority_queue的使用
    目录一、priority_queue的介绍二、priority_queue的使用三、priority_queue的模拟实现四、容器适配器4.1、什么是适配器4.2、适配模式4.3、S...
    99+
    2022-11-13
    C++ 优先级队列 priority_queue C++ priority_queue
  • 深入了解C++优先队列(priority_queue)的使用方法
    目录优先队列的基本概念优先队列的使用方法优先队列元素的排序规则元素的自定义排序优先队列的时间复杂度总结优先队列的基本概念 在计算机科学中,优先队列是一种抽象数据类型,它与队列相似,但...
    99+
    2023-05-18
    C++优先队列 C++队列
  • Python实现优先级队列结构的方法详解
    最简单的实现 一个队列至少满足2个方法,put和get. 借助最小堆来实现. 这里按"值越大优先级越高"的顺序. #coding=utf-8 from heapq import heappush, h...
    99+
    2022-06-04
    优先级 队列 详解
  • Python中的Deque: 实现高效的队列和堆栈
    Python 中的 deque 是一个低级别的、高度优化的双端队列,对于实现优雅、高效的Pythonic 队列和堆栈很有用,它们是计算中最常见的列表式数据类型。本文中,云朵君将和大家一起学习如下:开始使用deque有效地弹出和追加元素访问d...
    99+
    2023-05-14
    Python 队列
  • Python数据结构之优先级队列queue用法详解
    目录一、基本用法二、LIFO队列三、优先队列一、基本用法 Queue类实现了一个基本的先进先出容器。使用put()将元素增加到这个序列的一端,使用get()从另一端删除。具体代码如下...
    99+
    2022-11-12
  • 华为OD机试 - 支持优先级的队列(Java & JS & Python)
    题目描述 实现一个支持优先级的队列,高优先级先出队列;同优先级时先进先出。 如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。 队列存储的数据内容是一个整数。 输入描述 一组待存入队列的数据 (包含内容和优先级) 输出描述 队...
    99+
    2023-08-31
    华为机试 算法 Java JavaScript Python
  • 在PHP中使用Memcache缓存技术提高优先队列的效率
    随着社会的不断发展,人们对于计算机技术的要求也变得越来越高。在计算机中,队列是一种非常重要的数据结构,能够帮助我们高效地解决很多问题。然而,在实际的应用过程中,队列的效率却往往会受到一些因素的限制,比如网络的延迟、查询数据库的速度等等。所以...
    99+
    2023-05-17
    PHP Memcache 优先队列
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作