出现频率最高的100个词
假如有一个 1G 大小的文件,文件里每一行是一个词,每个词的大小不超过 16 bytes,要求返回出现频率最高的 100 个词。内存限制是 10M。
-
哈希分治
这个解法的主要思路如下:
- 采用分治的思想,进行哈希取余
- 使用 HashMap 统计每个小文件单词出现的次数
- 使用小顶堆,遍历步骤 2 中的小文件,找到词频 top 100 的单词。
很容易就会发现一个问题,如果第二步中,如果这个 1 G 的大文件中有某个词的频率太高,可能导致小文件大小超过 10 M,这种情况该怎么处理呢?
在此疑问上,我们提出了第二种解法。
-
多路归并问题
多路归并排序对大文件排序的步骤如下:
- 将文件按照顺序切分成大小不超过 2 M 的小文件,总共 500 个小文件
- 使用 10 MB 内存分别对 500 个小文件中的单词进行排序
- 使用一个大小为 500 的堆,对 500 个小文件进行多路排序,然后将结果写到一个大文件中
场景 | 哈希分片法 | 排序法 |
---|---|---|
某个词占50% | 可能分片失败需二次处理 | 天然支持,直接连续计数 |
内存消耗 | 需同时处理多个小文件 | 只需维护一个全局堆 |
实现难度 | 简单(类似分快递) | 复杂(需多路归并) |
适用场景 | 常规数据分布 | 极端数据分布(如热搜词统计) |