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

堆的实现(图片演示+文字讲解)

堆的实现

虽然我们之前的介绍堆的时候是一个二叉树,但是我们实现堆的时候并不是按照传统的二叉树实现(传统的二叉树是用链的形式,即一个父节点存放两个子节点的引用)

为什么要这样说呢?

我们先看一下堆的结构:

 

如果我们观察每一个节点的顺序,我们会发现一个有趣的规律:

对于任意个下标a的元素,他的左孩子下标是2*a,右孩子下标是2*a+1,父节点下标是a/2取整。

而堆又有分层添加(一层添加完才需要添加下一层)的特性,所以用数组来实现堆,才是一个最佳的选择。

那么如果是一个数组,堆的插入和取值如何实现呢?

插入:

上图的堆如果转换成数组就是下面这样,红色为数组下标:

 

当要进行插入操作时,堆会把新值放到堆的最后,对数组来说就是数组的最后啦~实现起来很简单!

 

然后,我们需要判断是否满足条件:父元素比子元素小(我们按最小堆来解释)。

3的下标是11,那么根据上面的公式:每个节点的父节点下标是此节点下标/2取整,那么他的父元素就是下标11/2=5,下标5对于的数字是7

由于7>3,所以需要替换

 

再次比较3的父节点(5/2=2,即第2个元素6),发现比父节点小,依然替换

 

再次按上述规则比较,发现符合条件,插入完成!

取最小数:

由之前的内容可以知道,取最小数就是取第一个数,然后把最后一个数放到第一个数的位置,如下图所示:

 

然后我们比较是否满足条件:父元素小于两个子元素

下标 1的两个子节点下标分别为分别21*2)和31*2+1),对应值64

下标1的对应值为11,大于4,不满足条件,所以替换

 

再次比较是否满足条件:

下标3的两个子节点下标为63*2)和73*2+1),对应值65

下标3对应值为11,大于5,不满足条件,所以替换

 

再次按上述规则比较,发现满足条件,至此,取最小值完成;

转载于:https://www.cnblogs.com/chenkeyu/p/7505704.html

相关文章:

  • Ubuntu ko模块的编译
  • 通过git安装npm私有模块
  • python 安装 setuptools Compression requires the (missing) zlib module 的解决方案
  • jquery easyui-datagrid/treegrid 清空数据参考
  • 【微信公众号发红包转账】微信公众号上手机网页接收请求,通过公众号给用户发红包 开发流程...
  • Linux驱动开发之注册
  • java:Properties属性文件概念
  • 从0实现一个tiny react(三)生命周期
  • python练习-统计包含数字字符串元组在内的列表内数据类型个数
  • MFC添加背景图片
  • C#/VB.NET 给Word文档添加/撤销书签
  • include 和require的区别
  • windows7安装saltstack
  • 训练过程中出现的报错
  • python基础知识
  • php的引用
  • #Java异常处理
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Magento 1.x 中文订单打印乱码
  • PHP变量
  • Python_网络编程
  • Vue UI框架库开发介绍
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Yii源码解读-服务定位器(Service Locator)
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 成为一名优秀的Developer的书单
  • 诡异!React stopPropagation失灵
  • 计算机在识别图像时“看到”了什么?
  • 嵌入式文件系统
  • 如何在 Tornado 中实现 Middleware
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 通过npm或yarn自动生成vue组件
  • 小而合理的前端理论:rscss和rsjs
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 从如何停掉 Promise 链说起
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # C++之functional库用法整理
  • # 数据结构
  • (4)事件处理——(7)简单事件(Simple events)
  • (Python第六天)文件处理
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (转) 深度模型优化性能 调参
  • .gitignore
  • .net 验证控件和javaScript的冲突问题
  • .NET/C# 获取一个正在运行的进程的命令行参数