欲望以提升热忱,毅力以磨平高山!|

navyum

园龄:4个月粉丝:0关注:0

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)

建堆操作:

  1. 基于入堆实现O(nlogn)
  2. 基于遍历实现O(n)
    • 将列表所有元素原封不动地添加到堆中,此时堆的性质尚未得到满足。
    • 倒序遍历堆(层序遍历的倒序),依次对每个非叶节点执行”从顶至底堆化”。
    • 每当堆化一个节点后,以该节点为根节点的子树就形成一个合法的子堆

应用:

  • 优先队列
  • 堆排序
  • 最大的k个元素 TOP-K

TOP-K问题:

  • 基于堆的方案:
    1. 初始化一个小顶堆,其堆顶元素最小
    2. 先将数组的前 k 个元素依次入堆。
    3. 从第 k + 1 个元素开始,若当前元素大于堆顶元素,则将堆顶元素出堆,并将当前元素入堆。
    4. 遍历完成后,堆中保存的就是最大的 k 个元素。

本文作者:navyum

本文链接:https://www.cnblogs.com/navyum/p/18509356

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   navyum  阅读(2)  评论(0编辑  收藏  举报
//自己上传到博客园的js
点击右上角即可分享
微信分享提示