数据结构与算法学习系列-3-常见的数据结构-堆

堆是一种特殊的数据结构,表现为完全二叉树,分为大顶堆和小顶堆。堆的主要操作包括堆化、插入、删除,常用于堆排序、TopK问题、优先队列等。堆的插入和删除操作具有O(logn)的时间复杂度。堆的实现有两种主要方式,一种是从下向上建堆,另一种是从后向前建堆。在应用中,堆可用于解决大规模数据的排序和查找问题。
摘要由CSDN通过智能技术生成

概念

符合以下两点的就是堆:

1.堆是一个完全二叉树
2.堆中每一个结点的值都必须大于等于(或小于等于)其子树中每个结点的值
都大于等于的叫大顶堆,都小于等于的叫小顶堆

堆存储

由于堆是一个完全二叉树,比较适合用数组存储
可以使用下标方便找到左右子结点和父结点
如图所示,对于结点1的结点,其左子结点的下标就是1*2,右子结点的下标就是1*2+1,父结点下标就是i/2
在这里插入图片描述

常见操作

以大顶堆为例,小顶堆同理

1.堆化图

方向分为从下到上和从上到下,这里以从下到上为例:
每次在数组最后添加一个元素,依次让新插入的结点和父亲节点进行比较,如果大于其父结点则交换,直到其小于等于父结点
在这里插入图片描述

2.插入元素

给堆中插入一个元素,则进行上述的堆化,从而保证堆的特性

3.删除

大顶堆的堆顶元素就是该数组的最大值,当删除堆顶元素之后,就需要把第二大的元素放到堆顶以继续符合大顶堆的定义。
根据堆的定义可知,第二大元素一定在左右子结点中,然后再依次迭代处理第二大元素所在的子结点,直到叶子结点被删除。
但是这种思路会出现不符合二叉树的问题
如图所示
在这里插入图片描述
实际上的堆的解决思路:
把最后一个元素移到堆顶,然后进行堆化,避免出现数组空洞造成不符合满二叉树的问题

4.空间复杂度

上述的插入删除的操作的空间复杂度都是堆高,也就是O(logn)

堆的实现

建堆两种思路:

  • 1.在数组的基础上,从下标1开始,依次插入2.3.n的元素,类似上面的插入过程,从前向后处理数据, 每个数据插入的时候,从下往上堆化,这种处理效率为O(nlogn)
  • 2.从后向前处理数组,并且每个数据从上往下进行堆化,考虑叶子结点往下堆化只能是自己,因此从非叶子结点堆化,时间复杂度为0(n)
堆的应用
1.堆排序

包括建堆和排序,
将下标n/2到1的节点,依次从上到下的堆化操作,
然后将数组中的数据组织成堆,接下来迭代处理将堆顶的元素放到堆的末尾,并将堆的大小减1,然后再堆化,重复这个过程,直到元素剩下一个,此时数组就是有序的

2.TopK

大数据中选出 TopK(静态数据、动态数据),如从几十亿条订单日志中选出金额靠前的 1000 条数据

3.优先队列
4.中位数
常考面试题
  • 1.10GB 文件,计算机只有 512MB 大小的可用内存,如何按照字符串大小,给这个 10GB 的大文件排序
  • 2.静态数据求中位数
  • 3.动态数据求中位数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lobster爱前端

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

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

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

打赏作者

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

抵扣说明:

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

余额充值