美文网首页
动画 | 什么是二叉堆?

动画 | 什么是二叉堆?

作者: 我脱下短袖 | 来源:发表于2020-01-27 14:11 被阅读0次

二叉堆的解释

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

file

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

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

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

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

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

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

展示最大堆
file

用数组存储二叉堆,堆的顶点下标可以从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:单向复制
file
Code:交换法
file

取出堆中最大的元素siftDown

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

动画siftDown

算法动画视频 地址

Code:siftDown单向复制
file
Code:siftDown交换法
file

构建二叉堆

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

动画:构建二叉堆

算法动画视频 地址

Code
file

喜欢本文的朋友,微信搜索「算法无遗策」公众号,收看更多精彩的算法动画文章

相关文章

  • 动画 | 什么是二叉堆?

    二叉堆的解释 (动态选择优先级最高的任务执行) 堆,又称为优先队列。虽然名为优先队列,但堆并不是队列。堆和队列是两...

  • 二叉堆

    二叉堆(英语:Binary Heap)Wiki 动画演示: VisuAlgo 特点 是完全二叉树 父节点总是大于等...

  • 二叉树(二)-二叉堆

    1.什么是二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:...

  • 二叉堆

    二叉堆定义 二叉堆是一种特殊的堆, 二叉堆是完全二叉树或者近似完全二叉树. 二叉堆满足堆特性: 父节点的键值总是保...

  • HeapSort学习笔记

    完全二叉树 堆排序 什么是堆(Heap)? 堆本质上是一棵二叉树,而且是完全二叉树。 (注:从严格意义上讲,堆可以...

  • 二叉堆的Python实现

    二叉堆(binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的...

  • 二叉堆与优先队列

    二叉堆 什么是二叉堆?二叉堆本质上是一种完全二叉树,它分为两个类型。 最大堆。最大堆的任何一个父节点的值,都大于或...

  • 认识二叉堆

    什么是二叉堆? 二叉堆本质上是一种完全二叉树( 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引...

  • 编程马拉松 Day05 堆、二叉堆、堆排序

    堆 堆排序需要用到二叉堆,在开始之前,我们先来了解一下什么是二叉堆。 当二叉树满足满足如下条件时,我们说这个二叉树...

  • 二叉堆(Binary Heap)

    什么是二叉堆 二叉堆是一颗特殊的二叉树(完全二叉树) 父节点一定都不大于左右节点(小顶堆) 树的每一层都从左到右一...

网友评论

      本文标题:动画 | 什么是二叉堆?

      本文链接:https://www.haomeiwen.com/subject/gjcethtx.html