一线大厂面试真题-在2G大小的文件中,找出高频top100的单词

题解析

这是一典型的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了。

这种解决方案的核心思想是将大文件分割为多个小文件,然后采用分治和堆的算法,来解决这个问题。

一线大厂面试真题-在2G大小的文件中,找出高频top100的单词_第1张图片

你可能感兴趣的:(一线大厂面试题,面试,职场和发展,开发语言,java,分布式)