【概念速通】堆 什么是堆,如何建堆,堆能干嘛


💎 定义:什么是大根堆 / 小根堆

  • 大根堆: 一棵完全二叉树 & 堆序性为:每个节点 ≥ 它的子节点
    • 🐾 后续说明以大根堆为例,小根堆同理但反之操作即可
  • 小根堆: 一棵完全二叉树 & 堆序性为:每个节点 ≤ 它的子节点
如何用一维数组存储堆
  • 堆可以用一个一维数组存储,对于节点 i
    • 左子节点下标为 2i +1
    • 右子节点下标为 2i +2

💎 基本操作: 下滤 上滤

下滤:把根节点向下调整的操作,复杂度 O(log N)

在这里插入图片描述

  • 如果破坏堆序性的元素小于他的最大子节点,则与之交换;持续比较&交换,直到该元素大于他的子节点为止
    • 此时,重新被调整成为了一个大根堆
上滤:把最后一个元素向上调整的操作,复杂度 O(log N)
  • 主要用于插入新元素到堆中
  • 如果破坏堆序性的元素大于他的父节点,则与之交换;持续比较&交换,直到该元素小于他的父节点为止
    • 此时,重新被调整成为了一个大根堆

💎 建堆:自上向下 & 自下向上

自上向下 复杂度为 O(N log N),对应上滤操作
  • 将元素利用上滤,一个一个插入到堆内
自下向上 复杂度为 O(N),对应下滤操作
  • 自下向上,下滤每个父节点

💎 应用:优先队列 & 堆排序

优先队列:小根堆
  • 小根堆根节点本来就是最小元素,直接弹出根节点可完成 弹出最小元素操作;弹出后要将剩余的元素调整为堆 (将最后一个元素放到根节点,然后下滤):弹出复杂度 O(N log N)
  • 插入操作直接应用上滤即可完成:插入复杂度 O(N log N)
    在这里插入图片描述
堆排序:将优先队列的所有元素依次弹出即可
  • 考虑到空间复杂度:进一步,排序的结果可以存放到空缺的堆单元里
  • 大根堆,每次弹出的元素存储到最后,这样排序完的序列是正序
    • 以第一步为例:弹出 10,放入 最后一个元素的位置 (初始时 2 所在);然后刚好本来 2 就要移入根节点的位置,刚好空缺出
......

B站视频参考:【从堆的定义到优先队列、堆排序】 10分钟看懂必考的数据结构——堆】

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值