海量数据top K问题

在大规模数据处理中,Top K问题至关重要,如找出出现频率最高的前K个数或最大K个数。常见解决方案包括分治+Trie树、hash+小顶堆、局部淘汰法、分治法和最小堆法。这些方法适用于不同的场景,如单机单核、单机多核、内存受限等。具体应用时需根据实际情况选择合适策略。
摘要由CSDN通过智能技术生成

  在很多的大规模数据处理中,经常会遇到的一类问题就是在海量数据中找出出现频率最高的前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亿个数字去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间,然后通过分治法或最小堆

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值