這是騰訊三面的題:鏈接 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