前言
通常的编程学习中,我们都会接触到堆这种树结构,本篇博客主要讨论最常见的二叉堆,并将其和斐波那契堆与二项堆进行一些比较。
二叉堆的定义
二叉堆顾名思义是形如二叉树的堆,而且是完全二叉树,不过其底层实现通常都是用的数组。因为如果将其从上到下,从左到右依次从1开始编号,正好可以填满数组的前部分,更重要的是实现简单高效,编号此时即为数组索引。如下图即为一个最大堆:
对于第i个节点,其父母索引为:i / 2;
其左孩子索引为:2i,右孩子索引为:2i + 1。
二叉堆的特性和用途
堆有最大堆和最小堆两种,前者中父节点关键字总是比左右孩子大,同时左子堆和右子堆也是这样;后者反之。
堆最大的用于是用来实现优先级队列,根据最大堆和最小堆之分,则可以有最小优先级队列和最大优先级队列
此外,还可以用来实现堆排序,本篇博客不讨论。
二叉堆的操作
1、insert:向堆中插入一个元素,并保持堆的特性;
2、maximum:返回堆中最大关键字;
3、extractMax:抽取堆中的最大关键字,并保持堆特性;
3、increaseKey:增加某一节点的关键字值,并保持堆的特性。
inset
算法流程: