从海量数据中找出最大的前K个数
一个基本的是思想是分治法,将1亿个数据分成100份,每份100万个数据,找出每份中最大的100个,最终可以在这100*100个数据中找出最大的100个。
快速排序法
我们知道,快排一次的结果是分界点前面的数据比他小,分界点后的比他大,我们可以做如下的讨论
如果分界点后面的数据个数大于k个,那么可以在后面的数据中重复上述过程
如果分界点后面的数据个数小于k个,其个数为m个,那么可以在前面的数据中找到k-m个最大的
因此,我们总可以在这一堆数据中找到前k个比较大的
基于小顶堆来实现TopK
容易证明,小顶堆的堆顶元素是最小的,维护一个K个数据的小顶堆,依次读入一个元素,若元素大于堆顶元素,则将堆顶元素移除,当前元素插入堆顶,并进行调整。
基于优先级队列来实现
维护一个K长的优先级队列,不断把优先级低的数组出队,最终剩下来的就是前k个最大的
在海量数据中找出出现频率最高的前K个数
在这个问题中,我们需要构造一个map来统计频率,然后问题转化为计算value值属于钱k大的问题,这时可以套用基本的TopK问题
参考文献:十道海量数据处理面试题与十个方法大总结