二叉堆讲解
大顶堆和小顶堆
从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。
堆性质:父亲的权值不小于儿子的权值(大根堆)。同样的,我们可以定义小根堆。本文以大根堆为例。
由堆性质,树根存的是最大值。
只要涉及到改变堆结构的操作复杂度为
O
(
l
o
g
(
n
)
)
O(log(n))
O(log(n))
查询操作
O
(
1
)
O(1)
O(1)
应用
贪心
合并果子
建筑抢修
维护固定大小的单调序列
假设对于给定序列,最终要输出k最小值,则用大顶堆维护
具体步骤是:
- 如果堆中元素个数没有超过k,则继续添加
- 如果堆中元素个数要超过k了,则添加进去后再弹出堆顶元素
- 最终取个逆序即可。
最小函数值
序列合并
维护不固定大小的单调序列
介绍对顶堆
对顶堆由一个大根堆与一个小根堆组成,小根堆维护大值即前 k 大的值(包含第 k 个),大根堆维护小值即比第 k 大数小的其他数。
这两个堆构成的数据结构支持以下操作:
- 插入元素:若插入的元素大于等于小根堆堆顶元素,则将其插入小根堆,否则将其插入大根堆,然后维护对顶堆;
- 查询第k大元素:小根堆堆顶元素即为所求;(如果查询第k小元素则大根堆维护小值前k小的值,小根堆维护大值比第k小数大的其他数)
- 删除第k大元素:删除小根堆堆顶元素,然后维护对顶堆;
- 维护:当小根堆的大小小于 k 时,不断将大根堆堆顶元素取出并插入小根堆,直到小根堆的大小等于 k;当小根堆的大小大于 k 时,不断将小根堆堆顶元素取出并插入大根堆,直到小根堆的大小等于 k;
- 当k值发生变化要根据新值维护对顶堆。
黑匣子
中位数