【轻松掌握数据结构】优先级队列
优先级队列堆文章目录优先级队列堆前言一、堆Heap是什么二、堆的存储方式三、堆的创建四、堆的插入和删除1.堆的插入2.堆的删除五、接口介绍六、如何改为大堆六、一些题总结前言大家好啊相信大家在前面的学习中都了解了队列的概念及其基本用法那么优先级队列和他又有什么关系呢试想一下当你在沙漠中行走时天上先是掉了个馅饼再是掉了瓶水。如果像队列一样遵循先进先出FIFO的原则先pop馅饼,再pop水那就出会出现“馅饼谋杀案”这太严重了这时候数据结构提供的“优先级队列”就很不错~ 他会返回最高优先级对象并在能新添元素的基础上对优先级重新进行排序。高级吧现在让我们进入本章的学习一、堆Heap是什么先声明这不是挂羊头卖狗肉那为什么会提到“堆”呢因为优先队列是抽象数据类型没有具体代码水果而堆是最主流的底层实现苹果。现在有⼀个关键码的集合K {52013}把它的所有元素按完全二叉树的顺序存储存储在一个一维数组中根节点除外任何一个节点都小于其父亲节点也就是根节点最大的叫大根堆反之叫小根堆。堆的性质堆中某个节点的值总是不大于或不小于其父节点的值堆总是⼀棵完全二叉树。另外堆也就是Heap这个单词要记住选择题有哦~二、堆的存储方式从堆的概念可知堆是一棵完全二叉树因此可以层序的规则采用顺序方式来高效存储。为啥完全二叉树顺序存储高效捏解答对于非完全二叉树为了能够还原二叉树空间中必须要存储空节点就会导致空间利用率比较低。就像一个节点没有左孩子但是有右孩子那么在存节点的时候就需要在相应位置加null嘿这不就浪费了个空间将元素存储到数组中后可以根据⼆叉树的性质来对其进行还原。假设i为节点在数组中的下标则有如果i为0则i表示的节点为根节点否则i节点的双亲节点为 (i - 1)/2如果2 * i 1 小于节点个数则节点i的左孩子下标为2 * i 1否则没有左孩子如果2 * i 2 小于节点个数则节点i的右孩子下标为2 * i 2否则没有右孩子三、堆的创建这里以小根堆为例对于集合{991110122334}中的数据如何和创建堆看图不难发现根的左子树和右子树都满足小根堆的性质只有根本身这一节点不满足现在让我们移动它让parent标记需要调整的节点再用刚刚讲到的公式来得出他左右孩子下标▪ 发现左右孩子都存在及都size找到最小的孩子并标记为child▪ 只有左孩子那child为左孩子▪ 没孩子程序结束将parent与child比较如果▪ parent小于child调整结束▪ 否则交换parent与child即parent childchild parent*21; 交换完成之后parent继续因为可能还是不满足堆的性质需要继续向下调整重复从2开始的操作。代码实现publicvoidshiftDown(int[]array,intparent){// child先标记parent的左孩⼦因为parent可能右左没有右intchild2*parent1;intsizearray.length;while(childsize){// 如果右孩⼦存在找到左右孩⼦中较⼩的孩⼦,⽤child进⾏标记if(child1sizearray[child1]array[child]){child1;}// 如果双亲⽐其最⼩的孩⼦还⼩说明该结构已经满⾜堆的特性了if(array[parent]array[child]){break;}else{// 将双亲与较⼩的孩⼦交换inttarray[parent];array[parent]array[child];array[child]t;// parent中⼤的元素往下移动可能会造成⼦树不满⾜堆的性质因此需要继续向下调整 parentchild;childparent*21;}}}注意在调整以parent为根的二叉树时必须要满足parent的左子树和右子树已经是堆了才可以向下调整。四、堆的插入和删除1.堆的插入堆的插入总共需要两个步骤先将元素放入到底层空间中(注意空间不够时需要扩容)将最后新插入的节点向上调整直到满足堆的性质时间复杂度为O(nlogn)2.堆的删除注意堆的删除⼀定删除的是堆顶元素。具体如下将堆顶元素对堆中最后⼀个元素交换将堆中有效数据个数减少⼀个对堆顶元素进行向下调整时间复杂度为O(logn)到此为止堆的一系列知识点已经罗列完毕问题来了这东西好用是好用可在日常写代码的时候难道还需要我们自己来实现吗当然不是啦有现成的它来了此处有掌声五、接口介绍Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列PriorityQueue是线程不安全的PriorityBlockingQueue是线程安全的本文主要介绍PriorityQueue安全就是多线程同时改同一个变量不会乱数据 线程安全会错乱 线程不安全。注意事项PriorityQueue中放置的元素必须要能够比较大小不能插入无法比较大小的数据否则会抛出ClassCastException异常不能插入null对象否则会抛出NullPointerException可以插入任意多个元素其内部可以自动扩容PriorityQueue底层使用了堆数据结构PriorityQueue默认情况下是小堆——即每次获取到的元素都是最小的元素构造器功能介绍PriorityQueue()创建一个空的优先级队列默认容量为11PriorityQueue(i)创建一个初始容量为i的优先级队列但i不能1否则抛异常PriorityQueue(collection? extends Ec)用一个集合来创建优先级队列一些常用方法~函数名功能介绍boolean offer(E e)插入元素e插入成功返回true如果e对象为空抛出NullPointerException异常时间复杂度注意空间不够时候会进行扩容Epeek()获取优先级最高的元素如果优先级队列为空,返回nullE poll()移除优先级最高的元素并返回如果优先级队列为空返回nullint size()获取有效元素的个数void clear()清空boolean isEmpty()检测优先级队列是否为空空返回true六、如何改为大堆在前面我们了解到PriorityQueue默认情况下是小堆那么当我们需要大堆地时候就只能妥协了吗当然不燃起来自制比较器classCmpimplementsComparatorInteger{publicintcompare(Intergero1,Intergero2){returno2-o1;}}publicclassHello{publicstaticvoidmain(String[]args){PriorityQueueIntegerpnewPriorityQueue(newCmp());p.offer(5);p.offer(2);p.offer(0);p.offer(1);p.offer(3);System.out.println(p.peek());}}2.弄个compareTopublicclassStudent{intage;publicStudent(intage){this.ageage;}overridepublicintcompareTo(Studento){returno.age-this.age;}overridepublicStringtoString(){returnStudent{ageage};}}publicclassHello{publicstaticvoidmain(String[]args){PriorityQueueStudenttemnewPriorityQueue() tem.offer(newStudent(10));tem.offer(newStudent(20);System.out.println(tem.peek());}}来个小彩蛋猜猜这两段代码输出什么结尾公布六、一些题OK经历九九八十一难我们终于到了这一关马上就能取得真经让我们来实操一下~最小k个数总结以上就是我们今天要讲的内容啦~主要有堆的概念、创建、插入与删除以及PriorityQueue的实现和应用还有如何把小堆改成大堆还是很重要的。那今天就到先这里啦我们下期再见祝大家好梦彩蛋公布520

相关新闻

【声调标注系统】APP正式上线!

【声调标注系统】APP正式上线!

告别语音标注混乱,一键精准标记声调,效率翻倍! ✅ 支持声调智能识别 ✅ 界面简洁,操作零门槛 ✅ 适用于教学、科研、内容创作 📲 立即下载体验: 🔗 APK安装包: http://203.2.160.23:…

2026/7/22 8:21:10 阅读更多 →
FPD-Link III I2C多主控设计:DS90UB947-Q1寄存器配置与实战指南

FPD-Link III I2C多主控设计:DS90UB947-Q1寄存器配置与实战指南

1. 项目概述与核心挑战在汽车摄像头、高级驾驶辅助系统(ADAS)以及多屏显示系统中,FPD-Link III技术因其高带宽、长距离传输和强大的抗干扰能力而成为主流选择。DS90UB947-Q1作为该技术栈中的核心串行器(Serializer)&am…

2026/7/22 8:05:30 阅读更多 →
在keil中新增文件

在keil中新增文件

一.移植模块1.复制要的模块到文件夹下面2.Hardware-添加已经存在的文件3.Keil编译出错:No such file or directory解决方法:1.点击魔术棒二.新增文件点击新增文件然后编译一下

2026/7/22 8:01:06 阅读更多 →

最新新闻

区块链助记词原理与安全存储实战指南

区块链助记词原理与安全存储实战指南

1. 助记词:数字资产的终极防线第一次接触助记词时,我犯了个低级错误——把12个单词记在手机备忘录里。直到某天手机丢失,我才真正理解"助记词是你的数字资产终极钥匙"这句话的分量。助记词不是普通的密码,它是区块链世界…

2026/7/23 2:37:16 阅读更多 →
从月均个位数咨询到133条/月!某三坐标公司的百度SEM逆袭全记录

从月均个位数咨询到133条/月!某三坐标公司的百度SEM逆袭全记录

在实现月均133个高质量咨询​的亮眼成绩之前,这家专注于三坐标测量仪与尼康三坐标的精密机械企业,曾深陷线上推广的泥潭。其困境是许多工业品企业的缩影。 🔍 困境剖析:钱花了,线索呢? 在启动SEM推广初期&a…

2026/7/23 2:37:16 阅读更多 →
Maestro 移动 UI 自动化测试入门教程

Maestro 移动 UI 自动化测试入门教程

Maestro 移动 UI 自动化测试入门教程 本文带你从零开始掌握 Maestro —— 一款开源的跨平台移动 UI 自动化测试框架。涵盖安装配置、YAML 测试流编写、核心命令、选择器、高级用法及实战案例,让你 10 分钟写出第一条自动化测试。 一、Maestro 是什么? M…

2026/7/23 2:37:16 阅读更多 →
智能降维在量化交易中的应用:解决高维数据过拟合问题

智能降维在量化交易中的应用:解决高维数据过拟合问题

在金融科技和人工智能的交汇点上,量化投资正经历一场深刻的变革。很多人以为量化交易就是写几个策略、跑回测、然后自动化执行,但真正的挑战往往隐藏在数据维度爆炸和模型过拟合的陷阱里。Alex Wang作为业内资深专家,近期提出的“智能降维”理…

2026/7/23 2:37:15 阅读更多 →
TI EMAC/MDIO中断管理实战:从寄存器到驱动避坑指南

TI EMAC/MDIO中断管理实战:从寄存器到驱动避坑指南

1. 从寄存器手册到实战:理解EMAC/MDIO中断管理的核心逻辑搞嵌入式网络驱动,尤其是像TI这种大厂的复杂外设,最头疼的往往不是写数据收发流程,而是把那一大本寄存器手册里的中断机制给整明白。手册里每个比特位都给你列得清清楚楚&a…

2026/7/23 2:37:15 阅读更多 →
不会写代码的人,终于迎来了属于自己的开发时代

不会写代码的人,终于迎来了属于自己的开发时代

每次参加各种科技大会,我都会留意会场里的一个特殊区域:那里没有炫目的舞台,没有重量级嘉宾,也没有热闹的抽奖,却总能吸引很多人的目光。这就是黑客松(Hackathon)现场。这些年,无论是…

2026/7/23 2:36:15 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻