参考链接: Python中的堆队列(Heap queue或heapq)

python中 堆heapq以及 队列queue的使用

1. 堆heapq的使用

## ------------------------ 准备数据 -----------------------

import math

from io import StringIO

data = [19,9,4,10,11]

def show_tree(tree, total_width=36, fill=' '):

output = StringIO()

last_row = -1

for i, n in enumerate(tree):

if i:

row = int(math.floor(math.log(i+1, 2)))

else:

row = 0

if row != last_row:

output.write('\n')

columns = 2 ** row

col_width = int(math.floor(total_width / columns))

output.write(str(n).center(col_width, fill)) # Python center() 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。

last_row = row

print(output.getvalue())

print('-' * total_width)

print()

## ---------------------------- 1. 创建堆 ------------------------

# 创建堆有两种基本方式: heapq.heappush() 和 heapq.heapify()

# 1. heapq.heappush()

import heapq # 最小堆

heap = []

print('random : ', data)

print()

for n in data:

print('add {:>3}:'.format(n))

heapq.heappush(heap, n)

show_tree(heap)

# 如果数据已经在内存中,那么使用heapify()原地重新组织列表中的元素会更高效

# 2. heapq.heapify() heapify:堆化

import heapq

print('random     :', data)

heapq.heapify(data)

print('heapified :')

show_tree(data)

"""

## ------------------- 2.1 删除元素 --------------------------

for i in range(2):

smallest = heapq.heappop(data)

print('pop     {}:'.format(smallest))

show_tree(data)

"""

## ------------------- 2.2 删除并替换新值 --------------------

for n in [0, 13]:

smallest = heapq.heapreplace(data, n)

print('replace {:>2} with {:>2}:'.format(smallest, n) )

show_tree(data)

## ------------------- 3. 查找最大和最小k个数 -------------

# heapq.nlargest() 和 heapq.nsmallest()

import heapq

print()

data = [19,9,4,10,11]

heapq.heapify(data)

print('heaptree: ')

show_tree(data)

print('all         :', data, '\n')

print('3 largest :', heapq.nlargest(3, data))

print('from sort :', list(reversed(sorted(data)[-3:])), '\n')

print('3 smallest:', heapq.nsmallest(3, data))

print('from sort :', sorted(data)[:3])

## ------------------- 4. 高效合并有序序列 ------------------

# 对于小数据集,将多个有序序列合并到一个新序列很容易:

import heapq

import itertools

print()

data = [19,9,4,10,11]

heapq.heapify(data)

print('heaptree: ')

show_tree(data)

data2 = list(sorted(itertools.chain(data+data))) # chain()中可以放多个迭代对象,然后一一迭代出来

print('combined tree: ')

show_tree(data2)

# 对于较大的数据集, 这个技术可能会占用大量内存, merge()不是对整个合并后的序列排序,

# 而是使用一个堆一次一个元素地生成一个新序列,利用固定大小的内存确定下一个元素

import random

import heapq

random.seed(2020)

data = []

for i in range(4):

new_data = list(random.sample(range(1,101), 5))

new_data.sort()

data.append(new_data)

for i,d in enumerate(data):

print('{}: {}'.format(i, d))

print('\nMerged:')

for i in heapq.merge(*data):

print(i, end=' ')

print()

2. queue的使用

from queue import Queue,LifoQueue,PriorityQueue

# 先进先出队列

q=Queue()

# 后进先出队列 (通常与栈数据结构关联的)

lq=LifoQueue(maxsize=6)

# 优先级队列

pq=PriorityQueue(maxsize=5)

for i in range(5):

q.put(i) # 使用 put()将元素增加到序列的一端

lq.put(i)

pq.put(i)

print ("先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full()))

print ("后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()))

print ("优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full()))

print(q.get(),lq.get(),pq.get()) # 使用 get() 从另一端取出(删除)

print ("先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full()))

print ("后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()))

print ("优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full()))

[转载] python中 堆heapq以及 队列queue的使用相关推荐

  1. python之堆heapq模块

    python之堆heapq模块 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆. ...

  2. python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)

    今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...

  3. Python中的四种队列(queue)、堆(heap)

    Python中提供了四种内置的队列实现,特别地其中的优先级队列可以用来实现堆.此外,在Python中我们也直接使用堆.熟练掌握这些数据结构,在问题求解时可以大大简化代码的实现.文末将结合一道Leetc ...

  4. 多线程中的应用之队列(queue)

    队列queue 多应用在多线程中,对于多线程访问共享变量时,队列queue是线程安全的. 从queue队列的实现来看,队列使用了1个线程互斥锁(pthread.Lock()),以及3个条件标量(pth ...

  5. python队列怎么用_如何在Python中使用多处理队列? - python

    我很难理解多处理队列如何在python上工作以及如何实现它.假设我有两个python模块,它们从共享文件中访问数据,我们将这两个模块称为writer和Reader.我的计划是让读取器和写入器都将请求放 ...

  6. [转载] python中list与string的转换

    参考链接: Python 字符串string中的isupper,islower,lower,upper 1.list转string 命令:''.join(list) 其中,引号中是字符之间的分割符,如 ...

  7. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  8. [转载] python中的for循环对象和循环退出

    参考链接: Python中循环 流程控制-if条件 判断条件,1位true,0是flesh,成立时true,不成立flesh,not取反 if  1; print 'hello python' pri ...

  9. [转载] Python中的memoryview

    参考链接: Python memoryview() Python中的memoryview提供了类似C语言指针的功能,有了memoryview,如果某个Object支持buffer protocol,那 ...

最新文章

  1. apache的keepalive和keepalivetimeout(apache优化)
  2. Quartz的Scheduler初始化源码分析
  3. Ubuntu 14.04 安装小企鹅输入法 Fcitx
  4. leetcode 54. Spiral Matrix | 54. 螺旋矩阵(Java)
  5. 使用Eclipse创建一个Android程序方法
  6. 无人机官方网站_用上5G和无人机,你家高楼也可以做 体检
  7. 查看代码 index.html,Javascript查看大图功能代码实现
  8. Jenkins Kubernetes 如何协同工作
  9. IntelliJ IDEA 2018.2设置背景图片及透明度
  10. iPhone不送充电器?工信部发话了
  11. 28. PHP 文件上传
  12. 如何使用segy数据绘制地震剖面
  13. 有关电影《邪不压正》和姜文系列
  14. LeCo-88.合并两个有序数组
  15. LiveGBS国标GB/T28181视频流媒体平台云端录像配置开启关闭支持录像计划根据计划自动录制
  16. 简历解析步骤(第二步)技术与实现(5)识文字,做分类:身高、体重
  17. Android之viewPager嵌套viewPager无法滑动子viewPager
  18. 掌上通计算机一级考试在线安装,计算机一级掌上通
  19. 销客多后台分佣发放,提现申请 批量微信付款操异常
  20. 微信支付成功,如何刷新用户当前页面的余额

热门文章

  1. 关于WindowsPE的DIY和黑科技
  2. 【NOIP1999】【Luogu1015】回文数(高精度,模拟)
  3. java中实现方法重载怎么声明_java 接口中如何声明类似于重载的方法?
  4. hdu 4496 并查集
  5. java url压缩_URL短地址压缩算法 微博短地址原理解析 (Java实现)
  6. 找出不是两个数组共有的元素_06.数组(练习篇)
  7. 用java编写一个学生类
  8. LuaForUnity6:Lua模块
  9. 块状树(bzoj 3720: Gty的妹子树)
  10. 高斯滤波详解 python实现高斯滤波