堆
线性表描述
大根树、小根树
- 大根树: 每个节点都大于其子节点的树。
- 子节点个数可以大于2
大根堆、小根堆
- 定义:既是大根树(小根树),又是完全二叉树
大根堆插入策略
-
将新元素插入编号为 m+1 的位置
-
从n+1 号位置开始,沿该位置到根的路径,判断新元素能否放在该位置,能结束,不能则将父节点上的元素下移到该位置,当前位置上移到父节点。继续判断
-
时间复杂度 O(log n)
大根堆删除
- 时间复杂度 O(log n)
大根堆的初始化
- 进行n次插入操作, O(n logn)
- 必要时对数进行调整的方法构造, θ ( n ) \theta(n) θ(n)
使用数组存储完全二叉树
- 从数组中最右一个有孩子的结点开始,元素位置为 i = n/2
- 循环 i 从 n/2 到 1 ,重构 i 号元素为根的子树称为大根堆
- 时间复杂度 O(n)
左高树
左高树,一种适合与实现优先级队列的链表结构。
左高树,适合优先级队列的合并
- 高度优先左高树 HBLT 最大/最小HBLT
- 重量优先左高树 WBLT 最大/最小WBLT
扩充二叉树: 增加了外部节点的二叉树
- S(x) 为任一节点 x 到他子树的外部接待你的所有路径中,最短的一条路径长度 S(x) =2
s(x) = min{s( L) ,s( R)} + 1
HBLT
-
定义 高度优先左高树: 当且仅当一棵二叉树的任何一个内部节点,其左孩子的s值大于等于右孩子的s值时,该二叉树为高度优先左高树
-
定义 最大HBLT :同时使最大树的HBLT
最大HBLT 插入、删除
- 插入:构建单独的一棵 最大HBLT,然后合并
- 删除:删除根节点,将左右子树HBLT合并
合并HBLT
实际上,合并也是一个递归的过程
初始化最大HBLT
- 方法一 n 次插入 O(n logn)
- 方法二:
- 创建n个最大HBLT ,每个树包含一个元素,这n棵树 构成了FIFO队列
- 一次删除队列中两个最大HBLT,合并,然后加入队列末尾
时间复杂度 O(n)
WBLT
-
重量 w(x),以 x 为根的子树内部节点数
-
重量优先左高树: 对二叉树的任一内部节点,左孩子w值 大于右孩子 w值。
-
最大WBLT : 既是WBLT又是大根树
应用
堆排序
霍夫曼编码
-时间复杂度 O(n logn) 因为每次从堆中取数 O(log n)