堆排序和TopK问题

堆是一种很有趣的数据结构,有最大堆和最小堆两种形式,在上一篇文章里已经讲到了最大最小堆的建立;

这里用一下堆的方法解决问题。

     1.首先是在一大堆数字中找到K个最大或最小的数字(topK问题)

topK问题是生活中很常见的问题;比如找到N个在某个科目成绩最好的同学,或者在很多游戏中都会有很多数据分析结果,年度评价之列的都是什么游戏时间最长啦,与你开黑时间最多的K个小伙伴啦,都会用到。

若是用普通的方式遍历所有元素,让元素个数很大,几亿或者几十亿,每次遍历出一个数都要比较K个数,则时间复杂度为N*K,K个数有序的话这个复杂度会少,但是排一个序也需要很多时间复杂度。所以这里可以利用堆最大K个数我们可以用这K个数组成一个最小堆(最小堆算的上是一个不完整的排序),堆顶则是这K个数中最小的数,新来的数只要比这K个数中最小的大即可入堆;再次调整堆,消耗的时间复杂度也不高(lg  K)。所以使用堆求TopK 时间复杂度只有 O(K*lgK)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值