如何从大量数据中找出高频词

题目描述:

有一个 1GB 大小的文件,文件里面每一行是一个词,每个词的大小不超过 16B,内存大小限制是 1MB,要求返回频数最高的 100 个词。

分析与解答:

由于文件大小为 1GB,而内存大小只有 1MB,因此不可能一次把所有的词读入到内存中处理,需要采用分治的方法,把一个大的文件分解成多个小的子文件,从而保证每个文件的大小都小于 1MB,进而可以直接被读取到内存中处理。具体的思路如下:
1)遍历文件。对遍历到的每一个词,执行如下 hash 操作:hash(x)%2000,将结果为 i 的词存放到文件 ai 中,通过这个分解步骤,可以使每个子文件的大小为 400KB 左右。如果这个操作后某个文件的大小超过 1MB 了,那么就可以采用相同的方法对这个文件继续分解,直到文件的大小小于 1MB 为止。
2)统计出每个文件中出现频率最高的 100 个词。最简单的方法为,使用 hash_map 来实现,具体实现方法:遍历文件中的所有词,对于遍历到的词,如果在 hash_map 中不存在,那么把这个词存入 hash_map 中(键为这个词,值为 1),如果这个词在 hash_map 中已经存在了,那么把这个词对应的值加 1。遍历完后可以非常容易地找出出现频率最高的 100 个词。
3)第 2)步找出了每个文件出现频率最高的 100 个词,这一步可以通过维护一个小顶堆来找出所有词中出现频率最高的 100 个。具体方法:遍历第一个文件,把第一个文件中出现频率最高的 100 个词构建成一个小顶堆(如果第一个文件中词的个数小于 100,可以继续遍历第二个文件,直到构建好有 100 个结点的小顶堆为止)。继续遍历,如果遍历到的词的出现次数大于堆顶上词的出现次数,可以用新遍历到的词替换堆顶的词,然后重新调整这个堆为小顶堆。当遍历完所有文件后,这个小顶堆中的词就是出现频率最高的 100 个词。当然这一步也可以采用类似归并排序的方法把所有文件中出现频率最高的 100 个词排序,最终找出出现频率最高的 100 个词。
引申:怎么在海量数据中找出重复次数最多的一个?
前面的算法是求解 top100,而这道题目只是求解 top1,可以使用同样的思路来求解。唯一不同的是,在求解出每个文件中出现次数最多的数据后,接下来从各个文件中出现次数最多的数据中找出出现次数最多的数,不需要使用小顶堆,只需要使用一个变量就可以完成。方法很简单,此处不再赘述。

原文地址:https://www.cnblogs.com/hardy-wang/p/13072925.html