Top K问题

Top K问题即在海量数据中取得最大的前K个。思考方法如下:

(1)直接全部排序:此方法适用于内存够的情况。当数据量较小的情况下,内存中可以容纳所有数据,则最简单也最容易想到的方法就是将数据全部排序,然后取排序后的数据中的前K个。

(2)快速排序的变形:首先选择一个划分元素,将比这个划分元素大的元素放到它的前面,比划分元素小的元素放到它的后面,此时便完成了一趟排序。如果此时的这个划分元素的下标index刚好等于K,那么这个划分元素以及它左边的数,就刚好是前K个最大的元素;如果划分元素的下标大于K,那么前K大的数在划分元素的下标index的前面,那么就继续使用递归的方法从index-1个数中进行一趟排序;如果index比K小,那么就从index的右边继续进行排序,直到找到index等于K为止。再将前K个数进行排序后,返回Top k个元素。这种方法避免了对除了Top K个元素以外的数据进行排序所带来的不必要的开销。

(3)最小堆法:这是一种局部淘汰法。先读取前K个数,建立一个最小堆。然后将剩余的所有数字依次与最小堆的堆顶进行比较,如果小于或等于堆顶数据,则继续比较下一个,否则,删除堆顶元素,并将新元素插入到堆中,再重新调整最小堆。当遍历完全部数据后,最小堆中的数据即为最大的K个数。

(4)分治法:将全部数据分成N份,前提是每份的数据都能够读到内存中进行处理,找到每份数据中最大的K个数。此时剩下N*K个数,如果内存不能容纳这些数据,则继续分治处理,分成M份,找出每份中最大的K个数,如果M*K个数据仍然不能读到内存中,则继续分治处理。直到剩余的数可以读到内存为止,之后便可以对这些数据使用快排或归并进行处理了。

(5)hash法:如果这些数据中有很多重复的数据,可以先通过hash法,把重复的数去掉。这样如果重复率很高的话,会大大减少内存用量,从而缩小运算空间。处理后的数据如果能够读入到内存中,则可以直接排序,否则可以使用分治法或者最小堆法来处理数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值