二叉堆讲解

二叉堆讲解

大顶堆和小顶堆

从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。
堆性质:父亲的权值不小于儿子的权值(大根堆)。同样的,我们可以定义小根堆。本文以大根堆为例。

由堆性质,树根存的是最大值。
在这里插入图片描述
只要涉及到改变堆结构的操作复杂度为 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值发生变化要根据新值维护对顶堆。
    黑匣子
    中位数

猜你喜欢

转载自blog.csdn.net/qq_57150526/article/details/130725689