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

数据结构-堆

1.容器
容器用于容纳元素集合,并对元素集合进行管理和维护.
传统意义上的管理和维护就是:增,删,改,查.
我们分析每种类型容器时,主要分析其增,删,改,查动作实现,及复杂度.

2.堆
2.1.结构
2.1.1.图解
堆是容器类型.
采用容器内元素在线性空间连续存储的组织方式(数组也是如此).
但除此之外,基于元素的组织方式,为其抽象出了一层二叉树的逻辑关系.

以一个具体实例来说明.
在这里插入图片描述
上图是代表了一个可容纳12个元素的线性空间.现在存储了8个有效元素.堆的元素存储和数组一致.
但堆为其顺序存储的元素抽象出了一层二叉树的逻辑关系.
在这里插入图片描述
抽象的过程为,对顺序存储的每个元素,依次用这些元素顺序填满一颗满二叉树.
所谓满二叉树指的是,除了树最后一层,其余各层均是满的.最后一层,最后一个元素左边各个元素均是存在的.

如果观察特点可以得出以下结论,对顺序存储中索引为nIndex的元素.
逻辑结构里,其左孩子是索引为(2*nIndex+1)的元素,其右孩子是索引为(2*nIndex+2)的元素.

堆针对逻辑结构又施加了一层限制.
对最大堆来说,这层限制是:对堆中任一元素,该元素需要大于等于其左孩子,其右孩子上的元素.
对最小堆来说,这层限制是:对堆中任一元素,该元素需小于等于其左孩子,其右孩子上的元素.

在以上条件均满足下,可被利用的性质是:
(1). 首个元素是所有元素中最大的(对最大堆),最小的(对最小堆).
(2). 抽象出来的二叉树由于是满二叉树,其高度为:log2为底n的对数.

2.1.2.存在一致性约束容器特点
(1). 插入无需提供位置信息.
(2). 不支持直接原地修改.一般分解为移除,添加两个过程.
(3). 由于元素值决定其位置,这类容器一般插入元素时,以std::pair<key, value>形式插入.即元素包含键,值两部分.键用来实现一致性约束.值是此键关联的实际内容.

2.2.动作
2.2.0.建堆
意思是直接给一个连续存储的元素集合,把这些元素集合调整为符合堆性质的元素集合.
最直观当然是对集合内每个元素直接执行插入,这样所有元素插入完毕,就得到一个由这些元素构成的堆.
这里介绍另一种方式.
从集合最后一个元素反向遍历到第一个元素.
对每次遍历到的元素,让其符合:以该元素为根子树中所有元素均满足堆的性质.

下面介绍针对每个遍历到元素的调节过程.
不妨假设我们现在遍历到的元素是p.假设是最小堆.
由于我们之前每次遍历时,均按上述要求.所以,p的左孩子为根子树中所有元素此时均满足堆的性质.p的右孩子为根子树也是如此.此刻子树中唯一可能不满足要求的就是p和其左,右孩子.
p小于其左,右孩子上的元素,则无需调节.
否则,找到三者中最小元素q.交换此qp的位置.
交换后对p和其左右孩子来说堆的性质得到满足.但对q来说,由于此位置元素变大了.所以,此刻子树中只有q与其左右孩子可能不满足堆的性质.这样,我们虽然未立即解决问题.但将问题转化为了一个同类型问题.
由于树的高度有限,每次转化后我们在更低一层子树上再次处理同类问题.
故,即使最坏下,至多经过有限次调节,也可解决问题.

2.2.1.增
堆中插入新元素.对于存在一致性约束的容器,元素插入到容器后,需经历调节过程.不需要也无法在指定位置实现插入.具体位置依赖调节过程.

插入过程可描述为:
(1). 将新元素放在数组尾后位置.
(2). 这样,此时数组对应的二叉树中,只有新节点p和其父亲q可能不满足堆的性质.
(3). 我们分析最小堆场景.比较pq,若q中元素小于等于p,则无需调节.
(4). 若q中元素大于p,交换pq内元素.交换后,由于q位置元素变小了.所以,q和其父节点可能不满足堆的性质.p位置元素变小了.故,以p和其左右孩子必然满足堆的性质.

这样,我们虽然未立即解决问题,但将问题转化了.由于树的高度有限,故,最坏下也能经过有限次迭代结束调节过程.

2.2.2.删
堆由于其性质,一般移除限定只能移除首个元素.我们分析移除首个元素过程.

删除首元素可描述为:
(1). 交换尾元素和首元素.递减有效元素数量.
(2). 我们分析最小堆场景.此时,首元素p相比原来变大了.此时,整棵树中只有p和其左右孩子可能不满足堆的性质.
(3). 我们寻找节点p,其左孩子lp,其右孩子rp,三者中最小元素及其位置.
(4). 若最小元素是p,则无需调节.
(5). 若最小元素是某个孩子cp(要么lp,要么rp).交换cpp上元素.这样,交换后p和其左右孩子此时满足了堆的性质.但cp上元素变大了,所以,此时cp和其左右孩子可能不满足堆的性质.

这样,我们虽然未能立即解决问题.但将问题转化了.由于树的高度有限,故,最环下也能经过有限次迭代结束调节过程.

2.2.3.查
堆一般只提供访问首元素方法即可.
访问首元素直接基于索引访问即可.

2.2.4.改
对于存在一致性约束的容器,一般不会允许直接修改元素的值.
此类操作一般分解为:删除老元素,添加新元素两个过程来实现.

删除非首元素,类似删除首元素过程.只不过此时先交换删除位置元素和尾部元素.再从此开始进入调节流程.

2.3.时间复杂度
评价容器的依据一个是其占据的线性空间,一个是操作执行的时间复杂度.
堆的各个操作时间复杂度为:
(1). 增:Θ(log2为底n的对数)
(2). 删:Θ(log2为底n的对数)
(3). 查:Θ(1) (索引访问)
(4). 改:Θ(1) (log2为底n的对数)

相关文章:

数据结构-堆

1.容器 容器用于容纳元素集合&#xff0c;并对元素集合进行管理和维护&#xff0e; 传统意义上的管理和维护就是&#xff1a;增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0e; 我们分析每种类型容器时&#xff0c;主要分析其增&#xff0c;删&#xff0c;改&#xff…...

奔跑吧小恐龙(Java)

前言 Google浏览器内含了一个小彩蛋当没有网络连接时&#xff0c;浏览器会弹出一个小恐龙&#xff0c;当我们点击它时游戏就会开始进行&#xff0c;大家也可以玩一下试试&#xff0c;网址&#xff1a;恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…...

Ubuntu 1804 And Above Coredump Settings

查看 coredump 是否开启 # 查询&#xff0c; 0 未开启&#xff0c; unlimited 开启 xiaoUbuntu:/var/core$ ulimit -c 0# 开启 xiaoUbuntu:/var/core$ ulimit -c unlimited查看 coredump 保存路径 默认情况下&#xff0c;Ubuntu 使用 apport 服务处理 coredump 文件&#xff…...

docker 2:安装

docker 2&#xff1a;安装 ‍ ubuntu 安装 docker sudo apt install docker.io‍ 把当前用户放进 docker 用户组&#xff0c;避免每次运行 docker 命都要使用 sudo​ 或者 root​ 权限。 sudo usermod -aG docker $USER​id $USER ​看到用户已加入 docker 组 ​​ ‍ …...

LeetCode Python - 19.删除链表的倒数第N个结点

目录 题目答案运行结果 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&a…...

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表&#xff08;略&#xff09; 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删&#xff0c;删了会报错 2.3.3 引入spring web依赖…...

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…...

面试计算机网络框架八股文十问十答第七期

面试计算机网络框架八股文十问十答第七期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;UDP协议为什么不可…...

Codeforces Round 926 (Div. 2)

A. Sasha and the Beautiful Array&#xff08;模拟&#xff09; 思路 最大值减去最小值 #include<iostream> #include<algorithm> using namespace std; const int N 110; int a[N];int main(){int t, n;cin>>t;while(t--){cin>>n;for(int i 0; i…...

构建智慧交通平台:架构设计与实现

随着城市交通的不断发展和智能化技术的迅速进步&#xff0c;智慧交通平台作为提升城市交通管理效率和水平的重要手段备受关注。本文将探讨如何设计和实现智慧交通平台的系统架构&#xff0c;以应对日益增长的城市交通需求&#xff0c;并提高交通管理的智能化水平。 ### 1. 智慧…...

移动端设置position: fixed;固定定位,底部出现一条缝隙,不知原因,欢迎探讨!!!

1、问题 在父盒子中有一个子盒子&#xff0c;父盒子加了固定定位&#xff0c;需要子盒子上下都有要边距&#xff0c;用margin或者padding挤开时&#xff0c;会出现缝隙是子盒子背景颜色的。 测试过了&#xff0c;有些手机型号有&#xff0c;有些没有&#xff0c;微信小程序同移…...

有关网络安全的课程学习网页

1.思科网络学院 免费学习skillsforall的课程 课程链接&#xff1a;Introduction to Cybersecurity by Cisco: Free Online Course (skillsforall.com) 2.斯坦福大学计算机和网络安全基础 该证书对于初学者来说最有价值&#xff0c;它由最著名的大学之一斯坦福大学提供。您可…...

计算机网络-面试题

一、基础 1、网络编程 网络编程的本质是多台计算机之间的数据交换存在问题 如何准确的定位网络上一台或多台主机如何进行可靠传输2、网络协议 在计算机网络有序的交换数据,就必须遵守一些事先约定好的规则,比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络…...

C++虚函数

C虚函数 在C中&#xff0c;虚函数&#xff08;Virtual Function&#xff09;是一个使用关键字virtual声明的成员函数&#xff0c;它在基类中被声明&#xff0c;以便在任何派生类中被重写&#xff08;Override&#xff09;。使用虚函数的目的是实现多态性——一种允许使用基类指…...

MySQL数据库基础(二):MySQL数据库介绍

文章目录 MySQL数据库介绍 一、MySQL介绍 二、MySQL的特点 三、MySQL版本 四、MySQL数据库下载与安装 1、下载 2、安装 五、添加环境变量&#xff08;Windows&#xff09; 六、检测环境变量是否配置成功 MySQL数据库介绍 一、MySQL介绍 MySQL是一个关系型数据库管理…...

常用文件命令

文章目录 文件命令文件内容查看catnlmoreless&#xff08;more的plus版&#xff09;headtailod 文件属性操作用户权限常见的权限chownchmodchgrpumask 隐藏属性常见的隐藏属性lsattrchattr 查找文件查看文件类型查找文件位置whichwhereislocatefind 文件操作&#xff08;复制、…...

在屏蔽任何FRP环境下从零开始搭建安全的FRP内网穿透服务

背景 本人目前在境外某大学读博&#xff0c;校园网屏蔽了所有内网穿透的工具的数据包和IP访问&#xff0c;为了实现在家也能远程访问服务器&#xff0c;就不得不先开个学校VPN&#xff0c;再登陆。我们实验室还需要访问另一个大学的服务器&#xff0c;每次我都要去找另一个大学…...

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作)&#xff0c;产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后&#xff0c;准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值&#xff0c;不再是新&#xf…...

Python 函数的学习笔记

Python 函数的学习笔记 0. Python 函数的概要说明1. 自定义函数示例2. 匿名函数示例3. 内置函数示例3-1. filter() 示例3-2. map() 示例3-3. reduce() 示例 4. 可变长参数*args和**kwargs示例4-1. *args&#xff08;Positional Variadic Arguments&#xff09;4-2. **kwargs&am…...

详解 Redis 实现数据去重

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ &#x1f388;&#x1f388;希望这篇博客对大家能有帮助&#x1f388;&#x1f388; 目录 言 一. Redis去重原理 1. Redis Set 数据结构 2. 基于 Set 实现数据去重 3. 代码示例 4. 总结 …...

嵌入式哈希表实现:无malloc线性探测Hash Map

1. 项目概述 hashmap.c 是一个面向嵌入式系统深度优化的纯 C 语言哈希映射&#xff08;Hash Map&#xff09;实现&#xff0c;不依赖标准库&#xff08;如 stdlib.h 、 string.h &#xff09;&#xff0c;完全可移植于裸机环境、RTOS&#xff08;FreeRTOS、Zephyr、RT-Thr…...

Python并发革命进行时:GIL移除后你必须掌握的5种内存序模型(x86/ARM/RISC-V实测对比)

第一章&#xff1a;Python无锁GIL环境下的并发模型架构总览传统CPython解释器受全局解释器锁&#xff08;GIL&#xff09;制约&#xff0c;无法真正实现多线程CPU并行。而“无锁GIL环境”并非指移除GIL本身&#xff0c;而是指在GIL被主动释放、绕过或由替代运行时&#xff08;如…...

手把手教你用ROS2和ZED2 SDK搭建3D视觉开发环境(Ubuntu 20.04版)

手把手教你用ROS2和ZED2 SDK搭建3D视觉开发环境&#xff08;Ubuntu 20.04版&#xff09; 在自动驾驶、增强现实和机器人导航等领域&#xff0c;3D视觉感知已成为核心技术之一。ZED2相机凭借其双目深度感知能力和高精度SLAM算法&#xff0c;成为开发者构建空间智能系统的首选传感…...

深入解析Golang中的占位符:%w、%v、%s的应用与最佳实践

1. Golang占位符基础入门 刚开始接触Golang时&#xff0c;fmt包里的那些百分号开头的占位符确实让我有点懵。记得第一次看到%s、%v、%w这些符号时&#xff0c;我还以为是什么特殊运算符。后来在实际项目中用多了才发现&#xff0c;这些看似简单的占位符&#xff0c;其实是Gola…...

路侧3D检测翻车实录:Rope3D数据集标签里的航向角坑,我是怎么填上的

路侧3D检测实战&#xff1a;Rope3D数据集航向角问题的深度解析与修复方案 当你在深夜盯着屏幕上那些"反向行驶"的虚拟车辆时&#xff0c;那种荒诞感会让人瞬间清醒。这不是科幻场景&#xff0c;而是我在使用Rope3D数据集进行路侧3D目标检测时遇到的真实困境——车辆航…...

Qt串口通信实战:用QSerialPort从零搭建一个串口调试助手(附完整源码)

Qt串口通信实战&#xff1a;从零构建工业级调试助手 在嵌入式开发和工业控制领域&#xff0c;串口通信作为最基础也最可靠的通信方式之一&#xff0c;至今仍发挥着不可替代的作用。无论是单片机与上位机的数据交换&#xff0c;还是工业设备的参数配置&#xff0c;一个稳定高效的…...

python基于微信小程序的直播带货商品数据分析系统的爬虫可视化

目录需求分析与系统架构设计微信小程序数据爬取方案数据存储与清洗数据分析与可视化系统集成与部署注意事项项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与系统架构设计 明确系统目标为爬取微信小程序直播带货商品数…...

信息安全毕设容易的项目选题汇总

0 选题推荐 - 网络与信息安全篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满…...

Win11Debloat:终极Windows系统清理工具,一键提升电脑性能的完整指南

Win11Debloat&#xff1a;终极Windows系统清理工具&#xff0c;一键提升电脑性能的完整指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执…...

7大核心优势!Windows环境PM2服务化终极解决方案:从痛点到实战的完整指南

7大核心优势&#xff01;Windows环境PM2服务化终极解决方案&#xff1a;从痛点到实战的完整指南 【免费下载链接】pm2-installer Install PM2 offline as a service on Windows or Linux. Mostly designed for Windows. 项目地址: https://gitcode.com/gh_mirrors/pm/pm2-ins…...