形象理解用堆解决TopK问题

TopK问题[对于堆]

找到N个数里的前K个
高效解法: 
    建一个K个数的堆,求前K个最大值就建小堆/求前K个最小值就建大堆
    [下面以求前K个数的最大值为例]
    初始时,先将列表中的前 K 个数放入堆中,堆的根(堆顶)是当前堆中的最小值。
    然后遍历剩余的元素,如果某个元素比堆顶的最小值还大,就将堆顶元素移除并将该元素插入堆中。
    由于堆的特性,这会使得堆重新调整,从而保持 K 个最大的数在堆中。
    每一次遍历可能把堆的最小值更新的更大,每一次遍历都有贡献。

这个过程可以形象地通过堆顶元素下沉来理解,因为每次替换堆顶元素后,它需要下沉到合适的位置,这就是堆的“下沉”操作。

在这里插入图片描述

把N个数的列表看成一个纸带,让堆在上面跑,比堆最小值大的数自然会下沉到堆里,

有点那种液体密度的感觉,堆的最上面密度最小,如果N列表里密度更大就会自然下沉到堆里合适位置。

这样跑完整个纸带,堆里面的K个值就是整个N列表里最大(“密度最大的K个值了”)

建小堆大数下沉 ,建大堆小的数会下沉

选出最小的几个数
同理,只需要建大堆,然后再遍历一遍N列表,最后堆中只会留下最小的K个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值