数据结构-堆

一、什么是堆

先了解两种特别的二叉树

满二叉树

除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树

完全二叉树

完全二叉树相对于满二叉树来说,最后一层叶子节点从左到右中间没有空缺的,像这样:

计算机科学中,堆是一种基于树的数据结构,通常用完全二叉树实现。堆的特性如下

  • 大顶堆中,任意节点 C 与它的父节点 P 符合 p.value >= c.value
  • 小顶堆中,任意节点 C 与它的父节点 P 符合 p.value <= c.value
  • 最顶层的节点(没有父亲)称之为 root 根节点

完全二叉树可以使用数组来表示,像下图这样

如果从索引 0 开始存储节点数据,它的特征如下:

  • 节点i的父节点为 floor((i-1)/2)
  • 当 i>0 时,节点i的左子节点为2i+1,右子节点为2i+2,当然它们得小于size

二、堆插入元素

以小堆为例,在插入元素的时候,先把元素放到数组的最后,然后与父节点比较,如果比父节点大,就插入成功了,如果比父节点小就跟父节点交换位置,直到它比父节点大或到达跟节点为止。

下面是代码实现

    /**** @param e 添加的元素* @return 是否成功*/public boolean offer (Integer e) {int i = size;size = i + 1;if (i == 0) {queue[i] = e;} else {siftUp(i, e);}return true;}/*** 1. 获取父节点* 2. 让元素与父节点比较,如果小于就交换位置,大于就结束* @param i 被添加元素的索引* @param e 被添加元素的值*/public void siftUp(int i, Integer e) {queue[i] = e;while (i > 0) {int parent = (i - 1) / 2;if (e > queue[parent]) {break;}swap(i, parent);i = parent;}}

三、出堆实现

  1. 弹出数组第一个元素返回
  2. 把数组最后一个元素放到第一位,然后对它元素进行下潜操作,下潜操作分为这3个步骤
  • 计算左子结点和右子节点
  • 左子节点和右子节点中较小的一个和父节点比较(子节点的index不能大于size)
  • 如果有比父节点小的就交换位置,直到到达叶子节点或者左子节点或右子节点没有小于父节点的就结束

代码实现:

    /***  1.返回第一个元素*  2.第一个元素与最后一个元素交换*  3.size--,最后一个元素置为null*  4.对第一个元素执行下潜操作*/public Integer poll() {if (size == 0) {throw new RuntimeException("Null");}Integer result = queue[0];swap(0, size - 1);queue[--size] = null;siftDown(0);return result;}/*** 1. 计算左子结点和右子节点* 2. 左子节点和右子节点中较小的一个和父节点比较(子节点的index不能大于size)* 3. 如果有比父节点小的就交换位置,直到到达叶子节点或者左子节点或右子节点没有小于父节点的就结束* @param index 要下潜元素的索引*/public void siftDown(int index) {int parent = index;int left = index * 2 + 1;int right = left + 1;if (left < size && queue[left] < queue[parent]) {parent = left;}if (right < size && queue[right] < queue[parent]) {parent = right;}// 说明找到更小的了if (parent != index) {swap(parent, index);siftDown(parent);}}

四、完整代码

public class Heap {private static final int DEFAULT_INITIAL_CAPACITY = 11;transient Integer[] queue;private int size = 0;public Heap() {queue = new Integer[DEFAULT_INITIAL_CAPACITY];}public static void main(String[] args) {Heap heap = new Heap();heap.offer(1);heap.offer(5);heap.offer(2);heap.offer(4);heap.offer(3);heap.poll();heap.poll();}/**** @param e 添加的元素* @return 是否成功*/public boolean offer (Integer e) {int i = size;size = i + 1;if (i == 0) {queue[i] = e;} else {siftUp(i, e);}return true;}/*** 1. 获取父节点* 2. 让元素与父节点比较,如果小于就交换位置,大于就结束* @param i 被添加元素的索引* @param e 被添加元素的值*/public void siftUp(int i, Integer e) {queue[i] = e;while (i > 0) {int parent = (i - 1) / 2;if (e > queue[parent]) {break;}swap(i, parent);i = parent;}}/***  1.返回第一个元素*  2.第一个元素与最后一个元素交换*  3.size--,最后一个元素置为null*  4.对第一个元素执行下潜操作*/public Integer poll() {if (size == 0) {throw new RuntimeException("Null");}Integer result = queue[0];swap(0, size - 1);queue[--size] = null;siftDown(0);return result;}public void swap(int i, int j) {int temp = queue[i];queue[i] = queue[j];queue[j] = temp;}/*** 1. 计算左子结点和右子节点* 2. 左子节点和右子节点中较小的一个和父节点比较(子节点的index不能大于size)* 3. 如果有比父节点小的就交换位置,直到到达叶子节点或者左子节点或右子节点没有小于父节点的就结束* @param index 要下潜元素的索引*/public void siftDown(int index) {int parent = index;int left = index * 2 + 1;int right = left + 1;if (left < size && queue[left] < queue[parent]) {parent = left;}if (right < size && queue[right] < queue[parent]) {parent = right;}// 说明找到更小的了if (parent != index) {swap(parent, index);siftDown(parent);}}}

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

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

相关文章

Pycharm常用快捷键和替换正则表达式

原生快捷键的使用&#xff1a; 1.CtrlF&#xff1a;查找 2.CtrlZ&#xff1a;返回上一步 3.Alt 鼠标左键选择&#xff1a;多行同时编辑&#xff08;上、下、左、右键能够移动光标&#xff09; 按住Ctrl,左键点击&#xff0c;定位光标 编辑过程 URL常用的替换正则表达式&am…

深入浅出理解ResNet网络模型+PyTorch实现

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;Identity Mappings in Deep Residual Networks 论文&#xff1a;Deep Residual Learning for Image Recognition ResNet详解PyTorch实现 PyTorch官方实现ResNet 【pytorch】ResNet18、ResNet20、…

使用Go语言抓取酒店价格数据的技术实现

目录 一、引言 二、准备工作 三、抓取数据 四、数据处理与存储 五、数据分析与可视化 六、结论与展望 一、引言 随着互联网的快速发展&#xff0c;酒店预订已经成为人们出行的重要环节。在选择酒店时&#xff0c;价格是消费者考虑的重要因素之一。因此&#xff0c;抓取酒…

php性能追踪与分析

PHP扩展下载&#xff1a;https://pecl.php.net/package/xhprof php.ini配置 [xhprof] extensionxhprof xhprof.output_dir/temp/xhprof auto_prepend_file /temp/inject_xhprof.php if(php_sapi_name() cli) {return; }$xhprof_config[enabled]1;if(!empty($xhprof_config…

Maven-构建工具

一、背景 开发者编写完成源码&#xff0c;还需要进行编译、测试、打包、部署等一系列操作。在一些小型项目中&#xff0c;还可能通过手动方式进行以上操作。但是在大型项目中&#xff0c;难以确定以上操作的顺序&#xff0c;而且会耗费更高的时间成本。 1.构建工具 构建工具…

【Proteus仿真】【Arduino单片机】LCD1602-IIC液晶显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602液晶显示各种效果。 二、软件设计 /* 作者&#xff1a;嗨小…

20道高频JavaScript面试题快问快答

※其他的快问快答&#xff0c;看这里&#xff01; 10道高频Qiankun微前端面试题快问快答 10道高频webpack面试题快问快答 20道高频CSS面试题快问快答 20道高频JavaScript面试题快问快答 30道高频Vue面试题快问快答 面试中的快问快答 快问快答的情景在面试中非常常见。 在面试过…

day3 ARM

【昨日作业】 .text .global start _start: mov r0,#0 存放sum mov r1,#1 存放相加的数值 loop: cmp r1,#100 bhi wh add r0,r0,r1 add r1,r1,#1 b loop wh: b wh .end 【内存读写指令】 通过内存读写指令可以实现向内存中写入指定数据或者读取指定内存地址的数据 c语言内存…

自动驾驶学习笔记(七)——感知融合

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 感知融合 卡尔曼滤波 融合策略 实…

数据分析实战 | 线性回归——女性身高与体重数据分析

目录 一、数据集及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 实现回归分析类算法的Python第三方工具包比较常用的有statsmodels、statistics、scikit-learn等&#…

工业镜头接口类型

现有产品主要有以下接口 1、C:最常见的工业相机接口&#xff0c;受限于接口物理尺寸大小&#xff0c;最大靶面目前是4/3” 2、M42:M421.0,2k和4k线阵相机使用 3、M58S:M580.75,大靶面相机使用&#xff0c;可以转C(限于CH080相机&#xff0c;靶面4/3”)&#xff0c;可以转F,可以…

数据结构预算法--链表(单链表,双向链表)

1.链表 目录 1.链表 1.1链表的概念及结构 1.2 链表的分类 2.单链表的实现(不带哨兵位&#xff09; 2.1接口函数 2.2函数的实现 3.双向链表的实现&#xff08;带哨兵位&#xff09; 3.1接口函数 3.2函数的实现 1.1链表的概念及结构 概念&#xff1a;链表是一种物理存储结…

论文阅读——Detection Hub(cvpr2023)

Detection Hub: Unifying Object Detection Datasets via Query Adaptation on Language Embedding 一、要解决的问题 大规模数据集可以提高模型性能&#xff0c;但是当训练多类别单一模型时&#xff0c;大规模数据集不能用在目标检测任务上&#xff0c;因为两个困难&#xff1…

开发知识点-Ant-Design-Vue

Ant-Design-Vue a-input a-input Vue组件 a-spin 加载中的效果 data字段 mounted钩子函数 Ant Design Vue 组件库 list-type“picture-card” 上传的图片作为卡片展示 name show-upload-list action :beforeUpload“handleBeforeUpload” :headers“customHeaders” :disabl…

C++ RBTree 理论

目录 这个性质可以总结为 红黑树的最短最长路径 红黑树的路径范围 code 结构 搞颜色 类 插入 插入逻辑 新插入节点 思考&#xff1a;2. 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏&#xff1f; 解决方法 变色 旋转变色 第三种情况&#xff0c;如果根…

Fortran 中的指针

Fortran 中的指针 指针可以看作一种数据类型 指针存储与之关联的数据的内存地址变量指针&#xff1a;指向变量数组指针&#xff1a;指向数组过程指针&#xff1a;指向函数或子程序指针状态 未定义未关联 integer, pointer::p1>null() !或者 nullify(p1) 已关联 指针操作 指…

docker下的nginx代理转发到tomcat

多次尝试失败原因&#xff0c;修改nginx配置文件以后&#xff0c;需要./nginx.sh -s reload 下&#xff0c;之前一直不转发&#xff0c;好像完全没有跳转的意思&#xff0c;后来查了多篇文档&#xff0c;最简单的方法如下 docker 安装 nginx 和tomcat就不多说了&#xff0c;可…

交叉编译 mysql-connector-c

下载 mysql-connector-c $ wget https://downloads.mysql.com/archives/get/p/19/file/mysql-connector-c-6.1.5-src.tar.gz 注意&#xff1a;mysql-connector 的页面有很多版本&#xff0c;在测试过程中发现很多默认编译有问题&#xff0c;其中上面的 6.1.5 的版本呢是经过测…

4面百度软件测试工程师的面试经验总结

没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2023年7月&#xff0c;我有幸成为了百度的一名测试工程师&#xff0c;从外包辞职了历经100…

【h5 uniapp】 滚动 滚动条,数据跟着变化

uniapp项目 需求&#xff1a; 向下滑动时&#xff0c;数据增加&#xff0c;上方的日历标题日期也跟着变化 向上滑动时&#xff0c;上方的日历标题日期跟着变化 实现思路&#xff1a; 初次加载目前月份的数据 以及下个月的数据 this.getdate()触底加载 下个月份的数据 onReach…