算法通关村十四关:青铜-堆结构

青铜挑战-堆结构

堆结构:重要的基础数据结构

明确什么类型的题目可以用堆,以及如何用堆来解决

堆的构造和维护过程都非常复杂

1.堆的概念与特征

1.1基本概念

堆:是将一组数据按照 完全二叉树 的存储顺序,将数据存储在一个一维数组中的结构。

完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

堆有两种结构:大顶堆、小顶堆(其他叫法:大根堆、小跟堆,最大堆、最小堆)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

父子之间关系的建立,节点下标为i

  • i=0时,为跟节点
  • i>=1时,父节点为(i-1)/2
1.2堆与优先队列

优先队列和堆不是一个同level的概念
Java的PriorityQueue就是堆实现的,Java领域可以认为堆就是优先级队列,优先级队列就是堆,换做其他场景则不行

2.堆的构造过程

使用数组构造堆时,先按照层次将所有元素依次填入二叉树中,使其成为二叉树,然后再不断调整,最终使其符合堆结构

  1. 将元素依次排到完全二叉树节点上去
  2. 找到下标为 (size-2)/2 = 4的节点i,调整其位置,满足堆性质
  3. 找到i-1节点,调整位置,满足堆性质
  4. 重复上述,直到调整完跟节点

3.插入操作

插入规则

  1. 将元素插入到保持其为完全二叉树的最后一个位置
  2. 然后顺着这条支路一直向上调整,每前进一层就要保证其子树都满足堆否则就去处理子树,直到完全满足要求

4.删除操作

堆本身比较特殊,一般对堆中进行删除操作都是针对堆顶的元素

直接删除堆顶,整个结构被破坏了,实际策略是先将堆中的最后一个元素(加入为A)和堆顶元素进行替换,然后删除堆中最后一个元素。
之后再从根开始逐步与左右比较,谁更大谁上位。
然后A再继续与子树比较,如果有更大的继续交换,直到自己所在的子树也满足大顶堆

形象比喻:
皇上突然驾崩了,这时候先找个顾命大臣维持局面,大臣先看左右两个皇子谁更强谁就是老大。然后大臣自己再逐步隐退,直到找到属于自己的位置。

5.总结

堆的价值体现
大顶推的根节点是整个树最大的那个,增加时会根据根的大小来决定要不要加,删除操作只删除根元素。

为什么堆的效率比较高?
堆元素的数量是有限制的,一般不用将所有元素都放到堆里

后面题目中可以看到,在序列中找k大,则堆的大小就是k;如果k个链表合并,那么堆就是k。

堆的口诀
查找:找大用小,大的进;找小用大,小的进。
排序:升序用小,降序用大。

口诀解释:
找K大,则用小堆,后序数据只有比根元素更大时才允许进入堆。
找K小,则用大堆,后序数据只有比根元素更小时才允许进入堆。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值