python中怎么实现队列的创建(python 堆和优先队列的使用详解)
python中怎么实现队列的创建
python 堆和优先队列的使用详解1.heapq
python里面的堆是通过在列表中维护堆的性质实现的。这一点与C++中heap一系列的算法类似,底层是通过堆vector的维护获取堆的性质。
关于二叉树
二叉树的特点:
二叉树是一种存储数据元素的汇集数据结构。
二叉树最重要的性质就是树的高度和树中可以容纳的最大结点个数之间的关系。树的高度类似于表长,是从根结点到其他结点的最大距离。在长为n的表里只能容纳n个结点,而在高为h的二叉树中则可以容纳大约2^h个结点,这是表和树的最大不同点。
一般的元素插入,如果是按线性顺序排列的,那么操作必然需要O(n)的时间(需要对n个数据进行移位处理),要突破这个限制,必须考虑其他数据结构的组织方式。二叉树就是一种高效插入的存储方式。
堆排序利用的是完全二叉树。
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++有点区别。
这篇文档参考:参考文档
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/liu2012huan/article/details/53264162
- 多个图片拼接python实现(python实现两张图片的像素融合)
- python抽奖代码教程(python实现抽奖小程序)
- ipython命令行查看文件夹(对IPython交互模式下的退出方法详解)
- python字典键对应的值(Python 互换字典的键值对实例)
- python opencv 标记目标(使用Python的OpenCV模块识别滑动验证码的缺口推荐)
- python包和模块管理(python的依赖管理的实现)
- python连接到本地的mysql数据库(Python实现连接MySql数据库及增删改查操作详解)
- pythonfor循环如何遍历嵌套列表(在Python中,不用while和for循环遍历列表的实例)
- 怎么在当前目录调用python库(Python父目录、子目录的相互调用方法)
- python itchat库介绍(Python利用itchat库向好友或者公众号发消息的实例)
- python设置按钮(Python按钮的响应事件详解)
- python列出文件夹下所有文件(python批量修改文件夹及其子文件夹下的文件内容)
- pythonlambda是什么函数(Python之lambda匿名函数及map和filter的用法)
- python操作mysql连接池(详解Python连接MySQL数据库的多种方式)
- python写一个二叉树(Python二叉搜索树与双向链表转换算法示例)
- python怎样看字符unicode编码(Python3中编码与解码之Unicode与bytes的讲解)
- 乔欣古装女主戏获热度 作为女主,却没吃到红利(乔欣古装女主戏获热度)
- 爱情是什么(爱情是什么最经典的话)
- 乔欣 古装剧中的高颜值(古装剧中的高颜值)
- 怎么才可以财富自由(如何让自己实现财富自由)
- 为什么越来越多年轻人回农村(为什么越来越多年轻人回农村生活)
- 怎么快速学好英语(怎么快速学好英语初中)
热门推荐
- html5怎么将字体变为红色(Html5自定义字体解决方法)
- 宝塔nginx配置修改(宝塔面板安装Tengine报错:nginx: [emerg] invalid IPv6 address in resolver)
- 如何保证幂等性(聊聊幂等性如何保证的)
- pythonsvr时序预测(利用Python半自动化生成Nessus报告的方法)
- css语言是干嘛的(Css预编语言及区别详解)
- nginx中https配置(Nginx配置同一个域名同时支持http与https两种方式访问实现)
- linux虚拟内存实现需要哪六种机制(解析Linux高性能网络IO和Reactor模型)
- 微信小程序实现自动定位(微信小程序实现锚点定位功能的方法实例)
- amaze软件(amazeui时间组件的实现示例)
- dedecms内容页模板调用不成功(织梦dedecms循环调用多级子栏目如二级栏目下三级栏目)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9