在很多的大规模数据处理中,经常会遇到的一类问题就是在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这种问题被称为top K问题,例如在搜索引擎中,统计搜索搜索最热门的10个查询词或者统计下载率中下载最多的东西。
对于top K类 问题一般有两种方法:
1.分治+Trie树
2.hash+小顶堆
举例说明:有1亿个浮点数,如何找出其中最大的10000个?
第一种方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法时间复杂度为O(nlogn),例如快速排序。而在32位机器上,每个float类型占4B,1亿个浮点数就要占用400M的存储空间。而且我们只找出最大的1万个数并不是全部排序所以我们会做很多无用功。
第二种方法局部淘汰法,该方法与排序方法类似,用一个容器保存前1万个树,然后将剩余的所有数字一一和容器内最小的数字比较,如果后续元素比容器内的最小元素大就删掉容器内的最小元素,并将该元素插入容器,最后遍历玩这1亿个数,得到最终结果。
第三种分治法:将1亿个数据分成100份,每份100万个数据,找出每份数据中最大的1万个,最后在剩下的100 X 10000个数据。也就是100万个数据里面找前1万。在这里使用快速排序,将数据分成两堆如果大的那堆个数N大于10000个,继续对大堆快速排序依次。意思就是在100万个数据中找出倒数第1万个就行了。
第四种hash法:如果1一个数中有很多重复的数,先通过hash法,把这1亿个数字去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间,然后通过分治法或最小堆
海量数据top K问题
最新推荐文章于 2024-05-13 09:45:00 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)