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

原文地址:https://www.cnblogs.com/chenfx/p/15710156.html