851-40亿个号码如何去重?
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亿个号码如何去重?相关推荐
- 腾讯三面:40亿个QQ号码如何去重?
我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思.具体的题目如下: 文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该很清楚 ...
- 腾讯三面:40 亿个 QQ 号码如何去重?
今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思.具体的题目如下: 文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该 ...
- 腾讯太狠:40亿QQ号, 给你1G内存,怎么去重?
说在前面 在40岁老架构师 尼恩的读者社区(50+)中,最近有小伙伴拿到了一线互联网企业如腾讯.美团.阿里.拼多多.极兔.有赞.希音的面试资格,遇到一几个很重要的面试题: 40亿Q号如何设计算法去重, ...
- 利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?
参考: 腾讯43亿QQ号码用完后怎么办? 腾讯三面:40亿个QQ号码如何去重 一.背景: 首先,明确两点: QQ号是 unsigned int 类型(4字节无符号整数,共32bit), 也就是说 Q ...
- 40亿个QQ号,限制1G内存,如何去重?
40亿个unsigned int,如果直接用内存存储的话,需要: 4*4000000000 /1024/1024/1024 = 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的. ...
- 40亿个QQ号,限制1G内存,如何去重?【已通过代码实现】
前几天发现一个有趣的文章 "40亿个QQ号,限制1G内存,如何去重?",发现很有意思,就想着用代码实现一下,下面是分析和实现过程 一.审题分析 一个 QQ 号现在最长有 11 位, ...
- 腾讯43亿QQ号码用完后怎么办?
开发者(KaiFaX) 面向全栈工程师的开发者专注于前端.Java/Python/Go/PHP的技术社区 作者 | 道哥 来源 | 爱码有道 最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右, ...
- 腾讯二面:43 亿 QQ 号码用完后怎么办?
最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右,那么用完后会怎样呢? 今天,来聊一聊与腾讯QQ号码相关的三个问题,相信大家会有一个比较完整的认识. QQ号的范围是多少? QQ号用完后会怎样? ...
- 找出不超过40亿个给定整数的整数
这是一个面试问题: 给定一个具有40亿个整数的输入文件,请提供一种算法来生成文件中不包含的整数. 假设您有1 GB的内存. 如果只有10 MB的内存,请执行后续操作. 我的分析: 文件大小为4×10 ...
最新文章
- 一个雷达和摄像头融合的3D目标检测方法CenterFusion
- java的编译和连接方法_Java:编译时解析和“最具体的方法”
- JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-命令行方式
- Eclipse3.7 Indigo 字体设置为Courier New
- 文档预览 OfficeWebViewer:在浏览器中查看Office文档
- 10大PHP比特币开源项目
- kolla-ansible解析
- 南京邮电大学MOOC高级程序语言设计(C++)第六章编程题答案
- 《认知盈余》核心摘要——“人们实际上很喜欢创造并分享”: 参与是一种行为
- 扩展ExoPlayer实现多音轨同时播放
- 达梦数据库基础知识(七)如何管理表
- sharepoint文档库文件下载
- 【python】python实现多线程并得到返回值
- Win2012或Win2016安装网卡
- CnSeu社工库免费查询_ip代理-golang测试纯真ip库与免费版ipip.net库比较
- 自噬决定免疫细胞分化及功能执行
- 嗖的一下第二弹,这些好看的皮肤直接一键收下~~
- Ubuntu20.04 向日葵无法被远控的解决办法
- 红米4A Android 版本,红米4A评测:4A搭载深度定制基于Android6.0.1系统MIUI 8 - 红米4A评测:双11手机单品销量第一 怎么样好不好用?...
- 如何用requests获取百度网站的图片资源
热门文章
- 2020年中国包子行业现状及竞争格局分析,未来行业集中度将进一步提升「图」
- 哔哩下载姬v1.3.3 B站视频下载工具
- 关闭eslint语法检查
- 时钟源系统(NTP时间同步服务器)应用农产品追溯系统
- 更换一寸照片底色蓝色底,红色底白底一寸照怎么做ps教程简单快速快捷方法办法ps学习ps教学ps教程
- oracle快速复制一个表
- Rerun the EDA Netlist Writer
- Deep Light Enhancement without Paired Supervision (非配对数据监督学习用于低曝光图像增强)
- Oracle 对比两张表的数据是否一致
- 学习笔记二:关于自激振荡