海量数据面试题分析

扶醉桌前 提交于 2021-02-06 01:04:08

分享编程技能、互联网技术、生活感悟、打造干货分享平台,将总结的技术、心得、经验分享给大家,这里不只限于技术!还有职场心得、生活感悟、以及面经点击上方 "杨守乐" ,选择“置顶公众号”,第一时间送达!



海量面试题的条件一般都要求我们处理一批计算机内存放不下的数据。当我们遇到这种面试题时,常有以下几种思想:

  1. 哈希切分
    哈希切分就是将一个大文件,利用哈希的原理,将其分为若干个小文件。相同的数据都被分到同一个文件里。例如我有一个存放着100亿个整数的大文件,将其分为100个小文件。将每个数都模100,结果相同的数存放到一个文件里。如果这100亿个数理想均匀,则每个小文件大约为1亿个数。

  2. 位图(BitMap)

  3. 布隆过滤器(Bloom Fileter)

  4. 哈希表

例题1:给一个100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?

这道题没有给出我们能运用的内存是多大,所以应该先和面试官沟通清楚,问清楚可以用的内存有多少。假如为1GB。
解法:利用哈希切分,将这100G的大文件切分成1000个约为100M的小文件(倘若内存还不够,可再分)。上面我们已经说过,相同的数据已经被分到了相同的文件里。再分别按顺序将这1000个小文件引入内存, 利用哈希表或者其他方法,求出每个小文件中出现最多的IP地址。这样我们就得到1000个IP。再这1000个IP里面选出出现次数最多的。

例题2:与上题条件相同,如何找到top K的IP?

当我们遇到求TopK的题时,一般考虑用堆。求最多或最大,用大堆。求最小或最少,用小堆。这里假设求出现次数最多的前K个IP。

  1. 同样利用哈希切分,分成1000个小文件,对每个文件建立哈希表,统计好每个IP的数量,再利用小堆,求出每个小文件的TopK。这样,我们会得到1000个TopK,再从这1000个TopK里选出出现最多的(当内存还不够时,可再分)。

  2. 直接建立一个K个元素的堆,将剩下的IP地址全部挨个插入堆,每次插入一个都选出最少的删除掉,这样我们最后剩下的就是前K个最多的。

例题3:给定100亿个整数,设计算法找到只出现1次的整数。可用内存为1GB。

遇到筛选出出现次数不超过N的整数(N不能太大),并且不对具体次数是多少做出要求时,一般考虑用位图。节省空间,且效率高。
1GB = 1073741824个Byte = 8589934592个 bit(位)。
题目的要求是找出只出现一次的数字,所以我们需要2个位来表示一个数的状态。00不存在,01出现1次,10出现多次,11无意义。
所以这80多亿个位刚好可以表示所有的整数(有兴趣的战友可以自己计算一下)。
通过这个方法,我们可以快速筛选出只出现一次的整数。

例题4:给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集。

求交集,也考虑用位图。
先进行哈希切分,将这两个100亿个整数分成80个小文件,每个文件为500M。对每个文件进行标号,1到80。每次取出想通风标号的两个文件,对其中一个做位图处理,然后遍历另一个文件,从位图中去找,存在即是交集。

例题5:给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法。

这个题与上题相同,但我放在这里的主要目的是这个近似算法。
把上图中的位图处理,改成布隆过滤器处理即为近似算法。

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小乐最好的支持,非常感谢!

如何您想进技术群和大牛们交流,关注公众号在后台回复 “加群”,或者 “学习” 即可

来自:LLZK_

链接:

http://blog.csdn.net/llzk_/article/details/53106697

著作权归作者所有。本文已获得授权。欢迎投稿。

每日英文


Life's too short to worry about what people may think or talk about you, do what you want to do and be happy. 

人生苦短,无谓去担心别人怎么想你,怎么说你,做你自己想做的,快乐一点。

乐乐有话说

人生的滋味,哪怕是酸甜或苦辣,也要靠自己去品。凡事都要留有余地,势不可用尽,幸福是一种感觉,它只能源于自己内心的感觉,而并不取决于物质的多寡,很多时候,物质的锈蚀反倒让人失去了体检幸福的触觉。


 
     
     
     
    
        
        
        
推荐阅读

2017年阿里、腾讯、百度、华为、京东、搜狗和滴滴最新面试题汇集

红黑树详细分析,看了都说好
对一致性Hash算法,Java代码实现的深入研究

漫画:什么是真正的程序员?
Android面试题算法之二叉树
精练代码:一次Java函数式编程的重构之旅
一篇文章搞定面试中的二叉树
2018 年,去百度面试 Java 后端的一次面试经历

 
     
     
     

看完本文有收获?请转发分享给更多人
关注「杨守乐」,提升技能

本文分享自微信公众号 - 程序员小乐(study_tech)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!