1、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
比较好的方案:
使用Hash表做统计,使用堆做排序。
即利用O(N) 的时间复杂度将查询串计数,按照将哈希表的数据遍历放入长度为10 的小顶堆中(排序度量是其查询次数),最后得到的就是所求。
时间复杂度:o(N)+o(M)*logk 其中N 为 1000w M至多为300W k为10
2、 一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。
思路:可以思考假设你能够在内存中放下的数据量如何找到钱10个出现的词,首先利用hash表统计个数,然后利用最小堆做记录。然后利用哈希函数将大文件分割成为可以放入内存的小文件,然后分别计算小文件的前10,最后统一得到整个文件的前10个经常出现的词。
3、一台普通PC,2G内存,要求处理一个包含40亿个不重复并且没有排过序的无符号的int整数,给出一个整数,问如果快速地判断这个整数是否在文件40亿个数据当中?
4、中位数