Python学习笔记——heapq
堆排序
思路
堆排序思路是:
- 将数组以二叉树的形式分析,令根节点索引值为0,索引值为index的节点,子节点索引值分别为index*2+1、index*2+2;
- 对二叉树进行维护,使得每个非叶子节点的值,都大于或者小于其子节点的值,两种分别称为大根堆、小根堆,其中二叉树根节点的值就是数组的最大值或最小值;
- 将二叉树根节点取出,维护后的数组最后一个元素移至根节点,再重新进行上述维护;
- 循环上述步骤,直到数组所有元素均被取出,则取出的所有元素组成的序列有序,从而实现排序的目的。
代码实例
实现代码如下:
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(),显然时间复杂度过高。
此时换另一个思路:不选择遍历所有节点,而是存储已处理的节点,并且每次直接获取到最短距离的节点。该方式可以联想到小根堆,小根堆堆顶元素刚好可以符合要求。此时即可调用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
堆排序 思路 堆排序思路是: 将数组以二叉树的形式分析,令根节点索引值为0,索引值为index的节点,子节点索引值分别为index*21、index*22;对二叉树进行维护,使得每个非叶子节点的值,都大于或者…...

搜索与图论——拓扑排序
有向图的拓扑排序就是图的宽度优先遍历的一个应用 有向无环图一定存在拓扑序列(有向无环图又被称为拓扑图),有向有环图一定不存在拓扑序列。无向图没有拓扑序列。 拓扑序列:将一个图排成拓扑序后,所有的边都是从前指…...
linux CentOS7配置docker的yum源并安装
[TOC](这里写目录标题 配置yum源Docker的自动化安装一些其他启动相关的命令: 配置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穿梭框更改宽度以及悬浮文本显示
由于分辨率不同会导致文本内容显示不全,如下所示: 因此需要 1、悬浮到对应行上出现悬浮信息 实现代码如下所示: 这里只演示Vue3版本代码,Vue2版本不再演示 区别就在插槽使用上Vue3使用:#default“”;Vu…...

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

数据可视化高级技术Echarts(快速上手柱状图进阶操作)
目录 1.Echarts的配置 2.程序的编码 3.柱状图的实现(入门实现) 相关属性介绍(进阶): 1.标记最大值/最小值 2.标记平均值 3.柱的宽度 4. 横向柱状图 5.colorBy series系列(需要构造多组数据才能实现…...

【数据结构与算法】力扣 206. 反转链表
题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入: head [1,2,3,4,5] 输出: [5,4,3,2,1]示例 2: 输入: head [1,2] 输出: [2,1]示例 3&#…...

【随笔】Git 高级篇 -- 本地栈式提交 rebase | cherry-pick(十七)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...
数据结构-- 基于顺序表的通讯录代码讲解
我们了解顺序表之后来一个比较简单的小项目来巩固一下. 每一个函数我都进行了详细的补充, 各位可以仔细阅读。我将整个项目分为了Contact.h 、Contact.c和test.c三个文件中,其中Contact.h用于函数声明和结构体创建,Contact.c用于函数的实现,t…...

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

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

GIt 删除某个特定commit
目的 多次commit,想删掉中间的一个/一些commit 操作方法 一句话说明:利用rebase命令的d表示移除commit的功能,来移除特定的commit # 压缩这3次commit,head~3表示从最近1次commit开始,前3个commit git rebase -i head~3rebase…...
Django --静态文件
静态文件 除了由服务器生成的HTML文件外,WEB应用一般需要提供一些其它的必要文件,比如图片文件、JavaScript脚本和CSS样式表等等,用来为用户呈现出一个完整的网页。在Django中,我们将这些文件统称为“静态文件”,因为…...

蓝桥杯第十三届省赛C++B组(未完)
目录 刷题统计 修剪灌木 X进制减法 【前缀和双指针】统计子矩阵 【DP】积木画 【图DFS】扫雷 李白打酒加强版 DFS (通过64%,ACwing 3/11); DFS(AC) DP(AC) 砍竹子(X) 刷题统计 题目描述 小明决定从下周一开始努力刷题准…...
编程生活day7--明明的随机数、6翻了、吃火锅
明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数…...

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)Photopea 介绍 GitHub:https://github.com/photopea/photopea 官方手册:https://www.photopea.com/learn/ Adobe 出品的「PhotoShop」想必大家都很熟悉啦,但是「PhotoShop」现在对电脑配置要求越来越高,体积越来越大…...

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

【Pt】马灯贴图绘制过程 04-玻璃脏迹
目录 效果 步骤 一、透明玻璃 二、烟熏痕迹 三、粗糙 四、浮尘 效果 步骤 一、透明玻璃 1. 打开纹理集设置,着色器链接选择“新的着色器链接” 在着色器设置中可以看到此时名称为“Main shader (Copy)” 这里修改名称为“玻璃” 在…...

Rust 程序设计语言学习——枚举模式匹配
枚举(enumerations),也被称作 enums。match 允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。 1 枚举的定义 假设我们要跨省出行,有多种交通工具供选择。常用的交通工具有飞机、火车、汽车和轮…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...