python分配 使最大的最小_python3中的heapq模块使用

###heapq-堆排序算法

heapq实现了一个适合与Python的列表一起使用的最小堆排序算法。

二叉树

树中每个节点至多有两个子节点

满二叉树

树中除了叶子节点,每个节点都有两个子节点

什么是完全二叉树

在满足满二叉树的性质后,最后一层的叶子节点均需在最左边

什么是堆?

堆是一种数据结构,它是一颗完全二叉树。最小堆则是在堆的基础增加了新的规则,它的根结点的值是最小的,而且它的任意结点的父结点的值都小于或者等于其左右结点的值。因为二进制堆可以使用有组织的列表或数组来表示,所以元素N的子元素位于位置2 * N + 1和2 * N + 2。这种布局使重新安排堆成为可能,因此在添加或删除项时不需要重新分配那么多内存 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙;而栈像一个直立垃圾桶,一列下来。 ####最大堆 最大堆确保父堆大于或等于它的两个子堆。 ####最小堆 最小堆要求父堆小于或等于其子堆。Python的heapq模块实现了一个最小堆。

###创建一个堆 示例代码:

heapq_heapdata.py

# This data was generated with the random module.

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

堆输出使用heapq showtree.py打印。

heapq_showtree.py

import math

from io import StringIO

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

"""Pretty-print a tree."""

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))

last_row = row

print(output.getvalue())

print('-' * total_width)

print()

这里有两种方案创建一个堆,一种是使用heappush(),一种是使用heapify()。 ####heappush

heapq_heappush.py

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

heap = []

print('random :', data)

print()

for n in data:

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

heapq.heappush(heap, n)

show_tree(heap)

使用heappush()时,当从数据源添加新项时,将维护元素的堆排序顺序。

python3 heapq_heappush.py

random : [19, 9, 4, 10, 11]

add 19:

19

------------------------------------

add 9:

9

19

------------------------------------

add 4:

4

19 9

------------------------------------

add 10:

4

10 9

19

------------------------------------

add 11:

4

10 9

19 11

------------------------------------

如果数据已经在内存中,那么使用heapify()重新排列列表中的项会更有效。 ####heapify

heapq_heapify.py

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

print('random :', data)

heapq.heapify(data)

print('heapified :')

show_tree(data)

按照堆顺序每次构建一项列表的结果与构建无序列表然后调用heapify()相同。

$ python3 heapq_heapify.py

random : [19, 9, 4, 10, 11]

heapified :

4

9 19

10 11

------------------------------------

###访问堆的内容 使用heappop()弹出并返回堆中的最小项,保持堆不变。如果堆是空的,则引发IndexError。

heapq_heappop.py

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

print('random :', data)

heapq.heapify(data)

print('heapified :')

show_tree(data)

print()

for i in range(2):

smallest = heapq.heappop(data)

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

show_tree(data)

在本例中,使用heapify()和heappop()用于对数字列表进行排序。

$ python3 heapq_heappop.py

random : [19, 9, 4, 10, 11]

heapified :

4

9 19

10 11

------------------------------------

pop 4:

9

10 19

11

------------------------------------

pop 9:

10

11 19

------------------------------------

要删除现有元素并用单个操作中的新值替换它们,请使用heapreplace()。 ####heapreplace

heapq_heapreplace.py

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

heapq.heapify(data)

print('start:')

show_tree(data)

for n in [0, 13]:

smallest = heapq.heapreplace(data, n)

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

show_tree(data)

替换适当的元素可以维护固定大小的堆,比如按优先级排序的作业队列。

$ python3 heapq_heapreplace.py

start:

4

9 19

10 11

------------------------------------

replace 4 with 0:

0

9 19

10 11

------------------------------------

replace 0 with 13:

9

10 19

13 11

------------------------------------

###堆中的数据极端值 heapq还包含两个函数,用于检查一个迭代器,并找到它所包含的最大或最小值的范围。

heapq_extremes.py

import heapq

from heapq_heapdata import data

print('all :', data)

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

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

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

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

使用nlargest()和nsmallest()仅对n> 1的相对较小的值有效,但在少数情况下仍然可以派上用场。

$ python3 heapq_extremes.py

all : [19, 9, 4, 10, 11]

3 largest : [19, 11, 10]

from sort : [19, 11, 10]

3 smallest: [4, 9, 10]

from sort : [4, 9, 10]

###有效地合并排序Sequences 对于小数据集来说,将几个排序的序列组合成一个新的序列是很容易的。

list(sorted(itertools.chain(*data)))

对于较大的数据集,这种技术可以使用相当大的内存。merge()不是对整个组合序列进行排序,而是使用堆每次生成一个新序列中的一个项,并使用固定数量的内存确定下一个项。

heapq_merge.py

import heapq

import random

random.seed(2016)

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()

因为merge()的实现使用堆,所以它根据要合并的序列的数量而不是这些序列中的项的数量来消耗内存。

$ python3 heapq_merge.py

0: [33, 58, 71, 88, 95]

1: [10, 11, 17, 38, 91]

2: [13, 18, 39, 61, 63]

3: [20, 27, 31, 42, 45]

Merged:

10 11 13 17 18 20 27 31 33 38 39 42 45 58 61 63 71 88 91 95

上面是小根堆的相关操作。python的heapq不支持大根堆,在stackoverflow上看到了一个巧妙的实现:我们还是用小根堆来进行逻辑操作,在做push的时候,我们把最大数的相反数存进去,那么它的相反数就是最小数,仍然是堆顶元素,在访问堆顶的时候,再对它取反,就获取到了最大数。思路很是巧妙。下面是实现代码

class BigHeap:

def init(self):

self.arr = list()

def heap_insert(self, val):

heapq.heappush(self.arr, -val)

def heapify(self):

heapq.heapify(self.arr)

def heap_pop(self):

return -heapq.heappop(self.arr)

def get_top(self):

if not self.arr:

return

return -self.arr[0]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeblocks如何让输出结果 空格_简单讲讲如何实现两个正整数相加,然后输出这个结果...

首先吧,两个整数123 456,相加得到579,我们就得输出579,这个很容易操作,但是如果是:1212161596156198115645646886148461554 2671232162176217624372497590415915915029125 呢?long ? long lo…

C语言和其他高级语言的最大的区别是什么?

提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字…

python3 web服务器_python3 简单web服务器

补充:tcp长连接和短连接长连接:客户端向服务器发起连接请求,服务器接收到请求回应给客户端,双方完成三次握手,然后客户端发送消息,服务端回应消息,每一次完成读写操作,套接字不不关闭…

零基础学C语言必备书籍,抖音编程达人推荐(进群交流学习互动)

C语言从入门到进阶的书籍推荐。 【基础】 这本谭浩强写的【C语言程序设计】可谓是广大人事的入门书籍。我曾经用的教材就是这本,里面大概涵盖了 C语言 语法的 80% 。一个很适合自学的入门书。 【c prime puls】 是 C语言 最经典的入门书籍,极力推荐。每…

网站如何进行渠道跟踪_网站如何进行搜索引擎优化?

这是一个很一般的平台标题,没有任何吸引力,但是它真的可以被一个很好的基层站长估计的很少,我问一个做了多年基层站长的朋友,我说如何做好搜索引擎优化的SEO,他给我的答案很难,答案太大了,所以我…

axure 图片切换图片的交互_AxureRP8中实现伸缩式的图片展示交互效果

上午的时候,在一个群里看到这样的实现需求。伸伸缩缩,感觉很爽的样子。那么,这样的一个交互效果如何实现呢?详细的教程我就不写了,直接上交互截图和源文件就好了。好多操作步骤是吧?实际上,只需…

什么是编程语言,大神教你为什么要学C语言?

首先来说说编程语言这个概念。 编程,其实就是让计算机听懂自己的话,让计算机帮自己想干的事情。编程语言,就是让你能够和计算机进行交流的一种语言。说白了就是让你的软件按你的命令干活。 打比方说,我们经常在僵尸片里面看到&a…

xshell vim 不能粘贴_linux基础知识:vim(vi)的知识

### vim三种模式命令行模式:在该模式下不能对文本进行- 直接编辑,可以输入一些操作(删除行,复制行,移动光标,粘贴)【打开之后默认进入的模式】编辑模式:在该模式下可以对文件内容进行编辑末行模式&#xff…

新手如何学习C语言/C++,教你一年时间是拿到年薪50万

最近会有一些初中高中大学的同学问,C语言C不知道怎么学习不会写代码怎么办?大致上都是一些类似的问题吧,回想一下自己走过的路,反复的了很久思考然后写了这篇文章,希望可以对一些迷惘新手小白程序员同学一丝帮助&#…

html横线标记_html中横线怎么写代码

html代码中:如何输入一条长长的横线呀? 用input页面标签 并将下Border设为直线 input[type="text"]{border-bottom:solid 1px #ccc;} html代码中:如何输入一条长长的横线? 你可以用div标签去实现: 横线中间有字 【html5与html的区别】 html通常指的是用来写网页的…

pycharm导入模块不智能显示_Pycharm自动导入模块小技巧

原标题:Pycharm自动导入模块小技巧作者 | 刘志军来源 | Python之禅如果能把工具熟练运用,往往能达到事半功倍的效果,Pycharm 是很多Python开发者的首选IDE,提供各种快捷键、重构功能、调试技巧等,Python是动态语言&…

mac adb 找不到设备_win/Mac办公软件下载找不到资源?试试这三个强大的神器

大家好,我们在办公时,office、wps等办公软件是我们必须用到的,还有一些专业软件:CAD、PS、PROE、UG、SolidWorks、keyshot、VRay、3DsMax、Labview、Maya、AE、AI、ANSYS等也是各行各业的专业人员工作时必不可少的,但是…

C语言入门经验:零基础如何学习C语言?

工作中,接触过很多想到学习c语言而又没有一点计算机基础的人。经常有人问”我没有一点基础,该怎么入门c语言啊”。看过很多初学者久久摸不到门路,每到这个时候,脑海中总会浮现一个问题:学习c语言真的就那么难吗? 不难…

手机1像素线粗_关于移动端一像素线的解决方案

为什么会有一像素线这个问题因为移动端布局我们大家都知道根据不同的手机会有不同的dpr 例如 爱疯6plus就是3 爱疯6就是2 当我们定义1px的时候就会在不同手机里面显示不同的粗细长度,dpr为3的时候就是3px,dpr为2的时候就是2px,具体dpr是什么…

20天掌握C语言,C语言零基础到项目实战,玩转C语言

一般来说,和其他编程语言相比,C/C语言学起来会比较累,如果想达到项目开发的状态,更是需要花费很长时间的努力。那么,如何才能更好地把所学知识用到实际工作中去呢?今天小编就带大家来看看学习C/C语言到什么…

32岁了学python来的及吗_现在27岁学python来得及吗?

答案是肯定的,27岁学习Python语言是来得及的。 学习Python语言是当前一个比较好的选择,原因有以下几点: 第一,Python语言有健全的生态。Python语言虽然在最近几年被广泛关注,但是Python语言并不是一个新出现的语言&…

怎样快速画出一个正方体_小学数学非常有效的“画图”解题法,快速解题的“金钥匙”...

小学阶段的数学主要培养的是孩子的逻辑思维能力,是从形象思维逐步过度到抽象思维的过程,如果在小学阶段没有将基础打牢,那么等孩子上初中后面对更复杂的学习内容,就会变得更吃力。在小学数学中,“画图”是帮助孩子建立…

零基础入门C语言,只需2小时轻松学会!

学好C语言的秘诀就是1234:“一字真言,两种态度,三个框架,四项注意”。 如有小伙伴想自学,可以进群731871503进行交流 学习,提升编程,共同进步 一、一字真言 各位看官,学好C语言&a…

python调用百度地图画轨迹图_[宜配屋]听图阁

如题,先上效果图:主要分为两大步骤 使用python语句,通过百度地图API,对已知的地名抓取经纬度 使用百度地图API官网的html例程,修改数据部分,实现呈现效果 一、使用python语句,通过百度地图API&a…

select 移动端 第一个无法选中_总结在移动端碰到的坑

一、安卓设备的select options的坑,尽量使用各浏览器内核都支持的api在添加 OPTION 元素时如果需要向指定索引前插入 OPTION,可以使用 options.add(option, index);如果需要向 SELECT 尾部添加 OPTION,可以使用 options.add(optio…