当前位置: 首页 > news >正文

腾讯面试:40亿QQ号,给你1G内存,怎么去重?

前段时间,有个小伙伴给我分享了他去腾讯面试的经历。他说被问到了一道去重的面试题:

给你40亿个QQ号,要求相同的QQ号码仅保留一个,内存限制为1个G,你会怎么实现?

小伙伴由于没有回答好,导致面试挂了。

这其实就是个经典的海量数据去重问题,而且还附带一个让人头疼的条件:内存限制只有1G!

1.理解题目:从QQ号和内存限制说起

我们先来分析一下问题本身。

QQ号其实是一串数字,范围是4字节的无符号正整数,也就是32位,理论上最大值接近43亿。所以,如果单纯存储这40亿个QQ号,需要耗费多少内存呢?

简单计算一下:

4000000000*4 /1024/1024/1024 ≈ 15GB

总共需要15GB的内存,显然远远超过了题目给的1GB限制。这就需要我们换个思路,不能“硬塞”,要想办法巧妙地存储和处理这些QQ号。

所以问题的本质就是“在内存非常有限的情况下,高效实现重复数据的去重”。

解决方案有很多,但是主流的方案有两种:

  • 方案1:使用BitMap
  • 方案2:使用布隆过滤器

两者各有千秋,但在本题中,我们使用BitMap更加合适。

2.解决方案:用BitMap的精妙之处化繁为简

2.1 什么是BitMap?

所谓位图(BitMap)其实就是一个bit数组,即每一个位置都是一个bit,其中的取值可以是0或者1。

通俗点说,BitMap就像一个超级节省空间的“登记簿”。

  • 如果某个QQ号存在,就在对应的“格子”上标记为1;

  • 如果不存在,则是0。

比如,我们需要记录QQ号:1、4、6。传统方法可能需要用3个整型变量,每个4字节,总共12字节。但是BitMap只需要用一个字节(8位),直接把第1、4、6位分别置为1即可,是不是更高效?这里节省了 12倍空间。

BitMap最大的优势在于能够用极小的存储空间去表示巨大的数值范围,并且支持快速查询、去重等操作。它特别适合这种“有或没有”的问题,不需要存储原始数据。

2.2如何使用BitMap进行40亿个QQ号去重?

回到我们的问题:40亿个QQ号,限制1G内存,如何用BitMap去重?

步骤如下:

1)申请一个足够大的BitMap,大小为40亿个bit,也就是:

4000000000 * 1 /8/1024/1024 = 476M

只需要不到500MB的空间就可以搞定!

2)遍历这40亿QQ号,把每个号码映射到BitMap中,把对应位置的bit设置为1。

比如,QQ号“12345678”会直接映射到BitMap的第“12345678”个位置,然后置为1,表示它已经出现过。

3)通过遍历BitMap,找出所有bit值为1的位置,这些就是所有的去重后的QQ号。

通过这样的方式,我们用BitMap成功实现了40亿QQ号去重,最大内存消耗也不到500MB,不会有内存不足的问题。

2.3 BitMap的优缺点

优点:

  • 超极节省内存

相比直接存储数据,BitMap的内存消耗大约只有八分之一甚至更少,非常高效。

  • 操作快

插入、查询、去重的时间复杂度都是O(1),十分适合处理海量数据。

  • 易于实现

算法简单,只需要依赖一个数组,理解成本低。

缺点:

  • 只能表示“有或没有”

BitMap只能用0和1表示是否存在,无法存储更复杂的数据(如具体值或出现次数)。

  • 需要确定值域范围

BitMap只能操作固定范围的数据,超出范围将导致无法标记。

3.总结

通过这道题我们看到了BitMap的优雅之处,它让我们用不到500MB的内存,成功完成了40亿QQ号的去重操作。更重要的是,这种思路在很多场景中都有广泛应用,比如:

  • 大规模数据去重

  • 数据快速排序

  • 集合运算(交集、并集、差集)

  • 布隆过滤器的底层实现

所以,掌握BitMap不仅能帮你顺利通过面试,在实际的大数据场景中也非常实用!

你还有其他更好的思路吗?欢迎留言讨论~

https://mp.weixin.qq.com/s/82P8d8HECMelgQc0Cd_UIA

http://www.jsqmd.com/news/262285/

相关文章:

  • 吐血推荐9个AI论文平台,专科生搞定毕业论文格式规范!
  • ‌测试自动化新星:AI驱动的视觉测试工具盘点
  • java-SSM372多人试卷批改考试命题系统-springboot
  • 台焊机批量定制哪家性价比高?靠谱厂家揭秘 - 工业品牌热点
  • 软件测试中的生成式AI:机遇与陷阱全解析
  • ‌AI如何让软件发布速度提升300%?内部报告揭秘‌
  • 【Java源码】基于SpringBoot的在线考试系统
  • AI会淘汰测试工程师吗?数据与真相的深度解构
  • AI开发工具战场全景图:测试视角的王者之争
  • 基于 Flutter × OpenHarmony 图书馆管理系统之构建书籍列表
  • ‌机器学习在缺陷预测中的神奇力量:真实案例分享‌
  • 【前沿技术】不仅是翻译,更是“智能体协作”:揭秘 AI 如何组建一支“数字美工团队”为你批量修图?
  • 突发!前端框架Astro被收购,Bun 创始人第一时间发来贺电!
  • 【私有化部署】断网也能跑?为何大卖都把 AI 图片翻译软件装进“本地硬盘”?
  • 【Python视觉】告别“死板机翻风”:揭秘 AI 如何自动匹配“原图字体”实现设计级重构?
  • 学术探险家的秘密武器:书匠策AI如何重构本科论文写作的“生存法则”
  • 【深度原理解析】告别“马赛克式”翻译:为何 AIGC 是跨境电商图片本地化的终极解法?
  • 如何画出矢量的 状态图?
  • 【硬核科普】从 0 到 1 的视觉重构:深度解析 AI 批量图片翻译的“黑盒原理”与核心优势
  • 【技术揭秘】一张好图是如何炼成的?深度解析 AI 批量图片翻译的“三层重构”原理
  • 全球首个“个人机器人”真的太逼真了
  • OpenFOAM中的设计模式
  • vue3+python+django校内跑腿系统的设计与实现
  • vue3+python+django框架的松茸交易网站的设计与实现三端 商城购物
  • 50、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(二) - 教程
  • 梁文峰去年进账50亿,DeepSeek粮草充足
  • vue3+python+django的人力资源数据分析设计与实现 企业员工培训考勤薪资系统
  • 2026年目前专业的PERT二型保温管制造厂家怎么选,PPR铝合金衬塑复合管,PERT二型保温管加工厂口碑推荐榜单 - 品牌推荐师
  • ACPI!RestartCtxtPassive函数对节点ACAD处理完返回DPC继续处理下一个有_STA方法的节点SLPB
  • vue3+python+django的日本旅游攻略系统