6.堆
堆
- 定义:完全二叉树的一种特定应用
特征:
- 最底层节点靠左填充,其他层的节点都被填满(完全二叉树特性)。
- 根节点称为“堆顶”,将底层最靠右的节点称为“堆底”。
- 对于大顶堆(小顶堆),堆顶元素(根节点)的值是最大(最小)的。
堆分类:
- 小顶堆:任意节点的值≤其子节点的值
- 大顶堆:任意节点的值≥其子节点的值
堆的实现方案:
- 完全二叉树非常适合用数组来表示。由于堆正是一种完全二叉树,因此我们将采用数组来存储堆。
- 当使用数组表示二叉树时,元素代表节点值,索引代表节点在二叉树中的位置。节点指针通过索引映射公式来实现:
- 给定索引 i ,其左子节点的索引为 2i + 1 ,右子节点的索引为 2i + 2 ,父节点的索引为 (i − 1)/2(向下整除)。* 当索引越界时,表示空节点或节点不存在(满二叉树时不会出现不存在节点)。
常见操作(根队列基本一样):
方法名 | 描述 | 时间复杂度 |
---|---|---|
push() |
元素入堆 | O(log n) |
pop() |
堆顶元素出堆 | O(log n) |
peek() |
访问堆顶元素(对于大 / 小顶堆分别为最大 / 小值) | O(1) |
size() |
获取堆的元素数量 | O(1) |
isEmpty() |
判断堆是否为空 | O(1) |
建堆操作:
- 基于入堆实现O(nlogn)
- 基于遍历实现O(n)
- 将列表所有元素原封不动地添加到堆中,此时堆的性质尚未得到满足。
- 倒序遍历堆(层序遍历的倒序),依次对每个非叶节点执行”从顶至底堆化”。
- 每当堆化一个节点后,以该节点为根节点的子树就形成一个合法的子堆
应用:
- 优先队列
- 堆排序
- 最大的k个元素 TOP-K
TOP-K问题:
- 基于堆的方案:
- 初始化一个小顶堆,其堆顶元素最小
- 先将数组的前 k 个元素依次入堆。
- 从第 k + 1 个元素开始,若当前元素大于堆顶元素,则将堆顶元素出堆,并将当前元素入堆。
- 遍历完成后,堆中保存的就是最大的 k 个元素。
本文作者:navyum
本文链接:https://www.cnblogs.com/navyum/p/18509356
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步