首页 > 编程语言 >python的十大数据结构之堆队列heapq(heap queue)

python的十大数据结构之堆队列heapq(heap queue)

时间:2024-01-31 23:15:17浏览次数:28  
标签:heapq 之堆 python lists item heap print array

  heap queque(堆队列),是一个完全二叉树,并且满足一个条件:每个节点(叶节点除外)的值都大于等于(或小于等于)它的子节点。提供了构建小顶堆的方法和一些小顶堆的基本操作方法(如入堆、出堆等),可以用于实现堆排序算法。

创建堆的两种方法:

import heapq

lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
#一、 创建空列表,然后使用heappush将数据添加到空列表中,每添加一个新数据后,该列表都满足小顶堆特性。 heap = [] for i in lists: heapq.heappush(heap, i)
print("lists: ",lists) print("heap: ",heap)
# 二、使用heapify直接将数据列表调整为小顶堆格式 heapq.heapify(lists) print("The lists after heap is : ",lists)

注:小顶堆含义,每个节点(叶节点除外)的值都小于等于其子节点的值,根节点的值是所有节点中最小的。大顶堆反之。

使用heapq进行堆排序:

import heapq

lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
# 这里需要先构建堆,否则直接heappop得不到排序后的结果 heap = [] for i in lists: heapq.heappush(heap, i) print(heap[0])
# heappop(heap),依次取出堆顶的值,并将剩余的数据构造成新的小顶堆 heap_sort = [heapq.heappop(heap) for _ in range(len(heap))] print("heap sort result: ", heap_sort)

获取堆中的最大值和最小值

import heapq

lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
# 这里的heapq.heapify(lists)写与不写效果一样
heapq.heapify(lists)
# heapq.nlargest和heapq.nsmallest两个函数可以用于堆,也可以用于列表,功能相同。所以前面无需构造堆 print(heapq.nlargest(2, lists)) print(heapq.nsmallest(3, lists))

堆中元素的替换方法

import heapq

# 这里演示heappushpop和heapreplace的用法
# heappushpop,先入堆再出堆,所以堆元素不变化
array_c = [10, 7, 15, 8]
heapq.heapify(array_c)
print("before: ",array_c)
# 先push再pop
item = heapq.heappushpop(array_c, 5)
print("after: ",array_c)
print(item)

# heapreplace,先出堆,再将新元素入堆,堆元素发生变化
array_d = [10, 7, 15, 8]
heapq.heapify(array_d)
print("before: ",array_d)
item = heapq.heapreplace(array_d, 5)
print("after: ",array_d)
print(item)

堆的方法:

heapq.heapify(x):创建堆,将list转化为堆

heapq.heappush(heap, item): 添加新元素到堆

heapq.heappop(heap):弹出堆顶元素,并将剩余元素组成新的小顶堆

heap.heappushpop(heap, item):先将item入堆,再将item出堆

heapq.merge(*iterables, key = None, reverse = False):暂未了解

heapq.heapreplace(heap, item):先弹出堆顶元素,再将item入堆

heapq.nlargest(n, iterable, key = None)

heapq.nsmallest(n, iterable, key = None)

标签:heapq,之堆,python,lists,item,heap,print,array
From: https://www.cnblogs.com/mastershun/p/18000318

相关文章

  • python中不同类型文件的读取方法
    在进行卷积神经网络的学习过程中,碰到了不同类型的数据集加载,下面总结一下:1、文本文件:CSV、TSV、Json、Txt1.1、简介CSV文件是逗号分隔值(Comma-SeparatedValues,CSV),其文件以纯文本形式存储表格数据(数字和文本);TSV是Tab-separatedvalues的缩写,即制表符分隔值,与csv和txt都同属......
  • 龙蜥8.6 源码安装python3.12
    ​ 闲来无事用虚拟机安装了一下龙蜥系统。[root@localhosthome]#cat/etc/*release*AnolisOSrelease8.6NAME="AnolisOS"VERSION="8.6"ID="anolis"ID_LIKE="rhelfedoracentos"VERSION_ID="8.6"PLATFORM_ID="platform:an......
  • python 语法
    >>>list=["a","b","c"]>>>printlist  #python2.x的print语句['a','b','c']>>>from__future__importprint_function #导入__future__包>>>printlist......
  • python学习
    函数python的特性之一:函数可以有多个返回值defdivide_exact(n,d):  returnn//d,n%d>>>a,b=divide_exact(2013,10)>>>a>>>201>>>b>>>3在定义函数时可以给参数默认值,也就是如果参数没有一个与其绑定的值,那么它就会跟默认值绑定。defdivide_exact(n,d=1......
  • Python 机器学习 K-近邻算法 常用距离度量方法
    ​K-近邻(K-NearestNeighbors,KNN)算法中,选择合适的距离度量是非常重要的,因为它决定了如何计算数据点之间的“相似性”。不同的距离度量可能会导致不同的KNN模型性能。选择哪种距离度量取决于数据的类型和问题的性质。可以通过交叉验证来比较不同距离度量对模型性能的影响,以选择最......
  • Python命令行参数的解析
    通常,我们运行Python项目或者脚本采用直接执行脚本的方式,但是Python作为一个脚本语言,在Linux中经常会结合Shell脚本使用,这个时候执行的Python脚本多半需要使用命令行参数传入一些变量,以更加灵活、动态地传递一些数据。例如,运行命令: pythonargv.py123其中12......
  • python多版本
    1、分别下载并安装两个版本的python2、去安装的文件夹中将python.exe和pythonw.exe改名加上版本号3、将python.exe文件目录和当前目录下的Scripts目录都加到用户环境变量中去重新安装pip注:若遇到Scripts文件夹中没有pip,则在cmd中运行python39-mensurepip(python39是修改p......
  • Python 语言的类型提示系统
    Python语言的类型提示系统PEP484Python语言的类型提示系统是一种在代码中添加类型信息的机制,它允许开发者在变量、函数参数和返回值等地方添加类型注解。这种类型提示系统是通过PEP484中引入的,从Python3.5版本开始,它提供了以下主要特征:类型注解语法:使用冒号(:)来指定......
  • 详解Python TimedRotatingFileHandler 多进程环境下的问题和解决方法
    详解PythonTimedRotatingFileHandler多进程环境下的问题和解决方法在Python的日志处理模块中,TimedRotatingFileHandler是一个非常有用的类,它可以按时间对日志文件进行轮换。然而,在多进程环境下,TimedRotatingFileHandler可能会出现一些问题。本文将详细介绍这些问题以及可能的解决......
  • 用 Python 实现ChatGPT OpenAI(直接上源码)
    网上一大堆教程,好多讲的很墨迹,你需要折腾半天才能调试通,up这里给大家直接上源码干货。详细教程后面补充,着急使用的可以直接拿走调试说明到openai里面替换你自己的app_keyhttps://platform.openai.com/登录账号登录之后,点击右上角“Personal”,展开菜单,找到“ViewAP......