目录
问题解析
这是一个典型的top k问题,在面试的时候,会产生很多变体。
但是不管怎么变,top k问题的本质是一样的。
另外,对于这类问题,我们可以发散自己的思维去回答,因为这类问题本身没有啥标准答案。
面试官更多的是去考察候选人的技术思维和技术积累,因此大胆一点回答没有关系。
这个问题的关键因素有两个:
1. 2G大小的文件,意味着文件很大并且也无法一次性load到内存里面
2. 需要从这么大的文件中做筛选,如果用普通的思维方法,查找速度很慢因此可以从这两个方面着手去思考回答思路。
问题解答
1. 把2G的文件进行分割成大小为512KB小文件,总共得到2048个小文件,避免一次性读入整个文件造成内存不足。
2. 定义一个长度为2048的hash表数组,用来统计每个小文件中单词出现的频率。
3. 使用多线程并行遍历2048个小文件,针对每个单词进行hash取模运算分别存储到长度为2048的hash表数组中
inthash=Math.abs(word.hashCode()%hashTableSize);
hashTables[hash].merge(word,1,Integer::sum);
4. 接着再遍历这2048个hash表,把频率前100的单词存入小顶堆中
5. 最后,小顶堆中最终得到的100个单词,就是top 100了。
这种解决方案的核心思想是将大文件分割为多个小文件,然后采用分治和堆的算法,来解决这个问题。