海量数据场景面试题:出现频率最高的 100 个词

news/2024/11/15 12:11:44/文章来源:https://www.cnblogs.com/qimoxuan/p/18308579

题目描述

假如有一个 1G 大小的文件,文件里每一行是一个词,每个词的大小不超过 16 bytes,要求返回出现频率最高的 100 个词。内存限制是 10M。

解法1

由于内存限制,所以我们没有办法一次性把大文件里面的所有内容一次性读取到内存中去。

对此我们可以采用分治的策略来实现,把一个大文件分解成多个小文件,保证每个文件的大小小于 10 M,进而直接将单个小文件读取到内存中进行处理。

第一步,首先遍历一遍大文件,对遍历到的每个词 x ,执行 hash(x)% 500,将结果为 i 的词存放到文件 f(i)中,遍历结束之后,可以得到 500 个小文件,每个小文件的大小为 2 M 左右;
第二步,接着统计每个小文件中出现频率最高的 100 个词。可以用 HashMap 来实现,其中 key 为词,value 为该次出现的频率。(示意代码)

BufferedReader br = new BufferedReader(new FileReader(fin));
String line = null;
while ((line = br.readLine()) != null) {if(map.containsKey(line)){map.put(line,map.get(x) + 1)}else{map.put(line,1);}
}br.close();

对于遍历到的词 x,如果在 map 中不存在,则执行 map.put(x,1)。

若存在,则执行 map.put(x,map.get(x) + 1),将该词出现的次数 + 1。

第三步,在第二步中找出了每个文件出现频率最高的 100 个词之后,通过维护一个小顶堆来找出所有小文件中出现频率最高的 100 个词。

具体方法是,遍历第一个文件,把第一个文件中出现频率最高的 100 个词构建成一个小顶堆。

如果第一个文件中词的个数小于 100,可以继续遍历第二个文件,直到构建好有 100 个结点的小顶堆为止。

继续遍历其他小文件,如果遍历到的词的出现次数大于堆顶词的出现次数,可以用新遍历道的词替换堆顶的词,然后重新调整这个堆位小顶堆。

当遍历完所有小文件后,这个小顶堆中的词就是出现频率最高的 100 个词。

总结

总结一下,这个解法的主要思路如下:采用分治的思想,进行哈希取余使用 HashMap 统计每个小文件单词出现的次数使用小顶堆,遍历步骤 2 中的小文件,找到词频 top 100 的单词。

很容易就会发现一个问题,如果第二步中,如果这个 1 G 的大文件中有某个词的频率太高,可能导致小文件大小超过 10 M,这种情况该怎么处理呢?

在此疑问上,我们提出了第二种解法。

解法2

第一步:使用多路归并排序堆大文件进行排序,这样的话,相同的单词一定是紧挨着的。

多路归并排序对大文件排序的步骤如下:将文件按照顺序切分成大小不超过 2 M 的小文件,总共 500 个小文件使用 10 MB 内存分别对 500 个小文件中的单词进行排序使用一个大小为 500 的堆,对 500 个小文件进行多路排序,然后将结果写到一个大文件中。

其中第三步,对 500 个小文件进行多路排序的思路如下:初始化一个最小堆,大小就是有序小文件的个数 500。堆中的每个节点存放每个有序小文件对应的输入流。按照每个有序文件中的下一行数据对所有文件输入流进行排序,单词小的输入文件流放在堆顶。拿出堆顶的输入流,并且将下一行数据写入到最终排序的文件中,如果拿出来的输入流还有数据的话,那么就将这个输入流再次添加到栈中。否则说明该文件输入流中没有数据了,那么可以关闭这个流。循环这个过程,直到所有文件输入流中没有数据为止。

第二步:初始化一个 100 个节点的小顶堆,用于保存 100 个出现频率最高的单词。遍历整个文件,一个单词一个单词地从文件中读取出来,并且进行计数。等到遍历的单词和上一个单词不同的话,那么上一个单词及其频率如果大于堆顶的词的频率,那么放在堆中。否则不放。

最终,小顶堆就是出现频率前 100 的单词了。

小结

解法 2 相对于解法 1,其更加严谨,如果某个词词频过高或者整个文件都是同一个单词的话,解法 1 不适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/745525.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Loki的API接口

参考 Loki HTTP 接口 |Grafana Loki 文档 状态接口 这些 HTTP 端点由所有组件公开,并返回组件的状态:GET /ready GET /log_level GET /metrics GET /config GET /services GET /loki/api/v1/status/buildinfo$ curl 127.0.0.1:3100/ready ready$ curl 127.0.0.1:3100/log_lev…

单体模式部署Loki服务

将Loki的所有微服务组件打包部署到单一进程中 适合小规模系统的日志存储场景(每天不超过100G) 在必要时,可部署共享外部对象存储的多实例进行水平扩容在配置文件loki.yaml的ring配置段中定义日志数据的跨实例分发支持高可的部署方式多个实例需要配置共享的外部对象存储 需要…

DTO转VO工具

data工具,实现了对象拷贝 DTO -> VOdata工具,实现了对象拷贝 DTO -> VO 只需要实现一个类即可 data-utils data工具,实现了对象拷贝DTO —> VO 解决的问题 Mapstruct需要安插件!!!!很多云桌面等会很不方便org.springframework.beans.BeanUtils有一个 copyPropertie…

【Python】公众号聚合登录软件+源码

废话不多说了,直接上图,回复拿软件和源码【自己打包,配置环境比较复杂】 写这个软件就是因为其他平台的会员太贵了,还不如自己写个,不限制账号登录数~授权,打开和删除功能都是正常的, 面板功能,我打算做一个单独的页面【但是不知道做啥,就先放这里,希望各位老板提供想…

HuggingFace Transformers

HuggingFace Transformers https://www.hugging-face.org/hugging-face-transformers-2/Hugging Face Transformers has been built by, with, and for the community. Reaching 100k on GitHub is a testament to ML’s reach and the community’s will to innovate and cont…

函数式接口的使用

介绍 Consumer、Supplier、Predicate与Function 接口的使用Consumer 的使用(顾客) Consumer 翻译过来的意思就是消费者,很容易理解,它就是一个只负责消费的接口。相当于你是一个餐馆的顾客,你只负责吃你点的食物。在项目中一些不需要返回值,只负责消费的方法可以用过 Con…

Go语言之函数(func)进阶篇

目录一.init初始化函数1 初始化函数作用2 初始化函数定义案例2.1 初始化项目2.2 utils.go源代码2.3 main.go源代码二.匿名函数1 匿名函数概述2 匿名函数案例三.闭包函数1 闭包函数概述2 闭包函数案例之返回上级函数内部变量3 闭包函数案例之返回上级函数形参变量4 闭包函数返回…

linux命令入门指南

linux命令入门指南 (个人学习所用,雷同之处请忽略) 关于linux 服务器种类物理服务器 需要机房(零度、无尘、无静电)--防止机器短路,数据丢失。(建造自己的机房或者进行托管) 自己的服务器需要维护。 云服务器 由服务器厂商提供(阿里云、腾讯云)--省钱、有人维护 vmwa…

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块

1.算法仿真效果 本程序系统是《m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序》的的升级。升级前原文链接增加了完整的AWGN信道模型的FPGA实现,可以在testbench里面设置SNR,分析不同SNR对应的FPGA误码率情况。vivado2019.2仿真结果如下(完整…

【总结】逻辑运算在Z3中运用+CTF习题

国际赛IrisCTF在前几天举办,遇到了一道有意思的题目,特来总结。题目并不是很难,没有复杂的ollvm混淆也没有复杂的加密,但是却一步一步引导我们去学习和总结。国际赛IrisCTF在前几天举办,遇到了一道有意思的题目,特来总结。题目附件如下:📎babyrevjohnson.tar 解题过程…

在Python中使用SWCNN去除水印

在Python中使用SWCNN去除水印 说明首次发表日期:2024-07-17 SWCNN Github官方仓库: https://github.com/hellloxiaotian/SWCNN SWCNN 论文链接: https://arxiv.org/abs/2403.05807准备 运行环境 首先创建一个conda环境,安装SWCNN官方建议的库: conda create -n py39torch …

Xilinx NVMe AXI4主机控制器,AXI4接口高性能版本介绍

NVMe AXI4 Host Controller IP可以连接高速存储PCIe SSD,无需CPU,自动加速处理所有的NVMe协议命令,具备独立的数据写入和读取AXI4接口,不但适用高性能、顺序访问的应用,也适用于随机访问的应用,同时结合外部存储器(比如DDR),使得Host端的数据访问管理更加灵活。NVMe A…