点击蓝色“五分钟学算法”关注我哟

加个“星标”,天天中午 12:15,一起学算法

来源 | 算法无遗策

二叉堆的解释

(动态选择优先级最高的任务执行)

堆,又称为优先队列。虽然名为优先队列,但堆并不是队列。堆和队列是两种不同的数据结构,堆是树态的,队列是线性的。在队列中,我们可以向队列添加元素,取出的时候是按照进入队列的先后顺序取出元素的,先进先出;而在堆中,却不是按照元素添加的先后顺序,而是按照元素的优先级取出元素。

所以二叉堆是为了找出最大或最小而生的,“大”和“小”并不是传统意义上的小大,而是优先级的高低。二叉堆分为最大堆和最小堆,最大堆的顶点可以看作是优先级最高的也可以看作是优先级最低的,最小堆也是如此。

二叉堆是一种完全二叉树,因为完全二叉树的特性普遍使用数组结构是非常好用的,所以性注定了二叉堆的存储形式只能是数组或者动态数组(长度可变)。

二叉堆最主要的操作是两个,siftUp上浮和siftDown下沉,来保证二叉堆的性质:

1.父节点的键值总是优先于任何一个子节点的键值;

2.左右子树都是一个二叉堆。

展示最大堆

用数组存储二叉堆,堆的顶点下标可以从0开始也可以从1开始。看上面图中,以self为参照物,self下标的变量为i:

parent(i) = (i - 1) / 2;

leftChild(i) = 2*i+1;

rightChild(i) = leftChild(i) + 1 = 2 * i + 2;

如果是堆顶下标从1开始:

parent(i) = i/2;

leftChild = 2 *i;

rightChild = 2 *i+1;

向堆中添加元素siftUp

二叉堆的节点添加,是在数组的最末尾插入新节点的,然后进行自下而上调整子节点和父节点,不满足二叉堆性质则交换,直到当前子树满足二叉堆的性质。如果可以为了减少交换次数的话,可以单向复制,使得添加的节点插入到合适的位置。

动画siftUp

Code:单向复制

Code:交换法

取出堆中最大的元素siftDown

取出堆中最大的元素其实是取出根节点,这个下沉的操作很有意思了。它有两方面的下沉:一方面是将根节点下沉到数组末尾,然后数组长度假象性减一下;另一方面是将交换后的根节点和左右子树的根节点作比较,不满足堆性质的则交换。

动画siftDown

Code:siftDown单向复制

Code:siftDown交换法

构建二叉堆

构建二叉堆其实是一个一个子树的下沉操作,将无序的完全二叉树调整为二叉堆。所以它必须从满足高度为2的子树根节点开始,即非叶子节点,然后自底向上对每一个子树执行siftDown操作,直到完成二叉堆化。

动画:构建二叉堆

Code

-----------------------

公众号:五分钟学算法(ID:CXYxiaowu)

博客:www.cxyxiaowu.com

知乎:程序员吴师兄

一个正在学习算法的人,致力于将算法讲清楚!

长按下图二维码关注,和你一起领悟算法的魅力

戳一下下方的小程序,24 小时一起学算法

动画 | 什么是二叉堆?相关推荐

  1. 看动画学算法之:二叉堆Binary Heap

    文章目录 简介 二叉堆的特性 二叉堆的作用 二叉堆的构建 获取二叉堆的最大值 二叉堆的插入 insert操作的时间复杂度 二叉堆的提取Max操作 extractMax的时间复杂度 创建二叉堆 简介 我 ...

  2. 【nodejs原理源码杂记(8)】Timer模块与基于二叉堆的定时器

    [摘要] timers模块部分源码和定时器原理 示例代码托管在:http://www.github.com/dashnowords/blogs 一.概述 Timer模块相关的逻辑较为复杂,不仅包含Ja ...

  3. 大根堆的删除c语言,二叉堆(一)之 C语言详解

    本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...

  4. 在A*寻路中使用二叉堆

    在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序:     这一篇文章,是"A* Pathfinding ...

  5. 0x17.基础数据结构 - 二叉堆

    目录 一.二叉堆 二.例题 0.AcWing 145. 超市 AcWing 146. 序列(POJ 2442) 三.HuffmanHuffmanHuffman树 1.AcWing 148. 合并果子 ...

  6. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  7. 排序算法之——优先队列经典实现(基于二叉堆)

    许多应用都需要处理有序的元素,但有时,我们不要求所有元素都有序,或是一定要一次就将它们排序,许多情况下,我们会收集这些元素里的最大值或最小值. 这种情况下一个合适的数据结构应该支持两种操作:插入元素. ...

  8. 线段树、二叉堆以及离散化入门

    目录 线段树 例题 题面 练习 1 2 3 4 5 小解区间操作 二叉堆 例题 思路 @ 线段树 例题 题面 时间限制: 1 Sec 内存限制: 128 MB [题意]给出N个数,两种操作:1.C x ...

  9. 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆

    实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 ...

最新文章

  1. 【驱动】linux下I2C驱动架构全面分析
  2. opencv的ROI操作
  3. python csv 中文乱码_python读写csv时中文乱码问题解决办法
  4. 《JS高级程序设计》PART3.对象基础
  5. php 定时缓存,php定时清理缓存文件的简单示例
  6. Facebook授权登录
  7. opencv-api findContours
  8. [aaronyang原创] Mssql 一张表3列的sql面试题,看你sql学的怎么样
  9. 微软关闭Win7所有服务器,微软公布Win7彻底退役时间 将于2020年终止所有支持
  10. Nvidia TX2 使用Intelrealsense L515 并安装 RTABmap建图包编译成功
  11. 解决ImportError: cannot import name ‘soft_unicode‘ from ‘markupsafe‘
  12. 深度学习-85:智慧地球/智慧城市/智慧家庭
  13. 聚类算法OPTICS的理解及实现
  14. gensim 中文语料训练 word2vec
  15. Rdlc报表纵向与横向打印问题
  16. 纯CSS3制作漂亮的价格表
  17. 002_旭日X3派初探:TogetherROS安装
  18. 直播软件开发场景中的用户推广方式——三级分销如何实现
  19. Java毕设项目羽毛球馆场地管理系统计算机(附源码+系统+数据库+LW)
  20. 互联网日报 | 蚂蚁集团科创板IPO获批;拼多多日订单量峰值过亿;美团联名信用卡累计发卡破千万...

热门文章

  1. Objective-C内存管理方式
  2. SCCM 2016 使用PXE 部署操作系统(五)
  3. android圆形图标
  4. pandas导入excel
  5. 一步步解析SVO代码(二)---初始化
  6. 金融贷款行业获客新渠道:贷款行业电销资源如何获取,一手精准客户资源在哪找
  7. CGA建模教程——形状语法(建筑群)
  8. 1. Vue从入门到精通(第一章 vue核心)
  9. Unity克隆物体并控制显隐
  10. docker启动redis简单方法