数据结构简介
堆的分类
1. 二叉堆(堆)
- 定义
二叉堆是完全二叉树或者是近似完全二叉树. - 时间复杂度
平均O(logN) - 二叉堆特性
- 结构特性:是一颗完全二叉树
- 堆序特性:父节点大于或等于其各子节点(最大堆);父节点小于或等于其各子节点(最小堆)
- 堆常用操作
- 建堆:
(1)将N项插入堆中:执行N次插入操作
(2)将N项任意放入一颗空树中:放入完成后,从最后一个非叶子节点开始执行下浮操作 - 插入:在尾部插入,采用上浮策略
- 删除最值:删除根节点,将最后一个节点放到根节点位置,采用下浮策略
- 堆其他操作(以最小堆为例)
- 降低关键字的值:采用上浮策略
- 增加关键字的值:采用下浮策略
- 删除除堆中的某个关键字:先执行1,降低无穷大的差值,再执行删除最值操作
2. d堆
- 定义
d堆是二叉堆的简单推广,像一个二叉堆,只是所有节点有d个儿子 - 使用场景
用法与B树用法相似,d堆高度低,适用于主存存不下的情况
3. 左式堆
- 定义
又称作最左堆、左倾堆,是堆的一种,保留了堆的结构性和堆序性 - 时间复杂度
插入 删除 合并: O(logN) - 特点
- 结构性:任一节点的零路径长比它的诸儿子节点的零路径长的最小值多1. 不再是一棵完全二叉树(Complete tree),而且是一棵极不平衡的树
- 堆序性:任意结点的值比其子树任意结点值均小(最小堆的特性)
- 使用场景
适用于合并(merge)较多的场景 - 左式堆代码
4. 斜堆
- 定义
是左式堆的自调节形式,是具有堆序的二叉树,不存在对树的结构性的限制 - 时间复杂度
对任意M次连续操作,总的最坏情形运行时间是O(MlogN),摊还开销为O(logN) - 特点
堆序性:任意结点的值比其子树任意结点值均小(最小堆的特性) - 使用场景
适用于合并(merge)较多的场景
5. 二项队列
- 定义
二项队列不同于左式堆和二叉堆等优先队列的实现之处在于,一个二项队列不是一棵堆序的树,而是堆序树的集合,即森林.堆序树中的每棵树都是由约束形式的,叫做二项树. - 时间复杂度
合并 插入 删除:最坏的时间复杂度O(logN), 但是插入的平均时间复杂度O(1) - 使用场景
适用于合并(merge)和插入较多的场景 - 二项队列代码