后端岗位面试题更新 2026-08-05

在仅提供 1G 内存的条件下,需要对 40 亿个 QQ 号进行去重处理,请阐述可行的技术方案及其原理。

后端开发系统设计技术原理方案权衡

考察说明

考察海量数据去重场景下的内存优化与算法选择能力

回答思路

  1. 【回答框架 1】40亿个QQ号若按int(4字节)存储约需16G内存,直接HashSet不可行。可用位图法:QQ号若为无符号32位整数,范围0到约42.9亿,恰好可用约512MB的位图(每个号码1bit)表示是否出现,去重时遍历所有号码,将对应位置1,最后统计或输出置1的号码即可。
  2. 【回答框架 2】若QQ号不是连续整数或范围过大,位图内存可能超限,可改用布隆过滤器。布隆过滤器用多个哈希函数映射到位数组,存在误判率,但内存远小于位图,适合允许一定误判的去重场景;若要求精确去重,需结合其他结构或分治处理。
  3. 【回答框架 3】另一种方案是分治+哈希取模:将40亿个QQ号按哈希值分到多个小文件(如1000个),每个文件大小可控,再对每个文件单独用HashSet去重,最后合并结果。此方案内存可控但需磁盘IO,适合分布式或单机多文件处理。
  4. 【回答框架 4】内存不足时还可考虑外部排序:将数据分成若干块,每块排序后写入磁盘,再多路归并去重,但速度较慢,通常作为备选。实际方案选择需权衡精度、时间与内存,位图在号码范围已知时最优。
  5. 【回答框架 5】工程实现时注意位图可用byte数组或BitSet,遍历40亿数据约需数十秒到分钟级,需考虑单线程或多线程优化;若QQ号为字符串,需先转为整数ID再映射,增加哈希成本。
  6. 【关键点 1】位图法在QQ号为32位整数且范围有限时,仅需约512MB内存即可精确去重
  7. 【关键点 2】布隆过滤器节省内存但存在误判,适合非精确去重场景
  8. 【关键点 3】分治+哈希取模可将大数据切分为小文件,用HashSet逐块去重并合并
  9. 【关键点 4】外部排序归并去重可精确但性能较差,作为补充方案
  10. 【易错点 1】误以为位图内存与数据量成正比,实际与数值范围相关,若QQ号稀疏或范围大需谨慎
  11. 【易错点 2】布隆过滤器误判率不可忽略,不能用于要求完全准确的场景
  12. 【易错点 3】分治方案需注意文件切分均匀性,否则某文件过大导致内存溢出