堆:数据结构与应用

文章目录

  • 堆:数据结构与应用
      • 堆的概念
      • 堆的特点
      • 堆的操作
        • 调整操作:向上调整(AdjustUp)
        • 删除操作:Pop
        • 调整操作:向下调整(AdjustDown)
    • 堆排序
      • 方法一:先建堆后排序
      • 方法二:原地建堆

堆:数据结构与应用

在数据结构的世界中,堆作为一种特殊形式的完全二叉树,以其独特的属性和高效的操作脱颖而出。本文将深入探讨堆的概念、特点、基本操作,以及其在解决实际问题如Top-K问题和实现堆排序算法中的广泛应用。

堆的概念

堆是一种完全二叉树,其核心特征在于节点值的有序性。根据节点值与子节点值的关系,堆可分为两大类:

  • 小根堆(Min Heap):每个节点的值小于或等于其子节点的值。直观地看,小根堆的根节点总是整个树中的最小值,如下图所示。
       16 /   \ 14    10/  \  /  \ 8    7 9   3 / \ 
2   4
  • 大根堆(Max Heap):每个节点的值大于或等于其子节点的值。相应地,大根堆的根节点始终是树中的最大值,如下图所示。
       90 /    \ 85     75/  \   /  \ 70  65 50   45 / \ 
40  35

尽管堆在逻辑上表现为完全二叉树,但在物理实现上通常采用数组存储。这样,每个节点的位置与其在数组中的索引紧密关联,便于快速访问父节点、子节点以及进行堆的操作。

堆的特点

  1. 堆顶特性:小根堆的根节点始终是最小值,大根堆的根节点始终是最大值。这一特性使得堆在处理诸如寻找最小或最大元素等问题时,无需遍历整个数据集,只需查看根节点即可。

  2. 局部有序:尽管堆整体可能并不严格有序,但每个节点与其直接子节点之间保持特定的大小关系(小根堆中父节点小于等于子节点,大根堆中父节点大于等于子节点)。这种局部有序性赋予堆结构良好的稳定性,有利于实现高效的操作。

  3. 高效操作:堆支持插入、删除、调整等操作,且这些操作的时间复杂度均为 ( O(\log N) ),其中 ( N ) 是堆中节点的数量。堆的高效性源于其完全二叉树的特性,使得操作主要集中在树的顶层,避免了对整个数据集的线性扫描。

堆的操作

调整操作:向上调整(AdjustUp)

当向堆中插入新节点或更新节点值后,可能导致堆的性质被破坏。此时,需执行向上调整操作,确保新节点(或更新后的节点)及其祖先节点满足堆的性质。具体做法是从新节点开始,与父节点比较,若违反堆性质则交换两者位置,然后继续与新的父节点比较,直至到达根节点或满足堆性质为止。如下图所示为向上调整的一个示例。

删除操作:Pop

堆顶元素(最小值或最大值)往往是最感兴趣的,故堆提供了高效的删除操作。为了避免直接删除堆顶后导致堆结构破坏,通常采用以下策略:

  • 用堆尾元素替换堆顶元素。
  • 删除替换后堆顶元素(原堆尾),此时堆尾已空。
  • 对新的堆顶元素执行向下调整操作,恢复堆的性质。
调整操作:向下调整(AdjustDown)

向下调整主要用于删除操作后恢复堆的性质,也用于新建堆时对整个数据集进行初始化。其过程如下:

  • 假定当前节点的左右子树已满足堆的性质(小根堆或大根堆)。
  • 比较当前节点与左右子节点,找出较小(大根堆时为较大)者。
  • 若当前节点不是所选子节点中最小(大根堆时为最大)的,交换当前节点与选定子节点的值。
  • 在交换后子节点的位置继续执行向下调整,直至达到叶子节点或满足堆性质。

堆排序

堆排序是一种利用堆结构实现的排序算法,其核心思想是将待排序数组转化为堆,然后通过反复删除堆顶元素(最小或最大值),并重新调整堆,最终实现数组的整体有序。堆排序有两种常见实现方式:

方法一:先建堆后排序

  1. 步骤:首先创建一个空堆,然后将待排序数组中的元素逐个插入堆中,每次插入后执行向上调整操作,确保堆性质得以维持。一旦所有元素都被插入堆中,堆即构建完成。接着,重复执行堆的删除操作(取走堆顶元素并调整),每次删除后将得到一个已排序元素。重复此过程直至堆为空,此时待排序数组已按要求排序。

  2. 缺点:这种方法需要额外的堆数据结构,增加了空间复杂度。而且,在插入元素过程中可能会产生一些未使用的空间,造成空间浪费。

方法二:原地建堆

  1. 步骤:直接将待排序数组视为完全二叉树,从数组第二个元素(索引为1的元素)开始,逐个进行向上调整,直至整个数组在原地完成建堆。接下来,通过反复执行堆的删除操作(取走堆顶元素并调整),实现数组的排序。

  2. 排序策略

    • 降序排序:构建一个小根堆,每次取走堆顶最小值,剩余元素重新调整为小根堆,重复此过程直至排序完成。
    • 升序排序:构建一个大根堆,每次取走堆顶最大值,剩余元素重新调整为大根堆,同样重复直至排序完成。
  3. 时间复杂度:无论是先建堆后排序还是原地建堆,堆排序的时间复杂度均为 ( O(N \log N) ),其中 ( N ) 为待排序数组的长度。这种时间复杂度使得堆排序成为处理大规模数据时的高效选择。

综上所述,堆作为基于完全二叉树的高效数据结构,凭借其堆顶特性、局部有序性和高效操作,广泛应用于解决Top-K问题、优先级队列管理、事件调度等多种实际场景。同时,堆排序算法利用堆的特性实现了稳定、快速的排序,是数据结构与算法领域不可或缺的工具。通过理解堆的内在机制及其操作原理,开发者能够更好地驾驭这一强大工具,提升程序性能和解决问题的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的大创管理系统源码数据库

基于springboot的大创管理系统源码数据库 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足,创建了一个计算机管理大创管理系统的方案。…

天诚智慧校园管理系统,变革高校物联网锁数智化通行新模式

三月草长莺飞,四月柳绿莺啼,在万物复苏的美好时节,历经半年的精心酝酿与匠心打磨,全场景AIoT解决方案服务商——江苏新巢天诚智能技术有限公司(以下简称“天诚”)正式推出新一代高校数智化通行管理平台——…

电脑启动引导的两种方式

电脑启动引导的两种方式 电脑启动引导有两种方式:Legacy 传统模式 和 UEFI 新型模式。 一、Legacy:指 主板的 传统的 BIOS 传输模式引导启动加载操作系统。 1.只支持 MBR 分区表,支持 32位和64位操作系统(如:winXP&…

JavaEE 初阶篇-深入了解定时器、工厂模式和比较器

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 定时器概述 2.0 实现定时器 2.1 实现定时器 - 定义 MyTask 任务类 2.2 实现定时器 - MyTimer 定时器类存放任务的方法 2.3 实现定时器 - MyTimer 定时器类读取任务…

前端开发攻略---根据音频节奏实时绘制不断变化的波形图。深入剖析如何通过代码实现音频数据的可视化。

1、演示 2、代码分析 逐行解析 JavaScript 代码块&#xff1a; const audioEle document.querySelector(audio) const cvs document.querySelector(canvas) const ctx cvs.getContext(2d)这几行代码首先获取了 <audio> 和 <canvas> 元素的引用&#xff0c;并使用…

群晖虚拟机搭建Synology Drive并实现Obsidian笔记异地多端同步

文章目录 一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安装并设置Synology Drive套件2 局域网内同步文件测试 三、内网穿透群晖Synology Drive&#xff0c;实现异地多端同步Windows 安装 Cpolar步骤&#…

关于学习和技术提升的思考

从技术框架的演进可以看出专业性越来越强&#xff0c;门槛越来越低&#xff0c;我们经常强调要解耦合&#xff0c;把公共模块功能做抽取&#xff0c;减少重复劳动&#xff0c;使主要精力专注于特定场景特定业务的处理。老美在设计框架的时候也是这么干的。殊不知&#xff0c;我…

微服务-4 Nacos

目录 一、注册中心 二、配置管理 1. 添加配置 2. 配置自动刷新 3. 多环境配置共享​编辑 一、注册中心 服务列表&#xff1a; 服务详情&#xff1a; 二、配置管理 1. 添加配置 (1). 在 nacos 界面中添加配置文件&#xff1a; 配置列表&#xff1a; 配置详情&#xff1a;…

2024年华为OD机试真题-符号运算-Python-OD统一考试(C卷)

题目描述: 给定一个表达式,求其分数计算结果 表达式的限制如下: 1. 所有的输入数字皆为正整数(包括0) 2. 仅支持四则运算(+-*/)和括号 3. 结果为整数或分数, 分数必须化为最简格式(比如6, 3/4, 7/8, 90/7) 4. 除数可能为0,如果遇到这种情况,直接输出"ERROR" 5.…

[C++][算法基础]模拟散列表(哈希表)

维护一个集合&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个整数 x&#xff1b;Q x&#xff0c;询问整数 x 是否在集合中出现过&#xff1b; 现在要进行 N 次操作&#xff0c;对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&#xff0c;…

致远目前最新V8.2,打开公文正文的原文档,提示错误:http返回码=12157……解决办法

新版V8.2&#xff0c;打开发文中的正文原文档时&#xff0c;提示错误&#xff1a;http返回码12157&#xff0c;返回信息安全频道支持出错&#xff0c;更新安装插件也不能解决。 解决办法 设置IE浏览器的Internt选项配置。 控制面板-网络和Internet–Internet选项-高级-使用TLS …

【基础】损失函数和评估指标的区别

文章目录 一.损失函数&#xff08;Loss Function&#xff09;&#xff1a;1.1 作用1.2 示例1.3 常见面试题1.3.1 常见的损失函数有哪些&#xff1f;它们分别适用于什么类型的任务&#xff1f;1.3.2 介绍一下交叉熵损失函数&#xff1f;1.3.3 均方误差损失函数&#xff08;Mean …

如何使用Tomcat+cpolar搭建本地站点并发布到公网分享好友远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器拥有强大功能&#xff0c;由于其可以实…

【React】React Hooks

useState useState 向组件中添加状态变量 状态是只读的&#xff0c;不可以直接修改 对于对象类型的状态变量&#xff0c;应该传递一个新的对象来更改 需要对象展开&#xff0c;并重新赋值&#xff0c;进行增加或者修改。 如果需要删除&#xff0c;则使用 filter。 import { …

【踩坑日记】Pop!OS中文输入法的坑

文章目录 前言一、编译安装最新的IBus-pinyin输入法1.卸载旧输入法2.安装编译依赖3.下载源码4.编译和安装libpinyin5.编译和安装ibus-libpinyin6.重启IBus服务二、安装Fcitx5前言 使用Linux时,特别是涉及到中文的时候,会遇到一些问题。我最近在使用Pop!OS 22.04,这是Ubuntu…

Qt for MCUs 2.7正式发布

本文翻译自&#xff1a;Qt for MCUs 2.7 released 原文作者&#xff1a;Qt Group高级产品经理Yoann Lopes 翻译&#xff1a;Macsen Wang Qt for MCUs的新版本已发布&#xff0c;为Qt Quick Ultralite引擎带来了新功能&#xff0c;增加了更多MCU平台的支持&#xff0c;并且我们…

Apache SeaTunnel 社区 3 月月报

各位热爱 SeaTunnel 的小伙伴们&#xff0c;SeaTunnel 社区 3 月月报来啦&#xff01;这里将记录 SeaTunnel 社区每个月的重要更新&#xff0c;并评选出月度之星&#xff0c;欢迎关注。 SeaTunnel 月度 Merge Stars 感谢以下小伙伴 3 月为 Apache SeaTunnel 做的精彩贡献&…

[Java、Android面试]_17_Fragment和Service生命周期

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

将数组元素转化为指针的方法

1. 数组名作为指针 int arr[5] {0,1,2,3,4}; int*ptr arr; 2. 取地址 int* ptr &arr[3]; 3.指针算数运算 int* ptr arr; int* p *(arr1);

【个人使用分享】教你大厂云服务器如何选 联机不卡顿 幻兽帕鲁小白一键部署 16G低至26 续费1.5折

更新日期&#xff1a;4月11日&#xff08;半年档 价格回调&#xff0c;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更…