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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM