算法基础 -- 小根堆构建的两种方式:上浮法与下沉法
小根堆构建的两种方式:上浮法与下沉法
在构建小根堆(Min-Heap)时,通常有两种常见的构建方式:
- 上浮建堆(逐个插入,上浮调整)
- 下沉建堆(Heapify 自底向上,下沉调整)
这两种方法在时间复杂度上有显著差异。
一、上浮建小根堆:逐个插入 + 上浮调整
1. 核心原理:
-
对于给定的无序数组,逐个插入到堆中。
-
每次插入新元素时,将其放在堆的最后一个位置(末尾),然后执行“上浮”调整:
- 将新元素与其父节点比较,如果新元素更小,则与父节点交换。
- 重复此过程,直到新元素达到正确的位置或成为堆顶。
2. 上浮过程示例:
- 对于每个新插入的元素,最多需要调整至堆顶。
- 在完全二叉树中,高度为 ⌊ log n ⌋ \lfloor \log n \rfloor ⌊logn⌋。
- 因此,单个元素上浮的时间复杂度为 O ( log n ) O(\log n) O(logn)。
3. 总体时间复杂度分析:
-
对于 n n n 个元素,逐个插入,每次上浮调整:
O ( 1 × log 1 ) + O ( 1 × log 2 ) + ⋯ + O ( 1 × log n ) O(1 \times \log 1) + O(1 \times \log 2) + \cdots + O(1 \times \log n) O(1×log1)+O(1×log2)+⋯+O(1×logn)
-
这相当于一个对数级数求和:
∑ i = 1 n log i ≈ O ( n log n ) \sum_{i=1}^{n} \log i \approx O(n \log n) i=1∑nlogi≈O(nlogn)
-
结论:上浮建堆的时间复杂度为 O ( n log n ) O(n \log n) O(nlogn)。
二、下沉建小根堆:Heapify 自底向上
1. 核心原理:
-
直接将无序数组视为一个完全二叉树。
-
从最后一个非叶子节点开始,逐个向前进行“下沉”调整:
-
对当前节点执行下沉:
- 与左右子节点中较小的一个交换,确保当前节点保持小根堆性质。
-
重复下沉,直到当前节点满足堆性质或成为叶节点。
-
2. 下沉过程示例:
-
对于每个非叶子节点进行下沉操作。
-
下沉操作的时间取决于树的高度:
-
对于完全二叉树,树高为 ⌊ log n ⌋ \lfloor \log n \rfloor ⌊logn⌋。
-
但下沉的层次是逐级减少的:
- n / 2 n/2 n/2 个节点(叶节点)不需要下沉。
- n / 4 n/4 n/4 个节点下沉 1 次。
- n / 8 n/8 n/8 个节点下沉 2 次。
- ……
-
3. 总体时间复杂度分析:
-
这是一种渐进减半的过程:
∑ i = 1 log n n 2 i × i \sum_{i=1}^{\log n} \frac{n}{2^i} \times i i=1∑logn2in×i
-
该求和公式的复杂度为 O ( n ) O(n) O(n),这是因为下沉过程中的递减效果:
T ( n ) = 2 × n 2 × 1 + 2 × n 4 × 2 + 2 × n 8 × 3 + ⋯ ≈ O ( n ) T(n) = 2 \times \frac{n}{2} \times 1 + 2 \times \frac{n}{4} \times 2 + 2 \times \frac{n}{8} \times 3 + \cdots \approx O(n) T(n)=2×2n×1+2×4n×2+2×8n×3+⋯≈O(n)
- 结论:下沉建堆的时间复杂度为 O ( n ) O(n) O(n)。
三、两种建堆方式的时间复杂度对比
建堆方式 | 上浮建堆(逐个插入) | 下沉建堆(Heapify) |
---|---|---|
原理 | 逐个插入,上浮调整 | 自底向上,下沉调整 |
调整过程 | 每次上浮至正确位置 | 从最后一个非叶节点下沉 |
复杂度 | O ( n log n ) O(n \log n) O(nlogn) | O ( n ) O(n) O(n) |
四、为什么下沉建堆更高效?
- 下沉建堆(Heapify)直接从中间节点开始调整,避免了对叶子节点的重复操作。
- 叶子节点天生满足堆的性质,因此可以忽略。
- 而上浮建堆在每次插入时都进行上浮,无法利用已经部分有序的特性,导致较高的复杂度。
五、实际应用中的选择:
- 上浮建堆: 常用于动态增量插入堆的情况(如优先队列逐个入队)。
- 下沉建堆: 常用于一次性构建堆(如堆排序)。
相关文章:
算法基础 -- 小根堆构建的两种方式:上浮法与下沉法
小根堆构建的两种方式:上浮法与下沉法 在构建小根堆(Min-Heap)时,通常有两种常见的构建方式: 上浮建堆(逐个插入,上浮调整)下沉建堆(Heapify 自底向上,下沉…...

LED接口设计
一个LED灯有3种控制状态,常亮、常灭和闪烁,要做到这种控制最简单的一种方法是使用任何一款处理器的普通IO去控制。 用IO控制方式有两种,一种是高有效,如下图1所示IO口为高电平时LED亮,IO为低电平时LED不亮。IO口出一个…...
西安前端面试
面试1 1.vue2和vue3的原理及区别 2.伪数组 3.对箭头函数怎么理解的 4.vue父子组件传值的几种方式 5.对Promise的理解 面试2 1.两个升序数组实现合并升序排序 2.数组拍平[3, [[7, [1, 5]], 4], 8, [6]] 面试3 1.let var const的区别,什么时候const能改变 …...

SpringBoot项目使用POI-TL动态生成Word文档
近期项目工作需要动态生成Word文档的需求,特意调研了动态生成Word的技术方案。主要有以下两种: 第一种是FreeMarker模板来进行填充;第二种是POI-TL技术使用Word模板来进行填充; 以下是关于POI-TL的官方介绍 重点关注࿱…...
java高效实现爬虫
一、前言 在Web爬虫技术中,Selenium作为一款强大的浏览器自动化工具,能够模拟真实用户操作,有效应对JavaScript渲染、Ajax加载等复杂场景。而集成代理服务则能够解决IP限制、地域访问限制等问题。本文将详细介绍如何利用JavaSelenium快代理实…...

YOLOv3深度解析:多尺度特征融合与实时检测的里程碑
一、YOLOv3的诞生:继承与突破的起点 YOLOv3作为YOLO系列的第三代算法,于2018年由Joseph Redmon等人提出。它在YOLOv2的基础上,针对小目标检测精度低、多类别标签预测受限等问题进行了系统性改进。通过引入多尺度特征图检测、残差网络架构和独…...

uniapp-商城-60-后台 新增商品(属性的选中和页面显示)
前面添加了属性,添加属性的子级项目。也分析了如何回显,但是在添加新的商品的时,我们也同样需要进行选择,还要能正常的显示在界面上。下面对页面的显示进行分析。 1、界面情况回顾 属性显示其实是个一嵌套的数据显示。 2、选中的…...

虹科技术 | 简化汽车零部件测试:LIN/CAN总线设备的按键触发功能实现
汽车零部件测试领域对操作的便捷性要求越来越高,虹科Baby-LIN-RC系列产品为这一需求提供了完美的解决方案。从基础的按键设置到高级的Shift键应用,本文将一步步引导您了解虹科Baby-LIN-RC系列产品的智能控制之道。 虹科Baby-LIN-3-RC 想象一下࿰…...

单片机ESP32天气日历闹铃语音播报
自制Arduino Esp32 单片机 可以整点语音播报,闹铃语音播报,农历显示,白天晚上天气,硬件有 Esp32,ST7789显示屏,Max98357 喇叭驱动,小喇叭一枚。有需要源码的私信我。#单片机 #闹钟 #嵌入式 #智能…...

如何解决LCMS 液质联用液相进样器定量环漏液问题
以下是解决安捷伦1260液相色谱仪为例的进样器定量环漏液问题的一些方法:视频操作 检查相关部件 检查定量环本身:观察定量环是否有破损、裂纹或变形等情况。如果发现定量环损坏,需及时更换。检查密封垫:查看进样阀的转子密封垫、计…...

服务器内部可以访问外部网络,docker内部无法访问外部网络,只能docker内部访问
要通过 iptables 将容器中的特定端口请求转发到特定服务器,你需要设置 DNAT(目标地址转换)规则。以下是详细步骤: 假设场景 容器端口: 8080(容器内服务监听的端口)目标服务器: 192.168.1.100(请…...
机器学习中的特征工程:解锁模型性能的关键
在机器学习领域,模型的性能往往取决于数据的质量和特征的有效性。尽管深度学习模型在某些任务中能够自动提取特征,但在大多数传统机器学习任务中,特征工程仍然是提升模型性能的关键环节。本文将深入探讨特征工程的重要性、常用方法以及在实际…...
JAVA:Spring Boot 集成 RDF4J 实现欺诈检测的技术指南
1、简述 在大数据、知识图谱和金融风控等领域,RDF(Resource Description Framework) 是一种用于表示和查询关联数据的强大工具。RDF4J 是一个流行的 Java 库,用于操作 RDF 数据集,并支持 SPARQL 查询,能够帮助我们进行复杂的欺诈检测。 项目的核心功能: RDF 数据存储:…...
spring boot 注解
spring boot 注解 spring 会把被注解Controller、Service、Repository、Component 标注的类 纳入Spring容器中进行管理。 第7章会讲解 IoC 容器。 Controller。 它用于标注控制器层,在MVC 开发模式中代表C(控制器)。 Model View Controller Controlle…...
Spring框架的事务管理
配置文件的方式 <!--第二种写法:使用提供标签的方式--> <context:property-placeholder location"classpath:jd.properties"/><!--加载属性的文件(使用开源连接池)--> <bean id"dataSource" class"com.a…...
Spring MVC 中请求处理流程及核心组件解析
在 Spring MVC 中,请求从客户端发送到服务器后,需要经过一系列组件的处理才能最终到达具体的 Controller 方法。这个过程涉及多个核心组件和复杂的映射机制,下面详细解析其工作流程: 1. 核心组件与请求流程 Spring MVC 的请求处…...

PCIe Switch 问题点
系列文章目录 文章目录 系列文章目录完善PCIe Retimer Overview Document OutlineSwitch 维度BroadComMicroChipAsmedia 祥硕Cyan其他 完善 Functional block diagram,功能框图Key Features and Benefits,主要功能和优点Fabric 链路Multi-root PCIe Re…...

开源轻量级地图解决方案leaflet
Leaflet 地图:开源轻量级地图解决方案 Leaflet 是一个开源的 JavaScript 库,用于在网页中嵌入交互式地图。它以轻量级、灵活性和易用性著称,适用于需要快速集成地图功能的项目。以下是关于 Leaflet 的详细介绍和使用指南。 1. Leaflet 的核心…...

Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件
目录 1. 创建Flutter项目 1.1使用Android Studio创建Flutter项目 1.2 使用命令行创建Flutter项目 2. Flutter项目介绍 2.1所有代码都在lib目录下编写 2.1 pubspec.yaml 依赖库/图片的引用 编辑 3. 运行项目 4. 编写mian.dart文件 4.1 使用MaterialApp 和 Scaffold两个组件…...

如何实现金蝶云星空到MySQL的数据高效集成
金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化建设中,数据的高效流动和准确处理是关键。本文将聚焦于一个具体的系统对接集成案例:金蝶云星空的数据集成到MySQL,方案名称为“xsck-2金蝶销售出库-->mysql”。通过这一案例&#x…...
Web性能优化的未来:边缘计算、AI与新型渲染架构
一、边缘计算与性能优化深度整合 1.1 边缘节点计算卸载策略 • 智能任务分割:将非关键路径计算卸载到边缘节点 // 客户端代码 const edgeTask = new EdgeTask(image-processing); edgeTask.postMessage(imageData, {transfer...

院校机试刷题第四天:1911反转公约数、1702十六进制不进位加法
一、1911反转公约数 1.题目描述 2.解题思路 两个关键点:1.如何把数字反转,2.如何求最大公约数。 反转:用字符串形式存储,定义一个新的字符串倒序存储反转之后的字符串,将字符串按位转换位数字。 求最大公约数&…...
java输入输出类
父类 子类--->System.in(实例类) InputStream(抽象类,所有输入流的父类)|--->FileInputStream---->System.out(实例类) OutpustStream(抽象类,所有输出流的父类)|----> FileOutputStream----&…...

Redis解析
Redis解析 一、单线程模型 redis在io层面是多线程的,在数据处理层面是单线程的。 多线程一般用于: 关闭连接删除/淘汰内存网络IO 1.1 io多路复用 redis使用nio(select、poll、epoll)的方式处理socket 主线程负责接收建立连接…...
golang -- 认识channel底层结构
channel channel是golang中用来实现多个goroutine通信的管道(goroutine之间的通信机制),底层是一个叫做hchan的结构体,定义在runtime包中 type hchan struct {qcount uint // 循环数组中的元素个数(通道…...

2025年Ai写PPT工具推荐,这5款Ai工具可以一键生成专业PPT
上个月给客户做产品宣讲时,我对着空白 PPT 页面熬到凌晨一点,光是调整文字排版就改了十几版,最后还是被吐槽 "内容零散没重点"。后来同事分享了几款 ai 写 PPT 工具,试完发现简直打开了新世界的大门 —— 不用手动写大纲…...
对称二叉树的判定:双端队列的精妙应用
一、题目解析 题目描述 给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的: 1/ \2 2/ \ / \ 3 4 4 3而 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3问题本质 判断一棵二叉…...
使用Python实现简单的人工智能聊天机器人
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...
React 播客专栏 Vol.11|Plain CSS 如何在 React 中优雅登场?
👋 欢迎回到《前端达人 React 播客书单》第 11 期(正文内容为学习笔记摘要,音频内容是详细的解读,方便你理解),请点击下方收听 今天我们进入前端样式化的第一课,用最传统的方式 —— Plain CSS…...

css:倒影倾斜效果
这是需要实现的效果,平时用的比较多的是添加阴影,是box-shadow,而添加倒影是box-reflect,需要注意的是box-reflect需要添加浏览器前缀,比如我用的谷歌浏览器,要加-webkit-才能生效。 -webkit-box-reflect:…...