分享一道网上很火的面试题:40亿QQ号,不超过1G的内存,如何去重?
开头直接上干货:40亿个QQ号塞进电脑,内存只给1G,这题听着就离谱!但真有人用个小技巧搞定了——位图,原理简单到像小学生画格子签到。
---
一、为啥常规方法行不通?
1. 日常去重咋做?
一般人会想到用`HashSet`,把QQ号往里一丢,重复的自动过滤。
2. 但内存炸了!
40亿个QQ号,每个占4字节,总内存需要约15GB;如果是8字节,直接飙到30GB。可题目只给1G内存,硬塞肯定崩。
---
二、神操作:用位图省空间
1. 位图是啥?
想象一张超大的签到表:
- 每个格子代表一个QQ号。
- 如果这个QQ号来过,就在格子里画个勾;没来就空着。
→ 关键点:一个格子只占1个bit,比存QQ号本身省了几十倍空间。
2. 40亿QQ号要多少内存?
签到表需要40亿个格子:
```
40亿 bit ÷ 8 = 5亿字节
476MB ÷ 1024 ≈ 0.46GB
```
不到0.5GB就能搞定! 完美满足1G限制。
3. 操作三步走:
- 第一步:准备一张40亿格子的签到表。
- 第二步:遍历所有QQ号,每看到一个号,就在对应格子画勾。
- 第三步:扫一遍签到表,把画了勾的格子对应的QQ号记下来——这些就是去重后的结果。
---
三、位图的优缺点
- 优点:
✅ 省内存:40亿数据只用半G,爽!
✅ 速度快:找号码、画勾都是秒完成。
✅ 操作简单:像查签到表一样直观。
- 缺点:
❌ 号码不能太分散:如果QQ号最大到1万亿,格子就得预留1万亿个,内存直接涨到125GB,血亏。
❌ 只能记“来过”:想统计某个号来了几次?做不到。