40 亿个 QQ 号码如何去重,bitmap去重
这是腾讯三面的题:链接 https://blog.csdn.net/dabaoshiwode/article/details/121571610
具体的题目如下:
文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G.
原题看链接,这里自己理解下bitmap是怎么做到的。前置知识bitmap
用hashmap去重的话,用int类型2*(2^31-1),负数也算上。
那么一个int类型32位,4个字节。
需要 40亿*4/1024/1024/1024 ≈ 14.9G
这还是不考虑hash冲突最少的情况!
那么用bitmap的话,用1位表示1个qq号码是否存在
那么8个位等于1个字节。
需要 40亿/8/1024/1024/1024 ≈ 0.466G
只需要不到512MB就可以了!
如上图:是1个数组上存取了二进制的1个字节的信息。这1个字节的信息可以表示8个qq号码是否存在。时间和空间复杂度都大大降低!
假如来了一个重复的qq号码12
1、计算分组 12 / 8 = 1
2、计算分组下标 12 % 8 = 4
判断第四位是1,说明12已经有了,|或操作下,自动去重。
同理用32位的int类型取代上述的8位byte,间隔32个数分组。
参考文章:
https://blog.csdn.net/dabaoshiwode/article/details/121571610
https://zhuanlan.zhihu.com/p/442732557
https://www.cnblogs.com/cjsblog/p/11613708.html