Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【面试现场】如何判断一个数是否在40亿个整数中?

【面试现场】如何判断一个数是否在40亿个整数中?

作者头像
帅地
发布于 2019-06-06 06:41:08
发布于 2019-06-06 06:41:08
6700
举报
文章被收录于专栏:苦逼的码农苦逼的码农

文章来源于“互联网侦察”,博主是阿里的一位老鸟,写的文章很不错,感兴趣的可以文末关注一波,废话不多说,直接看正文。

小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT。

今天他就去BAT中的一家面试了。

简单的自我介绍后,面试官给了小史一个问题。

【面试现场】

题目:我有40亿个整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做?

【请教大神】

小史回到学校,把面试的情况和计算机学院的吕老师说了一下。

小史忙拉着吕老师问,为什么我说分8次加载数据,面试官会说太慢了呢?

吕老师:哈哈,从磁盘加载数据是磁盘io操作,是非常慢的,你每次都要加载这么大的数据,还要8次,我估计你找一个数的时间可以达到分钟甚至小时级了。

小史:那如果是你,你会怎么办呢?

吕老师:其实面试官已经提示得比较明显了,他说给你一批机器,就是暗示你可以用分布式算法。你把数据分散在8台机器上,然后来一个新的数据,8台机器一起找,最后再汇总结果就行了。

小史:这样的话能快多少?

吕老师:这样应该能达到秒级。小史,你可以自己分析分析。

小史:我想想……哦,这样做的话,因为每台机器都可以一次性把数据读入内存,在比较的时候不用来回加载数据了,所以可以节省加载数据的开销!这真是个好办法。

【更好方案】

吕老师:其实这并不是最好方法,我这还有一种毫秒级的方法,想不想知道啊?

小史:当然想啊,快教教我。

小史:哦,对哦,这样我就申请40亿个位就好了,新的数转换成一个位,然后判断一下这个位是0还是1就行了。

吕老师:小史啊,考虑问题要考虑清楚啊,如果是40亿个位,那么这40亿个位哪些是0,哪些是1呢?来了一个新的数,怎么判断是否在40亿个位之中?

小史:我想想,对啊,40亿个位,40亿个数,那么每个位都是1,这。。。

吕老师:其实你可以想想,32位int的范围,总共就是2的32次方,大概42亿多点。所以你可以申请2的32次方个位。

小史:意思是我把整个整数范围都覆盖了,哦,对哦。这样一来,就可以做了,1代表第一个位,2代表第二个位,2的32次方代表最后一个位。40亿个数中,存在的数就在相应的位置1,其他位就是0。

吕老师:没错,那来了一个新的数呢?

小史:新的数就去找相应的位,比如来了一个1234,就找一下第1234位,如果是1就存在,是0就不存在啦。

吕老师:没错,那么这样的话,需要多大内存呢?

小史:我想想啊,2的32次方个位,相当于2的29次方个字节,哇,才500MB,真是节省了不少内存呢。

小史:这么厉害的算法,你是怎么想到的?

吕老师:其实这是一种非常有名的大数据算法,叫位图法,英文名叫bitmap。顾名思义,就是用位来表示状态,从而节省空间。明天正好我有一节课,就讲位图法,你可以来听一听。

【吕老师的课】

第二天,吕老师开始上课,他一开始就抛出了小史遇到的面试题。

吕老师:同学们,这道题是BAT公司的一道面试题,大家有什么思路吗?

话音刚落,蛋哥就站起来回答。蛋哥是吕老师最得意的门生,以思维活跃著称。

蛋哥:我觉得可以这样。首先,32位int的范围是42亿,40亿整数中肯定有一些是连续的,我们可以先对数据进行一个外部排序,然后用一个初始的数和一个长度构成一个数据结构,来表示一段连续的数,举个例子。

如果数据是1 2 3 4 6 7……这种的,那么可以用(1,4)和(6,2)来表示,这样一来,连续的数都变成了2个数表示。

来了一个新数之后,就用二分法进行查找了。

这样一来,最差情况就是2亿多的断点,也就是2亿多的结构体,每个结构体8个字节,大概16亿字节,1.6GB,在内存中可以放下。

吕老师:嗯,非常好,不仅给出了方案,还能主动分析空间和可行性。

小史听完后深感佩服,问题的解决方法绝对不止一种,只要肯动脑筋,即使没有学过bitmap算法,也能有别的方法来解决问题。

【课后】

下课后,小史又找到吕老师。

吕老师:但是你的理解能力还是很强的,很多东西一听就懂,这可不是谁都能做到的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅地玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何判断一个数是否在 40 亿个整数中?
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT。
五分钟学算法
2019/07/10
8630
如何判断一个数是否在 40 亿个整数中?
【面试必备】如何在10亿数中找出前1000大的数?
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
Java后端技术
2018/11/07
8240
【面试现场】如何在500w个单词中统计特定前缀的单词有多少个?
题目:我有500w个单词,你帮忙设计一个数据结构来进行存储,存好之后,我有两个需求。
帅地
2018/12/05
8710
【面试现场】如何在500w个单词中统计特定前缀的单词有多少个?
【面试现场】为什么MySQL数据库要用B+树存储索引?
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
用户1260737
2019/03/08
9350
【面试现场】为什么MySQL数据库要用B+树存储索引?
如何在 10 亿数中找出前 1000 大的数
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
五分钟学算法
2019/09/03
6160
如何在 10 亿数中找出前 1000 大的数
【面试现场】为什么MySQL数据库要用B+树存储索引?
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
Java3y
2018/12/26
6970
谈一谈为什么要分稳定排序和非稳定排序?
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
帅地
2019/09/08
5710
【BAT面试必会】如何在10亿数中找出前1000大的数
小史:我可以用分治法,这有点类似快排中partition的操作。随机选一个数t,然后对整个数组进行partition,会得到两部分,前一部分的数都大于t,后一部分的数都小于t。
乔戈里
2019/02/26
5390
【面试现场】如何实现可以获取最小值的栈?
该公号有个「面试现场」的专题,感觉写的很不错,看了挺有收获,特地转载一篇过来给大伙,希望你们也能有所收获。如果喜欢的话,可以关注该公号呢----「互联网侦察」。这次绝不是商业互吹,哈哈。
帅地
2018/10/09
1.4K0
【面试现场】如何实现可以获取最小值的栈?
判断一个数是否在40亿个整数中?
最近看到一道经典面试题: 在40亿的unsigned int数据中(乱序),给定一个数字target, 判断该target是否存在于这40亿的数据中?
Ritchie
2023/02/27
1.3K0
【面试现场】如何编程解决朋友圈个数问题?
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
帅地
2019/07/10
4880
【面试现场】如何编程解决朋友圈个数问题?
如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数
面试官:如果我给你 2GB 的内存,并且给你 20 亿个 int 型整数,让你来找出次数出现最多的数,你会怎么做?
乔戈里
2019/06/05
1.9K0
如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数
求一个数的临近的较大的2的整数次幂
在改进一下,就判断他是不是2的次方先。如果是的话,可以直接返回。就可以得到这种方法。面试官又说,不能用循环递归,函数库。这下麻烦了。
forxtz
2020/10/10
2K0
hashmap put过程面试_面试时问你base在哪儿
HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。
全栈程序员站长
2022/09/23
2280
hashmap put过程面试_面试时问你base在哪儿
在20亿个随机整数中找出m是否存在,你打算怎么存数据呢?
按照惯例,用int存储数据的话,在Java中,int占4字节,1字节=8位(1 byte = 8 bit),一共20亿个int,因而占用的空间约(2000000000*4/1024/1024/1024)≈7.45G
一条coding
2021/08/12
7060
在20亿个随机整数中找出m是否存在,你打算怎么存数据呢?
【go】剑指offer:求一个数的整数次方
基于以上的思路,其实是有bug的,假如输入的n为0或者小于0呢?因此我们需要对我们的代码进行改进。若n < 0 ,其实我们求出的是一个倒数,即-n次方的倒数。那么我们可以对我们的代码进行如下改进,用一个标记sign记录正负:
陌无崖
2020/07/27
3950
【go】剑指offer:求一个数的整数次方
整数溢出体现的哲学道理
有些回答10,有些回答居然是9..... 小伙伴们运行就会发现,打印了好多次10。
明明如月学长
2021/08/31
4580
整数溢出体现的哲学道理
面试官问:BitMap了解么?在什么场景下用过?碰到过什么问题?
Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点 节省存储空间)
java进阶架构师
2020/12/17
1.2K0
面试官问:BitMap了解么?在什么场景下用过?碰到过什么问题?
腾讯三面:40亿个QQ号码如何去重?
今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思。具体的题目如下:
程序员小二
2022/01/06
1.2K0
如何从40亿个整数中找到不存在的一个
给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数。(在文件中至少确实一个这样的数-为什么?)。在具有足够内存的情况下,如何解决该问题?如果有几个外部的“临时”文件可用,但是仅有几百字节的内存,又该如何解决该问题?
编程珠玑
2019/09/02
1.6K0
推荐阅读
相关推荐
如何判断一个数是否在 40 亿个整数中?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文