海量数据面试题分析

个人博客请访问 http://www.x0100.top  

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

  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内存,如何找到两个文件交集?分别给出精确算法和近似算法。

这个题与上题相同,但我放在这里的主要目的是这个近似算法。 

把上图中的位图处理,改成布隆过滤器处理即为近似算法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值