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