其他分享
首页 > 其他分享> > [Top-K] 海量数据的Top-K问题/出现频率Top-K问题

[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的数组(不推荐)

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

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

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

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

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

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

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

标签:文件,匹马,25,海量,Top,TOP3,问题
来源: https://blog.csdn.net/GxDong_/article/details/115217951