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

本文讨论了面试中常见的TopK问题,针对2G大文件和内存限制,提出将文件分割、使用hash表统计单词频率、多线程并行处理和堆排序的解决方案。核心思想在于分治法和数据结构优化。
摘要由CSDN通过智能技术生成

目录

问题解析

问题解答


题解析

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

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

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值