这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如

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

【算法技巧】位运算装逼指南

对于算法题还是有点信心的,,,,于是,发现了如下对话。

20亿级别

面试官:如果我给你 2GB 的内存,并且给你 20 亿个 int 型整数,让你来找出次数出现最多的数,你会怎么做?

小秋:(嗯?怎么感觉和之前的那道判断一个数是否出现在这 40 亿个整数中有点一样?可是,如果还是采用 bitmap 算法的话,好像无法统计一个数出现的次数,只能判断一个数是否存在),我可以采用哈希表来统计,把这个数作为 key,把这个数出现的次数作为 value,之后我再遍历哈希表哪个数出现最多的次数最多就可以了。

面试官:你可以算下你这个方法需要花费多少内存吗?

小秋:key 和 value 都是 int 型整数,一个 int 型占用 4B 的内存,所以哈希表的一条记录需要占用 8B,最坏的情况下,这 20 亿个数都是不同的数,大概会占用 16GB 的内存。

面试官:你的分析是对的,然而我给你的只有 2GB 内存。

小秋:(感觉这道题有点相似,不过不知为啥,没啥思路,这下凉凉),目前没有更好的方法。

面试官:按照你那个方法的话,最多只能记录大概 2 亿多条不同的记录,2 亿多条不同的记录,大概是 1.6GB 的内存。

小秋:(嗯?面试官说这话是在提示我?)我有点思路了,我可以把这 20 亿个数存放在不同的文件,然后再来筛选。

面试题:可以具体说说吗?

小秋:刚才你说,我的那个方法,最多只能记录大概 2 亿多条的不同记录,那么我可以把这 20 亿个数映射到不同的文件中去,例如,数值在 0 至 2亿之间的存放在文件1中,数值在2亿至4亿之间的存放在文件2中....,由于 int 型整数大概有 42 亿个不同的数,所以我可以把他们映射到 21 个文件中去,如图

显然,相同的数一定会在同一个文件中,我们这个时候就可以用我的那个方法,统计每个文件中出现次数最多的数,然后再从这些数中再次选出最多的数,就可以了。

面试官:嗯,这个方法确实不错,不过,如果我给的这 20 亿个数数值比较集中的话,例如都处于 1~20000000 之间,那么你都会把他们全部映射到同一个文件中,你有优化思路吗?

小秋:那我可以先把每个数先做哈希函数映射,根据哈希函数得到的哈希值,再把他们存放到对应的文件中,如果哈希函数设计到好的话,那么这些数就会分布的比较平均。(关于哈希函数的设计,我就不说了,我这只是提供一种思路)

40亿级别

面试官:那如果我把 20 亿个数加到 40 亿个数呢?

小秋:(这还不简单,映射到42个文件呗)那我可以加大文件的数量啊。

面试官:那如果我给的这 40 亿个数中数值都是一样的,那么你的哈希表中,某个 key 的 value 存放的数值就会是 40 亿,然而 int 的最大数值是 21 亿左右,那么就会出现溢出,你该怎么办?

小秋:(那我把 int 改为 long 不就得了,虽然会占用更多的内存,那我可以把文件分多几份呗,不过,这应该不是面试官想要的答案),我可以把 value 初始值赋值为 负21亿,这样,如果 value 的数值是 21 亿的话,就代表某个 key 出现了 42 亿次了。

这里说明下,文件还是 21 个就够了,因为 21 个文件就可以把每个文件的数值种类控制在 2亿种了,也就是说,哈希表存放的记录还是不会超过 2 亿中。

80亿级别

面试官:反应挺快哈,那我如果把 40 亿增加到 80 亿呢?

小秋:(我靠,这变本加厉啊).........我知道了,我可以一边遍历一遍判断啊,如果我在统计的过程中,发现某个 key 出现的次数超过了 40 亿次,那么,就不可能再有另外一个 key 出现的次数比它多了,那我直接把这个 key 返回就搞定了。

面试官:行,此次面试到此结束,回去等通知吧。

总结

今天这篇文章主要讲了大数据处理相关的一些问题,后面可能还会给大家找一些类似,但处理方式不同的题勒,大家如果觉得不错,不妨:

如果你觉得这篇内容对你挺有启发,为了让更多的人看到这篇文章:不妨

1、点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)

2、关注我和专栏,让我们成为长期关系

3、关注公众号「苦逼的码农」,主要写算法、计算机基础之类的文章,里面已有100多篇原创文章

大部分的数据结构与算法文章被各种公众号转载相信一定能让你有所收获 我也分享了很多视频、书籍的资源,以及开发工具,欢迎各位的关注,第一时间阅读我的文章。

【面试被虐】如何只用2GB内存从20亿,40亿,80亿个整数中找到出现次数最多的数?...相关推荐

  1. 只用2GB的内存找出20亿个整数中找到出现次数最多的数

    要求有一个包含20亿个32位整数的文件,从中找到出现次数最多的数. 首先先分析一下,32位int类型的数占4B,20亿个4B 约为 8GB,只用2GB肯定不够.所以我们肯定需要将这20亿个数哈希到不同 ...

  2. 只有2GB内存在20亿个整数中找到出现次数最多的数

    题目:有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数 要求:内存限制2GB 解决办法:把包含20亿个数的大文件用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被散列 ...

  3. 【面试被虐】如何只用2GB内存从20亿,40亿,80亿个整数中找到出现次数最多的数?

    这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如 [面试现场]如何判断一个数是否在40亿个整数中? [算法技巧]位运算装逼指南 对于算法题还是有点信心的,,,,于是,发现了如下对话. ...

  4. 如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数

    来源:公众号[苦逼的码农] 这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如: [算法技巧]位运算装逼指南 对于算法题还是有点信心的,,,,于是,发现了如下对话. 20亿级别 面试官: ...

  5. 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?

    按位比较,比如先遍历一遍数字,判断第一位是0还是1多,然后便利多的那一位的数字,判断第二位是0还是1多,依次判断到第32位,就是出现次数最多的数字了 好吧,这个算法不对 我感觉这个题目是不是考的排序算 ...

  6. 【漫画+图解】面试官让我用 2GB 内存给 20亿个整数(需要8GB内存)排序,我该咋整??

    排序的时候我们可以选择快速排序或归并排序等算法.为了方便,我们把排序好的2G有序数据称之为有序子串吧.接着我们可以把两个小的有序子串合并成一个大的有序子串. 注意:读取的时候是每次读取一个int数,通 ...

  7. 设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70)进行一趟归并后的结果为

    设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序子表,则用归并排序的方法对该记录关键字序列进行一趟归并后的结果为(   ). 15, ...

  8. 【你好面试官】008 Java内存模型指volatile底层原理详解、多处理器原子操作实现原理

    微信公众号:你好面试官 这里没有碎片化的知识,只有完整的知识体系. 专注于系统全面的知识点讲解,面试题目解析; 如果你觉得文章对你有帮助,欢迎关注.分享.赞赏. ###前言 二蛋几天没有收到面试通知, ...

  9. 树莓派4开机黑屏_树莓派4降价啦,2Gb内存的树莓派4降至35美元

    树莓派已经发布8年了.为了庆祝树莓派的8周年生日,树莓派首席执行官在博客中宣布,2Gb内存的树莓派现在降价至35美元(约合人民币244元). 1Gb内存版本的树莓派4不再销售,但工业和商业客户仍可使用 ...

最新文章

  1. remote: error: GH007: Your push would publish a private email address.
  2. 解决修改properties 属性文件存在缓存问题,附带操作properties文件工具类
  3. 在ssd中显示map tensorflow代码_PyTorch 1.3重磅发布,又要和TensorFlow搞事情了
  4. Linux Kernel系列一:开篇和Kernel启动概要
  5. 652 Find Duplicate Subtrees
  6. 前篇|信贷监控报表的设计
  7. FISCO BCOS Solidity 智能合约 批量插入新增数据
  8. c++ 文件操作方式
  9. 在软件测试中,UT,IT,ST,UAT分别是什么意思?
  10. 最全企业安全网管工具名单!
  11. 转:改变你思维模式书
  12. 支持iphone的打印服务器,无需购买WiFi打印机,实现电脑、iPad、iPhone共享无线打印...
  13. Virtual Serial Port Driver Pro 9.0.270.0英文版虚拟串口补丁
  14. 安卓 USB 无权限请求权限崩溃 UsbManager.requestPermission()空指针异常
  15. 计算机等级考试中电脑死机了,GRE考试电脑死机
  16. 电路实验一阶电路误差分析_稳压电路的分析技巧
  17. 全方面手把手从0到1带你开发谷歌浏览器插件
  18. Cocos2d-JS打造:国内首款正版海贼王手游《航海王启航》
  19. multiset upper_bound() 与 lower_bound()
  20. Dynamics 365 安装Report Authoring Extension时,提示重新启动的问题

热门文章

  1. mysql model first,一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具
  2. C 线程中容易忽视的 restrict 修饰符修饰
  3. 关于automake 和 makefile 使用感受
  4. 结构体和数组之间的映射关系
  5. 苹果终端date命令_mac 终端 常用命令
  6. java consumer_Java 8 Consumer接口
  7. 离线人脸属性分析_最新开源 | 人脸识别应用套件:毫秒级离线识别 适用多类场景...
  8. Matlab学习笔记——文本文件的读写
  9. 【Verilog HDL 训练】第 13 天(存储器、SRAM)
  10. 信道编码之差错控制方式