堆的介绍
堆的简介
堆(Heap)是一种特殊的树形数据结构,满足以下性质:
- 它是一个完全二叉树。
- 即每一层从左到右完全填满,除了最后一层的节点可以不满,但必须从左到右排列。
- 堆的性质:
- 每个节点的值总是满足一定的顺序关系:
- 最大堆(Max Heap):每个节点的值都大于等于其子节点的值。
- 最小堆(Min Heap):每个节点的值都小于等于其子节点的值。
- 每个节点的值总是满足一定的顺序关系:
堆常用于实现优先队列以及高效的排序算法(如堆排序)。
堆的分类
-
最大堆(Max Heap):
- 根节点是整个堆中最大的元素。
- 子节点的值总小于或等于父节点的值。
- 应用:优先队列中的最大优先级。
示例:
1
2
3
4
550
/ \
30 20
/ \ /
15 10 8 -
最小堆(Min Heap):
- 根节点是整个堆中最小的元素。
- 子节点的值总大于或等于父节点的值。
- 应用:优先队列中的最小优先级。
示例:
1
2
3
4
55
/ \
10 15
/ \
20 30
堆的操作
1. 插入
-
过程:
- 将新元素插入堆的最后一层,保持完全二叉树的性质。
- 调整堆(上浮操作):
- 比较新元素与其父节点的值,若违反堆的性质,交换位置。
- 重复此过程,直到堆的性质恢复。
-
时间复杂度:( O(\log n) )(树的高度)。
2. 删除
-
删除堆顶元素(最大堆的最大值或最小堆的最小值)。
-
过程:
- 将堆的最后一个元素移动到堆顶,删除原堆顶元素。
- 调整堆(下沉操作):
- 比较新堆顶与其子节点的值,若违反堆的性质,交换位置。
- 重复此过程,直到堆的性质恢复。
-
时间复杂度:( O(\log n) )。
3. 堆化
-
**堆化(Heapify)**是将一个无序数组调整为堆的过程。
-
过程:
- 从最后一个非叶子节点开始向上调整子树,确保每个子树都满足堆的性质。
- 最终整个树成为一个堆。
-
时间复杂度:( O(n) )(对每个节点调整的代价逐层减少)。
4. 堆排序
堆排序是一种基于堆的数据排序算法。
-
过程:
- 将数组构建为一个最大堆。
- 取出堆顶元素(最大值)放到数组末尾,并将剩余元素重新调整为最大堆。
- 重复此过程,直到所有元素排序完成。
-
时间复杂度:( O(n \log n) )。
-
空间复杂度:( O(1) )(原地排序)。
堆的实现
堆通常用数组来实现,因其结构是完全二叉树,可以通过数组索引轻松定位节点关系:
- 对于数组中的索引 ( i ):
- 父节点:( \text{parent}(i) = \lfloor (i-1)/2 \rfloor )
- 左子节点:( \text{left}(i) = 2i + 1 )
- 右子节点:( \text{right}(i) = 2i + 2 )
示例(最大堆):
数组表示:[50, 30, 20, 15, 10, 8]
对应的树:
1 | 50 |
堆的应用场景
-
优先队列:
- 堆常用于实现优先队列,能够高效获取和删除优先级最高的元素。
-
排序算法:
- 堆排序利用堆的特性,实现高效的排序。
-
图算法:
- 最短路径算法(如Dijkstra)和最小生成树算法(如Prim)需要用堆来维护优先队列。
-
操作系统:
- 堆数据结构用于处理任务调度、内存分配等。
-
实时数据流:
- 用堆维护动态数据的Top K问题,如查找动态数据流中的最大或最小值。
总结
- 堆是一种完全二叉树,分为最大堆和最小堆。
- 它支持高效的插入、删除和优先级操作,广泛应用于优先队列、排序和图算法等领域。
堆排序的实现
1 |
|
代码解析
-
heapify
函数:- 将以
root
为根的子树调整为最大堆。 - 递归地保证子树满足堆的性质。
- 将以
-
构建最大堆:
- 从最后一个非叶子节点开始(
n/2 - 1
),逐层向上调整堆。 - 时间复杂度为 ( O(n) )。
- 从最后一个非叶子节点开始(
-
排序过程:
- 每次将堆顶(最大值)与末尾元素交换。
- 减少堆的有效范围,并对剩余部分重新调整为最大堆。
- 每次调整的时间复杂度为 ( O(\log n) ),总共 ( n ) 次操作,因此排序复杂度为 ( O(n \log n) )。
运行示例
输入数组:
1 | 12, 11, 13, 5, 6, 7 |
排序过程:
- 构建最大堆:
1 | 13 |
- 提取最大值:
1 | 交换 13 和 7,然后调整剩余部分: |
- 重复,直到排序完成:
输出:
1 | 5, 6, 7, 11, 12, 13 |
特点
- 时间复杂度:( O(n \log n) )。
- 空间复杂度:( O(1) )(原地排序)。
- 适用场景:需要稳定性能、不依赖额外存储的排序任务。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 WinstonChen's Homepage!
评论