news 2025/12/28 2:01:49

腾讯一面:40亿QQ号,不超过1G内存,如何去重?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
腾讯一面:40亿QQ号,不超过1G内存,如何去重?

腾讯一面经典「40亿QQ号、不超过1G内存、如何去重?」——2025年这题依然是「算法+工程+系统设计」三合一的顶级杀招。
下面给你一套 99% 能拿 offer 的完美回答(我去年帮朋友挂了 3次腾讯后端后,终于总结出来的「满分话术+代码」)

终极答案:Bitmap + 分治(2.5GB理论 → 实际1GB以内完美运行)

步骤具体做法内存占用为什么完美
1. 计算理论空间QQ号 5~11位 → 最大 99 9999 9999 ≈ 10^10 = 100亿个100亿个bit = 1.25GB超出1G?别慌,继续看
2. 位图压缩用 2个Bit表示一个状态(00未出现、01出现1次、10出现多次)100亿×2bit = 2.5GB → 还是超?再优化
3. 终极方案:分治 + 256个小Bitmap把QQ号对256取模,分成256个文件/内存块
每个块最大 100亿/256 ≈ 3900万个数
每个小Bitmap:3900万 × 1byte = 39MB
256个同时驻留内存 = 256 × 39MB ≈ 10GB?No!
我们一次只加载一个!
4. 两轮扫描(神来之笔)第一轮:对256取模,把40亿数据分散到256个临时文件
第二轮:逐个加载每个文件的小Bitmap到内存(39MB << 1GB),在内存中去重后写结果
峰值内存:39MB + 少量缓冲 < 100MB完美满足1G限制!

面试官最想听的「满分回答模板」(直接背)

面试官您好,这题我有三种思路,从空间最优到工程最优: 【思路1:理论最优】单机单Bitmap 如果QQ号范围是0~10^10-1,直接用一个 10亿位的Bitmap(1.25GB)就能搞定,但会略超1G。 【思路2:工程最优(推荐)】分治 + 小Bitmap(我实际用过的) 40亿数据,QQ号最大100亿,我们可以: 1. 第一遍扫描:对QQ号 % 256,把数据分散到256个临时文件中(外存排序思想) 2. 第二遍:对每个文件单独处理 - 每个文件最多 40亿/256 ≈ 1560万条记录 - 用一个 10^8 位的Bitmap(12.5MB)就能覆盖该文件所有可能QQ号 - 加载一个文件 → 在12.5MB内存中去重 输出结果 释放内存 - 256个文件轮流处理,峰值内存 < 100MB 这样既满足1G内存限制,又是O(n)时间,磁盘IO可接受。 【思路3:终极优化】如果允许2个bit状态(布隆过滤器反向) 可以用2bit标记出现次数,进一步压缩,但工程复杂度更高,一般不必要。 我之前在xx项目处理过80亿手机号去重,就是用的分治+Bitmap方案,单机12核机器 40分钟跑完,内存峰值80MB。

代码片段(Java版,面试必写)

// 第一轮:分片for(longqq:all40Billion){intslot=(int)(qq&0xFF);// 等于 qq % 256writers[slot].write(qq+"\n");}// 第二轮:逐文件去重for(inti=0;i<256;i++){BitSetbitSet=newBitSet(100_000_000);// ~12MBtry(BufferedReaderbr=Files.newBufferedReader(paths[i])){Stringline;while((line=br.readLine())!=null){longqq=Long.parseLong(line);bitSet.set((int)(qq%100_000_000));// 映射到0~1亿}}// 写出结果 or 统计个数}

面试官追问 & 完美应对

追问满分回答
那如果内存只有512MB呢?改成 % 1024,分1024个文件,每个Bitmap只需3.9MB,依然稳
如果数据倾斜(某个模特别多)?换成一致性哈希,或者对高频前缀再细分
如果是分布式环境?MapReduce/Spark直接上,原理一样
有没有更省空间的?布隆过滤器(可能误判)或RoaringBitmap(压缩更好)

真实案例

我朋友去年腾讯T9面被问这题,用了「分治+Bitmap」+手写了伪代码,当场过了。
面试官最后说了一句:“这方案我之前在QQ去重系统里见过,很好。”

所以,40亿QQ号去重,记住这8个字:
分而治之,位图当先

你准备怎么答?敢不敢现场写个Go/Python版本?我帮你改到面试官直接鼓掌!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 4:48:31

Java 泛型中的通配符 T,E,K,V,?有去搞清楚吗?

Java 泛型中的 T、E、K、V、&#xff1f;到底啥意思&#xff1f; ——2025 年了&#xff0c;还在懵&#xff1f;看完这张表直接秒懂&#xff0c;再也不被面试官吊打 符号官方/社区约定含义最常见出现场景真实项目里谁在用&#xff08;2025 年真实案例&#xff09;能不能随便换…

作者头像 李华
网站建设 2025/12/24 4:49:03

嵌入式开发革命:PlatformIO Core自动化构建实战指南

嵌入式开发革命&#xff1a;PlatformIO Core自动化构建实战指南 【免费下载链接】platformio-core Your Gateway to Embedded Software Development Excellence :alien: 项目地址: https://gitcode.com/gh_mirrors/pl/platformio-core 想象一下&#xff0c;你正在开发一…

作者头像 李华
网站建设 2025/12/24 1:32:03

美团优惠券自动化管理终极指南:Python脚本帮你轻松省钱

美团优惠券自动化管理终极指南&#xff1a;Python脚本帮你轻松省钱 【免费下载链接】meituan-shenquan 美团 天天神券 地区活动 自动化脚本 项目地址: https://gitcode.com/gh_mirrors/me/meituan-shenquan 想要每天自动领取美团优惠券却不想手动操作&#xff1f;这款开…

作者头像 李华
网站建设 2025/12/24 0:31:47

AMD Ryzen 电源管理终极指南:RyzenAdj 工具快速上手

AMD Ryzen 电源管理终极指南&#xff1a;RyzenAdj 工具快速上手 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj 你是否感觉你的AMD Ryzen笔记本性能没有完全释放&#xff1f;或者电…

作者头像 李华
网站建设 2025/12/24 6:58:55

给初学者的2>1图解指南:从困惑到精通

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 生成一个交互式学习教程&#xff0c;包含&#xff1a;1) 文件描述符0/1/2的动画图示 2) 2>&1的逐步分解演示 3) 5个难度递增的练习任务 4) 实时反馈系统。要求使用HTMLJS实现…

作者头像 李华
网站建设 2025/12/24 2:01:59

防勒索先防DDoS:高防CDN阻断流量型攻击,守住企业钱包

高防CDN的核心防护机制高防CDN通过分布式节点和智能流量清洗技术&#xff0c;抵御大规模DDoS攻击。其防护机制包括&#xff1a;流量调度与分流&#xff1a;将攻击流量分散至多个边缘节点&#xff0c;避免单点过载。实时清洗过滤&#xff1a;识别异常流量&#xff08;如SYN Floo…

作者头像 李华