主题
面试速答(先看这里)
**一句话结论:**所谓的哈希分片,其实是一种典型的分治思想。
60秒标准回答:
从1TB的日志中找到搜索量最高的10个关键词,暴力统计肯定也行,但是面试官肯定不想听这个答案
一个比较典型的方案就是: 哈希分片+大根堆+统计
所谓的哈希分片,其实是一种典型的分治思想。通过哈希的方式,将相同关键词分配到同一分片,便于统计全局次数
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**从1TB的日志中找到搜索量最高的10个关键词,暴力统计肯定也行,但是面试官肯定不想听这个答案。
- **要点2:**一个比较典型的方案就是: 哈希分片+大根堆+统计
- **要点3:**一般是选择一个相对均匀的哈希函数,比如murmurhash,然后遍历日志文件,将每一个搜索的关键词通过哈希计算分散到不要固定数量的分片文件上(可以大一点,比如几百个,或者1000个都可以)。
- **要点4:**接下来,就可以针对每个文件,逐行读取关键词并使用哈希表统计词频。
- **要点5:**因为每个中间文件按次数降序排列的,那么我们就读取每个文件的第一个关键词(即当前分片的最大次数),将其加入最大堆。
**记忆锚点:**哈希分片+大根堆+统计 → 关键词分配到同一分片 → murmurhash → 到不要固定数量的分片 → 所谓的哈希分片 → 即当前分片
易错提醒:
- 一般是选择一个相对均匀的哈希函数,比如murmurhash,然后遍历日志文件,将每一个搜索的关键词通过哈希计算分散到不要固定数量的分片文件上(可以大一点,比如几百个,或者1000个都可以)。
加分表达:
- 从1TB的日志中找到搜索量最高的10个关键词,暴力统计肯定也行,但是面试官肯定不想听这个答案。
- 通过哈希的方式,将相同关键词分配到同一分片,便于统计全局次数。
追问准备:
- 围绕「哈希分片+大根堆+统计」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「关键词分配到同一分片」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「murmurhash」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
从1TB的日志中找到搜索量最高的10个关键词,暴力统计肯定也行,但是面试官肯定不想听这个答案。
一个比较典型的方案就是:哈希分片+大根堆+统计
所谓的哈希分片,其实是一种典型的分治思想。通过哈希的方式,将相同关键词分配到同一分片,便于统计全局次数。
一般是选择一个相对均匀的哈希函数,比如murmurhash,然后遍历日志文件,将每一个搜索的关键词通过哈希计算分散到不要固定数量的分片文件上(可以大一点,比如几百个,或者1000个都可以)。这样就能确保同一个关键词可以落到同一个分片文件中。
接下来,就可以针对每个文件,逐行读取关键词并使用哈希表统计词频。将统计结果按次数降序排序后保存为中间文件。
因为每个中间文件按次数降序排列的,那么我们就读取每个文件的第一个关键词(即当前分片的最大次数),将其加入最大堆。再使用一个最小堆维护当前前10高频词,初始为空。
然后开始循环执行:
- 从最大堆中取出当前全局最大次数候选(记为
关键词K,次数C)。 - 若前10堆(最小堆)未满,直接加入;若已满且
C > 堆顶最小值,则替换堆顶。 - 若
C ≤ 堆顶最小值且前10堆已满,提前终止(后续关键词次数只会更小)。 - 从
K所在分片文件读取下一个关键词,更新最大堆。
- 输出结果:最终前10堆中的关键词即为全局Top 10。