堆的存储结构可以想象成一个数组,索引i为顶点,2i为左节点,2i+1为右节点,堆是一种特殊的树,首先它是一个完全二叉树,其次每个顶点要么大于等于,要么小于等于其叶子节点。叶子节点均靠左排列。
堆的应用场景
top k 问题
堆是维护动态集合最值的利器,需要从业务场景中分析是用大顶堆还是小顶堆, 如top k, 需要维护一个小顶堆,数据到来时,判断是否大于堆顶元素,如果大于将堆顶元素替换堆顶元素,然后重新堆化,从堆顶元素开始堆化,可能会使堆的结构产生空洞,可以采用尾插法,将新来的元素插入堆尾,然后堆尾与堆顶交换重新堆化。
优先级队列
维护一个大顶堆,每次从堆顶弹出队列,在重新堆化。 优先级队列的使用场景学习是重点
中位数
将数组数据一分二,前半部分较小的数据建立大顶堆, 后半部分交大数据建小顶堆,始终保持大顶堆的数据 大于等于小顶堆的数据,当数据个数为奇数时大顶堆的堆顶就是中位数,当为偶数时小顶堆的堆顶为中位数。
堆排
如何在原数组中建堆。
堆排的过程就是不断的将堆顶与堆尾元素交换(可以理解为弹出),然后在将 剩下的数据重新堆化,在重复交换动作。
- 本文作者: 李宏伟
- 本文链接: https://blog.chuangketime.com/2023/04/03/堆/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!