【常用算法:排序篇】3.二叉堆全解析:高效维护集合最值的终极武器

在这里插入图片描述

二叉堆(Binary Heap)是一种基于完全二叉树实现的数据结构,能够高效维护集合中的最大值或最小值。其核心特性是插入、删除最值的操作时间复杂度均为 O(log n),而获取最值仅需 O(1),是优先队列、堆排序等算法的基石。

1、二叉堆的核心特性

1. 结构性质

  • 完全二叉树:所有层除最后一层外均填满,最后一层从左到右填充。
  • 数组表示:无需指针,通过索引计算父子节点:
    • 父节点索引:parent(i) = (i-1) // 2
    • 左子节点索引:left_child(i) = 2i + 1
    • 右子节点索引:right_child(i) = 2i + 2

2. 堆序性质

  • 最大堆:父节点值 ≥ 子节点值(维护最大值)。
  • 最小堆:父节点值 ≤ 子节点值(维护最小值)。

2、完全二叉树与二叉堆的关系

1.完全二叉树

  • 节点从上到下、从左到右连续填充,可用数组存储
  • 父节点索引 i,左子节点索引 2i,右子节点索引 2i+1
    在这里插入图片描述

2.二叉堆

  • 基于完全二叉树,分为大顶堆(父节点值 ≥ 子节点)和小顶堆(父节点值 ≤ 子节点)。
  • 核心作用:动态维护集合中的最大值或最小值,时间复杂度为 O(log n)
    在这里插入图片描述

3、堆的四种核心操作

1. 插入元素(Insert)

  • 步骤
    • 将新元素插入数组末尾。
    • 上浮(Sift Up):若新元素破坏堆序,则与其父节点交换,递归上浮至根。
  • 时间复杂度:O(log n)。
  • 代码示例(最大堆):
    • def insert(heap, value):
          heap.append(value)
          current = len(heap) - 1
          while current > 0:
              parent = (current - 1) // 2
              if heap[current] <= heap[parent]:
                  break
              heap[current], heap[parent] = heap[parent], heap[current]
              current = parent
      

2. 删除最值(Extract)

  • 步骤
    • 将堆顶元素(最值)与末尾元素交换并移除。
    • 下沉(Sift Down):新堆顶与其较大子节点交换,递归下沉至叶子。
  • 时间复杂度:O(log n)。
  • 代码示例(最大堆):
    • def extract_max(heap):
          if not heap:
              re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无心水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值