海量数据处理问题

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

该题目要求的是出现次数最多的一个,有时候题目也会变成求出现次数排名前K的IP地址,两个问题的解题思路是一致的,只是求前K个会多一个小步骤,就是建堆,所以现在学习一下,求前K个的思路。100G内存的文件显然是不能拿到内存中取得,那么我们处理这个问题的思路就是将这个文件分成很多个小文件,然后在用每个小文件在进行比较就容易得多。

具体思路如下:

①我们先去把logfile文件分成1000分,每一个可以当作一个小文件

②接着我们根据哈希字符串处理的相关函数,求的每一个IP地址的key值,用这个key值,去mod1000,那么我们此时就能知道该IP在1000个小文件中应该存在第几个小文件中

③此时如果是找出现次数最多的一个,就挑出1000个小文件中,每一个小文件中出现最多的一次,然后在这1000个数中找到最大的一个,但是如果要求前K个,此时我们根据第一个小文件建立一个保存K个数据的小堆,在和之后的小文件一次进行比较,那么最后我们这个小堆里面保存的就是出现次数前K个的IP地址

二、给定100亿个整数,设计算法找到只出现一次的整数

判断数字有没有在大量数据中出现过,我们可以使用位图:Bitmap,但是位图中,我们使用一个比特位的0或者1来表示数字有没有出现过,这个题目中,一个比特位显然是不够的,因为没有出现我们用00表示,出现一次用01或者10表示,一次以上统一用一个数字11表示

具体思路如下:

①将100亿个整数,按照对应的hash算法算出来的key值,存到对应的1000个小文件中

②在从每个文件中找到出现次数为1的数值

三、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集

该题目相当于上面题目的变形,既然有1G的内存,我们就可以每个文件占用500M,然后将这两个文件都分成1000份小文件,将两个文件中的整数分别使用同样的hash算法,分别映射到各自的1000个文件中,因为使用的是同一种hash算法,所以假如数字x,在两个文件中同时存在,那么肯定映射在同样下标的小文件中,此时1表示存在,0表示不存在,将俩个经过hash算法的文件“与”一下,那么在两个文件中都存在的数字对应的位置应该是两个1,“与”了之后还是1,若只在一方存在,那么肯定是0和1与,结果就是0;都不存在就是0和0与,结果还是0,这样,与完之后剩下的数字就是在两个文件中都存在的数字。

四、1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

解决这个问题和之前的几个问题大同小异,100亿的int,大小大概在40G左右,使用最基础的位图是不够的,因为每一个比特位他所能表示之后状态,但是我们在不超过2中,有出现0次,出现1次,两种情况,所以我们使用的应该还是2个比特位,00表示出现0次,10表示出现1次,11表示出现2次即以上,因为有40G,但是内存只有1G,所以我们最少要将文件分成40份,然后在统计每一份文件中出现不超过2次的,然后在综合起来。

五、给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法 
如何扩展BloomFilter使得它支持删除元素的操作 

如何扩展BloomFilter使得它支持计数操作

找两个文件的交集,使用布隆过滤器(BloomFilter),假设每一个quer的大小等于一个int的大小,那么100亿个就是40G左右,内存只有1G,所以我们文件分成1000份

具体步骤:

①:将两个文件分别分成1000分,使用Bloomfilter将两个文件中的值分别映射到不同的位置

②再将两个映射之后的 文件做比较,使用相同的hash处理函数,得到的key值也就是一样的,映射的位置在两个文件中也是一样。

那么如何让BloomFilter支持删除元素的操作?我们可以将Bloomfilter中的每一位增加一个计数位,然后在将要删除这个数的时候,先去判断计数位是不是0,如果不是0,那么就说明有其他的数也映射到这个位,此时我们就不能删除这个位置。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值