当前位置: 首页 > news >正文

Python学习笔记——heapq

堆排序

思路

堆排序思路是:

  1. 将数组以二叉树的形式分析,令根节点索引值为0,索引值为index的节点,子节点索引值分别为index*2+1、index*2+2;
  2. 对二叉树进行维护,使得每个非叶子节点的值,都大于或者小于其子节点的值,两种分别称为大根堆、小根堆,其中二叉树根节点的值就是数组的最大值或最小值;
  3. 将二叉树根节点取出,维护后的数组最后一个元素移至根节点,再重新进行上述维护;
  4. 循环上述步骤,直到数组所有元素均被取出,则取出的所有元素组成的序列有序,从而实现排序的目的。

代码实例

实现代码如下:

h=list(map(int,input().split()))def heapSort(root):# 本质上,heapSort实现的是,根据小根堆的规则,将二叉树根节点root的值h[root]向下移动,# 直到h[root]到达某处,该处root的两个子节点值均大于h[root]。# 如果root下面两边的子二叉树均符合小根堆,那么处理之后,以root为根节点的二叉树同样符合小根堆。a=root# 节点root的左子结点是root*2+1,右子节点是root*2+2if root*2+1<len(h) and h[a]>h[root*2+1]:a=root*2+1# 如果是,则此时a就是左子节点索引,否,则a仍是根节点索引if root*2+2<len(h) and h[a]>h[root*2+2]:a=root*2+2# 此时a就是root节点以及其两个子节点里面最小值的索引if a!=root:  # a此时是子节点索引值h[a],h[root]=h[root],h[a]   # 保证根节点值最小heapSort(a)  # 从上往下递归处理else:   # 要么,根节点已经是最小的了,要么,根节点没有子节点,不用排序returnfor i in range(len(h)//2,-1,-1):heapSort(i)# 从二叉树的底部开始处理,保证每次处理某个节点时,下面的子二叉树已经符合小根堆。
# print(h)length=len(h)
for _ in range(length):if len(h)!=1:h[0],h[-1]=h[-1],h[0]print(h.pop(),end=" ")heapSort(0)else:print(h.pop(),end=" ")

heapSort函数维护的是小根堆,此时代码输出内容就是列表h中元素从小到大排序的序列。

堆排序实质上很容易获取当前列表中最值,因此,topK问题(输出列表中前K个最大/小值)很适合用堆排序处理。

python内置模块——heapq

常用函数

  • heappush(heap,item):向列表heap中添加元素item,添加时会保证heap仍然是小根堆,时间复杂度为O(log(len(heap)))
  • heapify(heap):以线性时间将列表heap转化为小根堆
  • heappop(heap):从堆heap中弹出并返回最小的值

注意点

1. 如果要建立大根堆,可以考虑所有元素取负值,此时堆本身为小根堆,但我们自己希望的元素存储形式上是大根堆。
2. 调用heappush时,添加的item可以是一个数,此时就是根据item值维护小根堆;但是item也可以是元组,此时维护标准是元组中第0个元素,当不同元组间,前一个元素相同,则参考下一个元素。

代码实例

AcWing:Dijkstra求最短路 II

实例题目中,有向边的数量与节点数量相近,可见,此时该图为稀疏图。Dijkstra算法求最短路中,在获取当前与1号点最短距离的节点时,一般是选择遍历所有节点获取,但是本题的图为稀疏图,且节点数量众多,此时会导致代码获取节点时间复杂度为O(n^{2}),显然时间复杂度过高。

此时换另一个思路:不选择遍历所有节点,而是存储已处理的节点,并且每次直接获取到最短距离的节点。该方式可以联想到小根堆,小根堆堆顶元素刚好可以符合要求。此时即可调用heapq库,使用其中的函数维护小根堆,便能实现本题目标。

代码:

import heapq    #本题需要使用到堆排序n,m=map(int,input().split())
edge=[[] for _ in range(n+1)]   # edge[i][j]=[节点i的第j个邻接有向边指向的节点编号,该边长度]
distance=[1000000000 for _ in range(n+1)] # distance[i]=当前最短通路长度
visited=[False for _ in range(n+1)]
for _ in range(m):a,b,d=map(int,input().split())edge[a].append([b,d])
distance[1]=0
heapDis=[(0,1)]
while len(heapDis):#print(edge[now])dis,now=heapq.heappop(heapDis)if visited[now]:continuevisited[now] = Truefor next, edgeDis in edge[now]:if distance[now]+edgeDis<distance[next]:distance[next]=distance[now]+edgeDisheapq.heappush(heapDis, (distance[next], next))# 总计有m条边,最多会向heapDis中添加m次元素# 每次添加元素,最大时间复杂度为O(logn)# 因此,总的时间复杂度为O(mlogn)if distance[n]>10e9:print(-1)
else:print(distance[n])

相关文章:

Python学习笔记——heapq

堆排序 思路 堆排序思路是&#xff1a; 将数组以二叉树的形式分析&#xff0c;令根节点索引值为0&#xff0c;索引值为index的节点&#xff0c;子节点索引值分别为index*21、index*22&#xff1b;对二叉树进行维护&#xff0c;使得每个非叶子节点的值&#xff0c;都大于或者…...

搜索与图论——拓扑排序

有向图的拓扑排序就是图的宽度优先遍历的一个应用 有向无环图一定存在拓扑序列&#xff08;有向无环图又被称为拓扑图&#xff09;&#xff0c;有向有环图一定不存在拓扑序列。无向图没有拓扑序列。 拓扑序列&#xff1a;将一个图排成拓扑序后&#xff0c;所有的边都是从前指…...

linux CentOS7配置docker的yum源并安装

[TOC](这里写目录标题 配置yum源Docker的自动化安装一些其他启动相关的命令&#xff1a; 配置yum源 使用以下命令下载CentOS官方的yum源文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清除yum缓存 yum clean all 更新yum缓存…...

vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示

由于分辨率不同会导致文本内容显示不全&#xff0c;如下所示&#xff1a; 因此需要 1、悬浮到对应行上出现悬浮信息 实现代码如下所示&#xff1a; 这里只演示Vue3版本代码&#xff0c;Vue2版本不再演示 区别就在插槽使用上Vue3使用&#xff1a;#default“”&#xff1b;Vu…...

汇川PLC学习Day4:电机参数和气缸控制参数

汇川PLC学习Day4&#xff1a;伺服电机参数和气缸控制参数 一、伺服电机参数二、气缸参数1. 输入IO映射&#xff08;1&#xff09;输入IO映射&#xff08;2&#xff09; 输入IO触摸屏标签显示映射 2. 输出IO映射&#xff08;1&#xff09;输出IO映射&#xff08;2&#xff09; …...

数据可视化高级技术Echarts(快速上手柱状图进阶操作)

目录 1.Echarts的配置 2.程序的编码 3.柱状图的实现&#xff08;入门实现&#xff09; 相关属性介绍&#xff08;进阶&#xff09;&#xff1a; 1.标记最大值/最小值 2.标记平均值 3.柱的宽度 4. 横向柱状图 5.colorBy series系列&#xff08;需要构造多组数据才能实现…...

【数据结构与算法】力扣 206. 反转链表

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a; head [1,2,3,4,5] 输出&#xff1a; [5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a; head [1,2] 输出&#xff1a; [2,1]示例 3&#…...

【随笔】Git 高级篇 -- 本地栈式提交 rebase | cherry-pick(十七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…...

数据结构-- 基于顺序表的通讯录代码讲解

我们了解顺序表之后来一个比较简单的小项目来巩固一下. 每一个函数我都进行了详细的补充, 各位可以仔细阅读。我将整个项目分为了Contact.h 、Contact.c和test.c三个文件中&#xff0c;其中Contact.h用于函数声明和结构体创建&#xff0c;Contact.c用于函数的实现&#xff0c;t…...

qt-C++笔记之QLabel加载图片

qt-C笔记之QLabel加载图片 —— 2024-04-06 夜 code review! 文章目录 qt-C笔记之QLabel加载图片0.文件结构1.方法一&#xff1a;把图片放在项目路径下&#xff0c;在 .pro 文件中使用 DISTFILES添加图片文件1.1.运行1.2.qt_test.pro1.3.main.cpp 2.方法二&#xff1a;不在 .pr…...

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习&#xff1a; b.多选框和单选框 练习&#xff1a; 用的是第三种方法 c.输入框和拖动框 练习&#xff1a; 练习二&#xff1a; e.图片绘制和框 练习&#xff1a; 复合控件 a.工具栏和选择网格 练习&#xff1a; b.滚动视…...

GIt 删除某个特定commit

目的 多次commit&#xff0c;想删掉中间的一个/一些commit 操作方法 一句话说明&#xff1a;利用rebase命令的d表示移除commit的功能&#xff0c;来移除特定的commit # 压缩这3次commit,head~3表示从最近1次commit开始&#xff0c;前3个commit git rebase -i head~3rebase…...

Django --静态文件

静态文件 除了由服务器生成的HTML文件外&#xff0c;WEB应用一般需要提供一些其它的必要文件&#xff0c;比如图片文件、JavaScript脚本和CSS样式表等等&#xff0c;用来为用户呈现出一个完整的网页。在Django中&#xff0c;我们将这些文件统称为“静态文件”&#xff0c;因为…...

蓝桥杯第十三届省赛C++B组(未完)

目录 刷题统计 修剪灌木 X进制减法 【前缀和双指针】统计子矩阵 【DP】积木画 【图DFS】扫雷 李白打酒加强版 DFS (通过64%&#xff0c;ACwing 3/11&#xff09;; DFS(AC) DP&#xff08;AC&#xff09; 砍竹子(X) 刷题统计 题目描述 小明决定从下周一开始努力刷题准…...

编程生活day7--明明的随机数、6翻了、吃火锅

明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随机整数&#xff08;N≤100&#xff09;&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同的数…...

css酷炫边框

边框一 .leftClass {background: #000;/* -webkit-animation: twinkling 1s infinite ease-in-out; 1秒钟的开始结束都慢的无限次动画 */ } .leftClass::before {content: "";width: 104%;height: 102%;border-radius: 8px;background-image: linear-gradient(var(…...

使用 Docker 部署 Photopea 在线 PS 工具

1&#xff09;Photopea 介绍 GitHub&#xff1a;https://github.com/photopea/photopea 官方手册&#xff1a;https://www.photopea.com/learn/ Adobe 出品的「PhotoShop」想必大家都很熟悉啦&#xff0c;但是「PhotoShop」现在对电脑配置要求越来越高&#xff0c;体积越来越大…...

回溯法(一)——全排列 全组合 子集问题

全排列问题 数字序列 [ l , r ] [l,r] [l,r]​区间内元素的全排列问题 extern int ans[],l,r,num;//num&#xff1a;方案数 extern bool flag[]; void dfs(int cl){//cl:current left&#xff0c;即为当前递归轮的首元素if(cl r 1){//数组已越界&#xff0c;本轮递归结束for…...

【Pt】马灯贴图绘制过程 04-玻璃脏迹

目录 效果 步骤 一、透明玻璃 二、烟熏痕迹 三、粗糙 四、浮尘 效果 步骤 一、透明玻璃 1. 打开纹理集设置&#xff0c;着色器链接选择“新的着色器链接” 在着色器设置中可以看到此时名称为“Main shader &#xff08;Copy&#xff09;” 这里修改名称为“玻璃” 在…...

Rust 程序设计语言学习——枚举模式匹配

枚举&#xff08;enumerations&#xff09;&#xff0c;也被称作 enums。match 允许我们将一个值与一系列的模式相比较&#xff0c;并根据相匹配的模式执行相应代码。 1 枚举的定义 假设我们要跨省出行&#xff0c;有多种交通工具供选择。常用的交通工具有飞机、火车、汽车和轮…...

鸿蒙一气总论(六)

第六卷 本心人道心性人性一气真解卷首引天地立、万象生、文明兴、文字成&#xff0c; 天地大道在外&#xff0c;人心大道在内。天有天象&#xff0c;地有地理&#xff0c;物有物性&#xff0c; 人有人心&#xff0c;心有人性&#xff0c;神有灵机。全书十六字铁律&#xff1a; …...

老旧电视焕发新生:MyTV-Android开源直播应用完整指南

老旧电视焕发新生&#xff1a;MyTV-Android开源直播应用完整指南 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否还在为家中老旧智能电视无法安装现代直播应用而烦恼&#xff1f;那…...

CANN/ops-nn自适应平均池化3D反向计算

aclnnAdaptiveAvgPool3dBackward 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 &#x1f4c4; 查看源码 产品是否支持Ascend 950PR/Ascend 950DT√…...

【c++面向对象编程】第4篇:类与对象(三):拷贝构造函数与深浅拷贝问题

目录 一、一个崩溃的程序 二、拷贝构造函数是什么&#xff1f; 调用时机&#xff08;三个场景&#xff09; 三、浅拷贝 vs 深拷贝 浅拷贝&#xff08;默认行为&#xff09; 深拷贝&#xff08;正确的做法&#xff09; 四、什么时候必须自己写拷贝构造函数&#xff1f; 一…...

ARM TPIU调试接口原理与应用实践

1. ARM TPIU调试接口深度解析在嵌入式系统开发中&#xff0c;调试接口的设计与实现往往是决定开发效率的关键因素。作为ARM CoreSight调试架构的重要组成部分&#xff0c;Trace Port Interface Unit(TPIU)承担着处理器跟踪数据格式化与输出的核心功能。本文将深入剖析TPIU的寄存…...

文科生被AI替代前,应该主动去碰的一个认证方向

在AI全面渗透职场的当下&#xff0c;文科生想要跳出被动淘汰的困境&#xff0c;无需硬啃编程、算法等硬核理工内容&#xff0c;最优破局方式是依托自身文字、逻辑、共情、场景把控的优势&#xff0c;驾驭AI工具实现能力升级。而目前适配文科生、零门槛、重实操、高认可度的最优…...

告别环境配置噩梦:用Shell脚本一键搞定VCS与Verdi的联调环境

芯片验证工程师的效率革命&#xff1a;Shell脚本全自动构建VCSVerdi联调环境 每次开始新项目都要重复配置验证环境&#xff1f;还在为VCS编译选项和Verdi波形调试的手动操作浪费时间&#xff1f;资深验证工程师的日常&#xff0c;不该被这些重复劳动占据。本文将带你用Shell脚本…...

ARM GICv3中断控制器与ICC_BPR1寄存器详解

1. ARM GICv3中断控制器架构概述在ARM架构的现代处理器中&#xff0c;通用中断控制器(GIC)是管理硬件中断的核心组件。GICv3作为当前主流的版本&#xff0c;相比前代架构进行了多项重要改进&#xff1a;支持更多处理器核心&#xff08;理论上可达128个PE&#xff09;改进的中断…...

CANN/asc-devkit ReduceProd API文档

ReduceProd 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com…...

CANN/ops-nn三维平均池化反向传播算子

AvgPool3DGrad 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产…...