如何从大量数据中找出高频词?

题目描述

有一个 1GB 大小的文件,文件里每一行是一个词,每个词的大小不超过 16B,内存大小限制是 1MB,要求返回频数最高的 100 个词(Top 100)。

解答思路

由于内存限制,我们依然无法直接将大文件的所有词一次读到内存中。因此,同样可以采用分治策略,把一个大文件分解成多个小文件,保证每个文件的大小小于 1MB,进而直接将单个小文件读取到内存中进行处理。

更多技术文章、面试资料、工具教程,还请移步:http://www.javatiku.cn/

思路如下

首先遍历大文件,对遍历到的每个词 x,执行 hash(x) % 5000 ,将结果为 i 的词存放到文件 ai 中。遍历结束后,我们可以得到 5000 个小文件。每个小文件的大小为 200KB 左右。如果有的小文件大小仍然超过 1MB,则采用同样的方式继续进行分解。

接着统计每个小文件中出现频数最高的 100 个词。最简单的方式是使用 HashMap 来实现。其中 key 为词,value 为该词出现的频率。具体方法是:对于遍历到的词 x,如果在 map 中不存在,则执行 map.put(x, 1) ;若存在,则执行 map.put(x, map.get(x)+1) ,将该词频数加 1。

上面我们统计了每个小文件单词出现的频数。接下来,我们可以通过维护一个小顶堆来找出所有词中出现频数最高的 100 个。具体方法是:依次遍历每个小文件,构建一个小顶堆,堆大小为 100。如果遍历到的词的出现次数大于堆顶词的出现次数,则用新词替换堆顶的词,然后重新调整为小顶堆,遍历结束后,小顶堆上的词就是出现频数最高的 100 个词。

更多技术文章、面试资料、工具教程,还请移步:http://www.javatiku.cn/

方法总结

  1. 分而治之,进行哈希取余;

  2. 使用 HashMap 统计频数;

  3. 求解最大的 TopN 个,用小顶堆;求解最小的 TopN 个,用大顶堆

#春招算法#
全部评论

相关推荐

10-14 11:22
华东师范大学
点赞 评论 收藏
分享
#软件开发笔面经#10.22更新 已约三面------------------------------------------------------ 岗位: 前端开发工程师时间:10.18 66分钟超级难,应该是面过最难的一次,不愧是抖音记录几个印象很深的问题1.微信小程序的同构渲染2.同构渲染一些场景题,问多种解决思路3.jsbridge底层原理4.微信小程序怎么做到跨端5.react native原理6.mvvm,react怎么去实现mvvm7.面向对象思想,js  class原理,没有class怎么去实现面向对象三大特性8.react hooks原理,fiber原理9.为什么要hooks10.函数为什么要有状态11.什么是副作用,为什么要清除它12.iframe怎么解决unity3d嵌套到网页?13.js跟native通信的一种最简单的方式,发送的时候和拦截的时候分别说14.项目其实吟唱了10分钟很多基础问题我已经记不住了。然后是手撕环节,7分钟两道题手撕mid2分钟秒了,面试官“你做那么快,那还有时间欸”然后再出了一道easy反问环节,作为刚入行前端的校招生,怎么最有性价比地学习前端知识?这里面试官回答了5分钟,给了非常多建议。最后面试官让我记得更新简历,把实习项目写在简历上,因为三面偏向项目。嘿嘿,非常棒的一个小哥哥,遇到我不会的不是直接跳过,而是说“没关系,我们发散一下,我相信你一定能想得到”面试完收到了灵犀互娱hr面的邮件幸福来的太突然引流:字节跳动 阿里巴巴 腾讯 美团 百度 快手 京东 拼多多 小红书 B站 网易 携程 腾讯音乐
陪人钓鱼的小蚯蚓很快乐:校友,我也是正德职业的
点赞 评论 收藏
分享
评论
点赞
4
分享
牛客网
牛客企业服务