题目描述:
搜索引擎会通过日志文件把用户每次检索使用的字符串记录下来,每个查询串的长度为1~255B。假设目前有1000万个记录(这些查询串的复杂度比较高,虽然总数是1000万,但如果出去重复后,那么不超过300万个。一个查询串的复杂度越高,说明查询它的用户越多,也就是越热门的10个查询串,要求使用的内存不能超过1GB.
分析:
每个查询串的最长为255B,1000万个字符串需要占用2.55内存,因此无法将所有的字符串读入内存中处理。
解法:
方法一:分治法
对字符串进行设置一个bash函数,通过这个hash函数把字符串划分到更小的文件中,从而保证每个小文件中的字符串都可以直接加载到内存中处理,然后求出每个文件中出现的次数最多的10个字符串,最后通过一个小顶堆统计出所有的文件中出现次数最多的10个字符串。
解法分析:功能方法可行,但由于要对文件遍历两次且hash函数要被调用1000次所以性能不是很好
方法二:字典法
虽然字符串比较多,但是由于字符串的种类不超过300万个,因此可以考虑把所有字符串出现的次数保存为一个字典中(键为字符串,值为字符串出现的次数)字典所需要的空间为300万*(255+4)=3MB*259=777MB(其中&