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

640?wx_fmt=jpeg

作者

channingbreeze

如需转载,请联系原作者授权。


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


640?wx_fmt=jpeg


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


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


【面试现场】


640?wx_fmt=jpeg


640?wx_fmt=jpeg


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


640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


【请教大神】


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


640?wx_fmt=jpeg

640?wx_fmt=jpeg


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


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


640?wx_fmt=jpeg


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


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


640?wx_fmt=jpeg


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


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


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


【更好方案】


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


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


640?wx_fmt=jpeg


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


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


640?wx_fmt=jpeg


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


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


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


640?wx_fmt=jpeg



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


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


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


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


640?wx_fmt=jpeg


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


640?wx_fmt=jpeg


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


【吕老师的课】


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


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


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


640?wx_fmt=jpeg


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

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

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

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


640?wx_fmt=jpeg


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


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


【课后】


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


640?wx_fmt=jpeg

640?wx_fmt=jpeg


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



01

 微 信 群  


添加小编微信:tangguoyemeng,备注“进群”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


成为群成员,或拉人进群,

还有机会参与红包抽奖,获得免费赠书哦~~


02

 征 稿 


CSDN作为国内专业的云计算服务平台,目前提供云计算、大数据、虚拟化、数据中心、OpenStack、CloudStack、机器学习、智能算法等相关云计算观点、技术、平台、实践、云产业咨询等服务。CSDN 公众号也一直坚持「与千万技术人共成长」的理念,深度解读行业内热门技术与场景应用,致力于让所有开发者保持敏锐的技术嗅觉、对行业趋势与技术获得更广阔的认知。

文章题材

  • 首先你需要关注我们的公众号“CSDN云计算”,这样你会更准确了解我们需要的文章风格;

  • 侧重于云计算领域相关的文章,可以是技术、运维、趋势等方面的务实内容;

  • 原创,要求文章有鲜明观点和看法。

投稿须知

  •  稿费:根据原创性、实用性和时效性等方面进行审核,通过的文章会发布在本微信平台。一经采用,我们将支付作者酬劳。酬劳可能不多,这代表的是一个心意,更多是因为爱好,是有识之士抒发胸怀的一种方式;

  • 字数要求:稿件字数以2K-8K为宜,少于2K或多于8K都会一定程度降低阅读愉悦感;

  • 投稿邮箱:lijy@csdn.net。或者添加微信表明来意,微信号:tangguoyemeng。请备注投稿+姓名+公司职位


如果咱们的合作稳定又愉快,还可以签订合同长期合作哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彩色BMP转换成灰度图的原理

图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算、识别。 彩色图转换灰度图的原理如下: 我们知道彩色位图是由R/G/B三个分量组成,其文件存储格式为 BITMAPFILEHEADERBITMAPINFOHEADER,紧跟后面的可…

Linux java 生效不了,linux jdk 不生效怎么办

【摘要】操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。下面是linux jdk 不生效怎么办,让我…

程序猿 - 超实用的工具、素材、学习网站分享

文章目录------------------------------学习教程篇-------------------------------bilibili哔哩哔哩网易云课堂siki学院:泰课在线:可汗学院:线性代数的本质 - bilibili计算机科学速成课 - bilibiliLearnOpenGL:The Book of Shad…

面趣 | 马云在面试中出的一道题,据说只有一个人答对……

大神,求解!据说,马云给新员工出了一道题然鹅,只有一个人答对了!!!!智商不足的小编居然打开了这道题求解!!!我手里有50元钱花去剩余买衣服 20元30…

云漫圈 | 敢怼我们程序员?哼,有你好看的。。。

作者设计师静静来源非著名程序员原创作品,如有转载,请联系公众号授权。原创漫画,禁止转载,侵权必究前几天在网络上看到一个关于产品经理和设计的对话,非常的搞笑,有意思。对话如下:产品经理&…

这些软件太强了,Windows必装!尤其程序员!

Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享…

教师节 | 程序员都这么玩,你敢挑战吗?

课堂上的每一课您总能「抽象」出整个世界不断「重载」出覆盖这个世界的任何方法当某个「异常」陷入自己的「静态属性」难以自拔时您总会调用千百种「方法」作为一种特别的「参数」传进把「异常」从一个「死循环」中解救出来在无尽的黑夜中您「释放」所有的系统资源不断的开发我…

如何在linux安装mysql7版本的,如何在linux下用tar方式安装Mysql5.7版本

1、下载根据自己的linux系统情况选择对应的tar包2、解压tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar再移动并重命名一下mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql3、创建mysql用户组和用户并修改权限groupadd mysqluseradd -r -g mysql mysql4、创建数…

cloud一分钟 | 腾讯金融云总经理胡利明:腾讯云服务金融的“加减 乘除”法。...

Hello,everyone:9月10日早,星期一,祝大家工作愉快!祝各位老师节日快乐!一分钟新闻时间:完01微 信 群 添加小编微信:tangguoyemeng,备注“进群公司职位”即可&#xff0c…

cloud一分钟 | 李飞飞离任谷歌云,工作重心将重新转回学术界

Hello,everyone:9月11日早,星期二,祝大家工作愉快!一分钟新闻时间:完01微 信 群 添加小编微信:tangguoyemeng,备注“进群公司职位”即可,加入【云计算学习交流群】&…

如何成为云计算专家?这些必须知道

Level 200、300、400你正处在云计算技术的哪个阶段呢?从进阶,到高级,再到专家AWS INNOVATE 2018 在线技术大会为不同阶段的你量身定制技术内容高屋建瓴的 “主题演讲”包罗万象的 “技术分论坛”亲历亲为的 “Builders 实验室”……我们的进度…

linux重新启动某一个项目,Linux运维知识之supervisor更改某项目配置后 需要重新启动才有效...

本文主要向大家介绍了Linux运维知识之supervisor更改某项目配置后 需要重新启动才有效,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。在linux服务器上部署了node项目,使用supervisor进行管理梗概了该项目对的某些配置后&a…

Python Pycharm Anacanda 区别

工欲善其事必先利其器,在学习 Python 开发之前我们首先来熟悉几个关键字: 1.Python 2.Pycharm 3.Anacanda 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门可能对于刚接触的小伙伴还是比较懵逼的,一会 Python 一会 A…

走进中国移动(宁夏)数据中心,感受不一样的运营商情怀

文章来源:数字中国万里行 如今,移动端应用已经深入我们生活的方方面面。想出门,“嘀”一声扫码成功,骑上自行车就出发了;家里又该交燃气费了?随时随地登录官网,输入编码就能立刻充值&#xff1b…

Python2.x 和 Python3.x,如何选择?

一.前言 Python 软件基金会宣布,到 2020 年元旦,将不再为编程语言 Python 2.x 分支提供任何支持。这一天将标志着一出延续多年的戏剧的高潮:Python 从较旧的、功能较弱的、广泛使用的版本过渡到更新的、更强大的版本。 然而,Pytho…

面趣 | 一个月面试4家,3家Offer,来看看面霸真君如何面试的

作者纪小雄已获原作者授权,如需转载,请联系原作者。自古真情留不住,总是套路得人心近来很多小伙伴都抱怨说面试难,难于上青。蚕丛及鱼凫,开国何茫然,呃~好像多背了两句……我,人称 &…

Python Hello World入门 - Python零基础入门教程

目录 一.创建 hello world 项目 1.Create New Project2.设置项目所在目录3.项目创建完成 二.编写代码三.运行项目 万丈高楼平地起,编程亦如此。改变世界是结果,坚持努力学习改 Bug 的过程,hello world 是开始,所有语言均是如此。…

统计了50万人的身高数据才发现:大家都爱虚报身高

作者二胖并不胖来源大数据前言已获原作者授权,如需转载,请联系原作者。前些天在知乎上看到一个关于身高的问题。我想既然大家都对身高这么感兴趣,正好之前我在相亲网上爬了50万用户的信息,那不妨来做个统计。关于身高,…

linux系统批量装机,PXE+Kickstart实现无人值守批量安装Linux

PXEKickstart实现无人值守批量安装Linux实验准备:主机myrhel2作为服务器端,新建一个没有安装操作系统的虚拟主机,而且其与服务器端在同一个网段安装的条件:服务器端:支持TFTP:提供引导文件与系统安装所必须…

Python代码注释 - Python零基础入门教程

目录 一.什么是代码注释二.为什么写代码要注释三.代码注释的方式 1.单行注释,使用英文符号 #2.多行注释 方法一:英文状态下使用单引号 ”””方法二:英文状态下使用双引号 “” (和方法一有点类似)方法三:选中单行或者多行&#…