主题
面试速答(先看这里)
**一句话结论:**40亿个 unsigned int,如果直接用内存存储的话,需要:
60秒标准回答:
10位数字的QQ号,想要去重,又不给那么多的空间,该如何实现呢?
40亿个 unsigned int,如果直接用内存存储的话,需要
4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**10位数字的QQ号,想要去重,又不给那么多的空间,该如何实现呢?
- **要点2:**4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的。
- **要点3:**使用位图的话,一个数字只需要占用1个bit,那么40亿个数字也就是:
- **要点4:**4000000000 * 1 /8 /1024/1024 = 476M
- **要点5:**但是其实,如果有 bitmap 存数字的话,就不是存 4000000000个了,因为数字最大有10位数,其实是需要9999999999(10个9)个bit 用来存储,那其实是:
**记忆锚点:**Bitmap → bit → unsigned → 40亿个QQ号 → 限制1G内存 → bitmap
加分表达:
- 40亿个 unsigned int,如果直接用内存存储的话,需要: 4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的。
- 但是其实,如果有 bitmap 存数字的话,就不是存 4000000000个了,因为数字最大有10位数,其实是需要9999999999(10个9)个bit 用来存储,那其实是: 10000000000*1/8/1024/1024=1192M,那也是比14.9G 要小很多的。
追问准备:
- 围绕「Bitmap」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「bit」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「unsigned」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
10位数字的QQ号,想要去重,又不给那么多的空间,该如何实现呢?
40亿个unsigned int,如果直接用内存存储的话,需要:
4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的。
想要实现这个功能,可以借助位图。
使用位图的话,一个数字只需要占用1个bit,那么40亿个数字也就是:
4000000000 * 1 /8 /1024/1024 = 476M
相比于之前的14.9G来说,大大的节省了很多空间。
但是其实,如果有 bitmap 存数字的话,就不是存4000000000个了,因为数字最大有10位数,其实是需要9999999999(10个9)个bit 用来存储,那其实是:
10000000000*1/8/1024/1024=1192M,那也是比14.9G 要小很多的。
比如要把我的QQ号"907607222"放到Bitmap中,就需要找到第907607222这个位置,然后把他设置成1就可以了。

这样,把40亿个数字都放到Bitmap之后,所有位置上是1的表示存在,不为1的表示不存在,相同的QQ号只需要设置一次1就可以了,那么,最终就把所有是1的数字遍历出来就行了。