Top-K问题

1 直接全部排序

这种方法只适用于数据量较小、内存中可以容纳所有数据的情况。

将数据全部按降序排序,然后取排序后的数据中的前K个。

即使内存能够满足要求,该方法将全部数据都排序了,而题目只要求找出Top-K个数据,所以该方法并不十分高效,不建议使用。

2 快速排序的变形

这种方法无需对所有元素进行排序,只需要找出前K个最大的就行。

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

3 最小堆法

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

4 分治法

将全部数据分成N份,前提是每份的数据都可以读到内存中进行处理,找到每份数据中最大的K个数。此时剩下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、付费专栏及课程。

余额充值