搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串 的长度为1-255字节。假设目前有一千万个记录, 这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个 。一个查询串的重复度越高,说明查询它的用户越多, 也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。 (1)请描述你解决这个问题的思路; (2)请给出主要的处理流程,算法,以及算法的复杂度。
分析:直接放到内存需要的空间 255*1000 0000 = 255 * 10M = 2.5G (内存限制1G)
去重复后300 0000 * 255 = 255 * 3M < 1G
考虑用Hash
Hash值为MD5值,长度为32字节16进制串
字串数 hash值 在文件中的位置 频度
这样:300 0000 * (32 + 32 + 32) = 3M * 96 < 300M
实际使用大概就是这个值左右
1 扫描文件生成Hash表
读字串 --> MD5 -->记录位置 更新频度
2 查找频度最高的10个
用系统提供的快速排序
3 根据记录的位置找到相应的字串
要了解MD5算法