大数据量场景面试题
假设有10亿手机号,如何快算判断一个手机号是否再其中?
- 无符号整数表示范围 [0,1<<32] 1<<32 = 4294967296 bit = 512M 内存
- 40亿整数 将对应bit设置为1 接着读取要查询的数,查看相应位是否为 1,如果为 1 表示存在,如果为 0 表示不存在
如何再海量数据中找到高频词?
- 有一个 1GB 大小的文件,文件里每一行是一个词,每个词的大小不超过 16B,内存大小限制是 1MB,要求返回频数最高的 100 个词
- 解题思路:
- 遍历文件 对每个字符进行哈希然后取余,拆分成小文件,每个文件均小于1M
- 使用hashMap 进行每个小文件的出现次数统计,同时构建一个最小堆 堆大小为 100。 如果遍历到的词的出现次数大于堆顶词的出现次数 则用新词替换堆顶的词,然后重新调整为小顶堆,遍历结束后,小顶堆上的词就是出现频数最高的 100 个词
- 再构建一个最小堆,分别将每个小文件的堆跟堆顶元素进行比较,比他大则替换
BitMap 原理?
- 在java中,一个int类型占32个比特,我们用一个int数组来表示时未new int[32],总计占用内存32*32bit,现假如我们用int字节码的每一位表示一个数字的话,那么32个数字只需要一个int类型所占内存空间大小就够了,这样在大数据量的情况下会节省很多内存
- 1个int占4字节即4*8=32位,那么我们只需要申请一个int数组长度为 int tmp[1+N/32]即可存储完这些数据,其中N代表要进行查找的总数,tmp中的每个元素在内存在占32位可以对应表示十进制数0~31,所以可得到BitMap表:
- tmp[0]:可表示0~31
- tmp[1]:可表示32~63
- tmp[2]可表示64~95
- 假设这40亿int数据为:6,3,8,32,36,
BitMap 应用?
- 在3亿个整数中找出不重复的整数,限制内存不足以容纳3亿个整数?
- 对于这种场景我可以采用2-BitMap来解决,即为每个整数分配2bit,用不同的0、1组合来标识特殊意思
如00表示此整数没有出现过,01表示出现一次,11表示出现过多次,就可以找出重复的整数了
需要的内存空间是正常BitMap的2倍,为:3亿*2/8/1024/1024=71.5MB
扫描着3亿个整数,组BitMap,先查看BitMap中的对应位置,如果00则变成01,是01则变成11,是11则保持不变,当将3亿个整数扫描完之后也就是说整个BitMap已经组装完毕。最后查看BitMap将对应位为11的整数输出即可
- 某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数?
- 如果用 bit表示一个号码,那么总共需要1亿个bit,总共需要大约10MB的内存
- 把遍历到的电话号码对应的位图中的bit设置为1。当遍历完成后,如果bit值为1,则表示这个电话号码在文件中存在,否则这个bit对应的电话号码在文件中不存在。
- 最后,统计位图中bit值为1的数量,便能得到不同电话号码的个数

那么如何确定电话号码对应的是位图中的哪一位呢?

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?