[Top-K] 海量数据的Top-K问题/出现频率Top-K问题

描述

最近在面试中有被问到,Top-K的相关问题,在此做以总结,希望对后续面试的小伙伴有帮助

题目要素

1.海量数据(大数量,小内存)
2.排名前K
变体:海量数据的词频问题


例子

先举一个比较有趣的例子。
已知现在有25匹马,5条赛道,假设不考虑马的疲劳问题,不可以使用计时器记录每一匹马的时间。最少需要多少次比赛才能选出25匹马中的TOP3。

答案:7次
思路:
❗ 解决此类问题,脑海中一定要从哪些马没有资格成为TOP3的思想出发。
首先,对25匹马进行5次比赛,淘汰每一组中排名靠后的两匹马,因为这些马没有资格成为TOP3

目前剩余马数 : 25 - 2 * 5 = 15

其次,对每一组跑的最快的进行1次比赛,从5匹马中找到最快的一匹,并淘汰跑的慢的那两匹马和所在组的全部马。因为这些马都没有资格成为TOP3;

目前剩余马数 :15 - 2 * 3 = 9

最后,对于目前的9匹马,我们已经确定了第一匹马,既Top1,那么,在该组中只有排名第2和排名第3的马,有机会成为TOP3,在上一轮排名第二的马所在组,只有排名第1的马和排名第2的马有机会成为TOP3,在上一轮排名第三的马所在组,只有排名第1的马才有可能成为TOP3。
那么这个问题就变成了,在5匹马中找前2,只需要在比较1次就可以了。

所以一共需要比5+1+1 = 7 次。如果没有看懂,不妨画一个二维矩阵理解一下。

重点

1.海量数据的TOP-K问题

对于海量数据的TOP-K问题的主要有以下三种思想:

  1. 小顶堆
  2. 长度为K的数组(不推荐)
  3. 分治

步骤:
思路1:首先,将大文件分组(hash)分为若干个小文件;其次,对于每一个内存可以接受的小文件进行分组,从每一组中选取K个最大的元素;最后,重复以上步骤,直到可以直接比较。

思路2:先建立K个元素的小顶堆;遍历大文件(随机拆成小文件后遍历)。

2.海量数据的词频问题。

该问题主要分为两个过程:

  1. 每一个词的出现次数的统计
  2. 出现次数TOP-K问题

对于过程2,上边的方法已经可以解决。重点来说一下过程1。

步骤
首先,将大文件分为一个个小文件;其次,对每一个小文件遍历,将各个小文件按照一定规律(hash或前缀)放入另一批小文件;再次,对每一个小文件遍历,统计好每个词出现的次数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值