在 2G 大小的文件中,找出高频 top100 的单词

“在 2G 大小的文件中,找出高频 top100 的单词?” 这是一个典型的 top k 问题,在面试的时候,会产生很多变体。 但是不管怎么变,top k 问题的本质是一样的。 另外,对于这类问题,我们可以发散自己的思维去回答,因为这类问题本身没有啥标准答案。 这个问题的关键因素有两个:
  • 2G 大小的文件,意味着文件很大并且也无法一次性 load 到内存里面
  • 需要从这么大的文件中做筛选,如果用普通的思维方法,查找速度很慢
因此可以从这两个方面着手去思考回答思路。

思路

关于这个问题,我说一下我的回答思路
  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 了。
这种解决方案的核心思想是将大文件分割为多个小文件,然后采用分治和堆的算法,来解决这个问题。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值