堆的性质

大根堆的定义:父节点的值大于等于子节点的值。
小根堆的定义类似

大根堆的示意图:
堆.jpg

堆的存储:堆是「完全二叉树」,所以可以使用数组存储

堆的维护

删除堆顶元素

删除堆顶元素后,会将堆中最后一个元素填充到堆顶位置,然后通过「Adjust Down」的操作将这个元素调整到适合的位置。

Adjust Down根节点的左右子树已经是堆了,只需要不断地让当前元素下降即可。
堆 - 图2

向堆中增加元素

将新元素放在堆的最后,然后通过「Adjust Up」操作将该元素调整到合适的位置

Adjust Down:前方的结点已经是堆,只需要让当前节点不断向上即可。
堆 - 图3

初始化堆

从下到上的建立方法

  • 初始序列可以构成「完全二叉树」,元素数量为 堆 - 图4
  • 从第 堆 - 图5 个元素开始向前调整:当前节点的子树已经是堆了,将当前元素当作根节点,进行「Adjust Down」操作即可。

image.png

初始化的时间复杂度:堆 - 图7

以满二叉树为例,共 堆 - 图8 层,节点数量 堆 - 图9 个。从第 堆 - 图10 层开始调整,调整到第 堆 - 图11 层,每层共 堆 - 图12 个节点,每个节点最多需要 堆 - 图13 次调整,共需要调整次数为: 堆 - 图14堆 - 图15,则有:堆 - 图16 因此:堆 - 图17,即 堆 - 图18 复杂度

从上到下的建立方法:从第 堆 - 图19 个元素开始向后调整:当前节点的前方已经是堆了,问题等价于不断地将第 堆 - 图20 个节点加入到前方的堆中。不断进行「Adjust Up」操作即可。

堆的应用

  • 优先队列的实现:堆直接就是优先队列。
  • 堆排序
  • 大规模数据,求最大的前多少个数:使用大根堆实现。