堆—特殊二叉树

我们了解了树形结构之后,知道了二叉树,但是二叉树的具体用途我们还是不知道,今天就来看看一种特殊的二叉树–堆,它是一种完全二叉树,著名的topK问题就是用堆来求取的。可以求出一组数中的最大或者最小的元素。所使用的堆就是大根堆、小根堆,所谓大根堆就是根结点的值大于左右子树节点的值,反之就是小根堆了。先建个堆给大家看看,这里以建大堆为例,建堆呢,它有两个方法,向下调整和向上调整。
在这里插入图片描述
输入一个数组进行测试:
在这里插入图片描述
从结果可以看出我们的建堆操作成功,下面来看向上调整:
在这里插入图片描述

在这里插入图片描述
同样输入数组进行测试:
在这里插入图片描述
看完建堆之后,我们来看看用堆实现的优先级队列:

优先级队列
测试结果如下:
在这里插入图片描述
来看看topK问题:给出100(N)亿个数字,要求出前1000(M)大的数字,有两种解决方案:
方法一:用一个数组保存这些数字,直接在这个数组上建大堆,循环1000次取堆顶元素+调整操作,就能得到前1000大的元素,时间复杂度为o(N)+o(MlogN)。
方法二:先取集合中的前1000个元素放到一个数组中,建立一个小堆(堆顶元素就是前1000大元素的守门员)。再一个一个遍历集合中的数字,依次和守门员进行比较,如果这个元素比守门员大,就把守门员删掉(调整堆),再把当前元素入堆(调整堆),当把所有元素都遍历完之后,堆中的元素就是前1000大元素,时间复杂度为o(M)+o(N
logM)。
在topK问题中N远远大于M,把M看做1的话,得出二者时间复杂度差不多,但是使用方法1,内存可能不足,所以普遍使用方法2,它的运行效率也更高。举个简单的例子
在这里插入图片描述
在这里插入图片描述
关于堆的问题,就讲到这。大家如果想看堆排序,我在算法中的七大排序中有说明哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值