40亿个QQ号码如何去重?

文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G.

在原题中,实际有40亿个QQ号码,为了方便起见,在图解和叙述时,仅以4个QQ为例来说明。

方法一:排序

很自然地,最简单的方式是对所有的QQ号码进行排序,重复的QQ号码必然相邻,保留第一个,去掉后面重复的就行。
原始的QQ号为:

排序后的QQ号为:

去重就简单了:

去重一定要排序吗?显然,排序的时间复杂度太高了!!!

方法二:hashmap

既然直接排序的时间复杂度太高,那就用hashmap吧,具体思路是把QQ号码记录到hashmap中:

mapFlag[123] = true
mapFlag[567] = true
mapFlag[123] = true
mapFlag[890] = true

由于hashmap的去重性质,可知实际自动变成了:

mapFlag[123] = true
mapFlag[567] = true
mapFlag[890] = true

很显然,只有123,567,890存在,所以这也就是去重后的结果。
实际要存40亿QQ号码,1G的内存够分配这么多空间吗?显然不行!!!

方法三:文件切割

显然,这是海量数据问题,自然想到文件切割的方式,避免内存过大。

可是,绞尽脑汁思考,要么使用文件间的归并排序,要么使用桶排序,反正最终是能排序的。

既然排序好了,那就能实现去重了,貌似就万事大吉了。我只能坦白地说,高兴得有点早哦。
因为这么多的文件操作,效率自然不高啊

方法四:bitmap

来看绝招!我们可以对hashmap进行优化,采用bitmap这种数据结构,可以顺利地同时解决时间问题和空间问题。

在很多实际项目中,bitmap经常用到。我看了不少组件的源码,发现很多地方都有bitmap实现,bitmap图解如下:

这是一个unsigned char类型,可以看到,共有8位,取值范围是[0, 255],如上这个unsigned char的值是255,它能标识0~7这些数字都存在。

同理,如下这个unsigned char类型的值是254,它对应的含义是:1~7这些数字存在,而数字0不存在:

由此可见,一个unsigned char类型的数据,可以标识0~7这8个整数的存在与否。以此类推:

一个unsigned int类型数据可以标识0~31这32个整数的存在与否。

两个unsigned int类型数据可以标识0~63这64个整数的存在与否。

显然,可以推导出来:512MB大小足够标识所有QQ号码的存在与否,请注意:QQ号码的理论最大值为2^32 - 1,大概是43亿左右。

接下来的问题就很简单了:用512MB的unsigned int数组来记录文件中QQ号码的存在与否,形成一个bitmap,比如:

bitmapFlag[123] = 1
bitmapFlag[567] = 1
bitmapFlag[123] = 1
bitmapFlag[890] = 1

实际上就是:

bitmapFlag[123] = 1
bitmapFlag[567] = 1
bitmapFlag[890] = 1

然后从小到大遍历所有正整数(4字节),当bitmapFlag值为1时,就表明该数是存在的。

扩展练习一

文件中有40亿个互不相同的QQ号码,请设计算法对QQ号码进行排序,内存限制1G.

很显然,直接用bitmap, 标记这40亿个QQ号码的存在性,然后从小到大遍历正整数,当bitmapFlag的值为1时,就输出该值,输出后的正整数序列就是排序后的结果。

请注意,这里必须限制40亿个QQ号码互不相同。
通过bitmap记录,客观上就自动完成了排序功能。

扩展练习二

文件中有40亿个互不相同的QQ号码,求这些QQ号码的中位数,内存限制1G.

我知道,一些刷题经验丰富的人,最开始想到的肯定是用堆或者文件切割,这明显是犯了本本主义错误。直接用bitmap排序,当场搞定中位数。

扩展练习三

文件中有40亿个互不相同的QQ号码,求这些QQ号码的top-K,内存限制1G.

我知道,很多人背诵过top-K问题,信心满满,想到用小顶堆或者文件切割,这明显又是犯了本本主义错误。直接用bitmap排序,当场搞定top-K问题。

扩展练习四

文件中有80亿个QQ号码,试判断其中是否存在相同的QQ号码,内存限制1G.

我知道,一些吸取了经验教训的人肯定说,直接bitmap啊。然而,又一次错了。根据抽屉原理可知:

因为QQ号码的个数是43亿左右(理论值2^32 - 1),所以80亿个QQ号码必然存在相同的QQ号码。

851-40亿个号码如何去重?相关推荐

  1. 腾讯三面:40亿个QQ号码如何去重?

    我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思.具体的题目如下: 文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该很清楚 ...

  2. 腾讯三面:40 亿个 QQ 号码如何去重?

    今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思.具体的题目如下: 文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该 ...

  3. 腾讯太狠:40亿QQ号, 给你1G内存,怎么去重?

    说在前面 在40岁老架构师 尼恩的读者社区(50+)中,最近有小伙伴拿到了一线互联网企业如腾讯.美团.阿里.拼多多.极兔.有赞.希音的面试资格,遇到一几个很重要的面试题: 40亿Q号如何设计算法去重, ...

  4. 利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?

    ​参考: 腾讯43亿QQ号码用完后怎么办? 腾讯三面:40亿个QQ号码如何去重 一.背景: 首先,明确两点: QQ号是 unsigned int 类型(4字节无符号整数,共32bit), 也就是说 Q ...

  5. 40亿个QQ号,限制1G内存,如何去重?

    40亿个unsigned int,如果直接用内存存储的话,需要: 4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的. ...

  6. 40亿个QQ号,限制1G内存,如何去重?【已通过代码实现】

    前几天发现一个有趣的文章 "40亿个QQ号,限制1G内存,如何去重?",发现很有意思,就想着用代码实现一下,下面是分析和实现过程 一.审题分析 一个 QQ 号现在最长有 11 位, ...

  7. 腾讯43亿QQ号码用完后怎么办?

    开发者(KaiFaX) 面向全栈工程师的开发者专注于前端.Java/Python/Go/PHP的技术社区 作者 | 道哥 来源 | 爱码有道 最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右, ...

  8. 腾讯二面:43 亿 QQ 号码用完后怎么办?

    最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右,那么用完后会怎样呢? 今天,来聊一聊与腾讯QQ号码相关的三个问题,相信大家会有一个比较完整的认识. QQ号的范围是多少? QQ号用完后会怎样? ...

  9. 找出不超过40亿个给定整数的整数

    这是一个面试问题: 给定一个具有40亿个整数的输入文件,请提供一种算法来生成文件中不包含的整数. 假设您有1 GB的内存. 如果只有10 MB的内存,请执行后续操作. 我的分析: 文件大小为4×10 ...

最新文章

  1. 一个雷达和摄像头融合的3D目标检测方法CenterFusion
  2. java的编译和连接方法_Java:编译时解析和“最具体的方法”
  3. JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-命令行方式
  4. Eclipse3.7 Indigo 字体设置为Courier New
  5. 文档预览 OfficeWebViewer:在浏览器中查看Office文档
  6. 10大PHP比特币开源项目
  7. kolla-ansible解析
  8. 南京邮电大学MOOC高级程序语言设计(C++)第六章编程题答案
  9. 《认知盈余》核心摘要——“人们实际上很喜欢创造并分享”: 参与是一种行为
  10. 扩展ExoPlayer实现多音轨同时播放
  11. 达梦数据库基础知识(七)如何管理表
  12. sharepoint文档库文件下载
  13. 【python】python实现多线程并得到返回值
  14. Win2012或Win2016安装网卡
  15. CnSeu社工库免费查询_ip代理-golang测试纯真ip库与免费版ipip.net库比较
  16. 自噬决定免疫细胞分化及功能执行
  17. 嗖的一下第二弹,这些好看的皮肤直接一键收下~~
  18. Ubuntu20.04 向日葵无法被远控的解决办法
  19. 红米4A Android 版本,红米4A评测:4A搭载深度定制基于Android6.0.1系统MIUI 8 - 红米4A评测:双11手机单品销量第一 怎么样好不好用?...
  20. 如何用requests获取百度网站的图片资源

热门文章

  1. 2020年中国包子行业现状及竞争格局分析,未来行业集中度将进一步提升「图」
  2. 哔哩下载姬v1.3.3 B站视频下载工具
  3. 关闭eslint语法检查
  4. 时钟源系统(NTP时间同步服务器)应用农产品追溯系统
  5. 更换一寸照片底色蓝色底,红色底白底一寸照怎么做ps教程简单快速快捷方法办法ps学习ps教学ps教程
  6. oracle快速复制一个表
  7. Rerun the EDA Netlist Writer
  8. Deep Light Enhancement without Paired Supervision (非配对数据监督学习用于低曝光图像增强)
  9. Oracle 对比两张表的数据是否一致
  10. 学习笔记二:关于自激振荡