动不动的“上千万”——海量数据处理面试题

一、 海量数据,出现次数最多or前K

1、给A,B两个文件,各存放50亿条URL,每条URL占用64个字节,内存限制为4G,找出A,B中相同的URL。

【分析】我们先来看如果要把这些URL全部加载到内存中,需要多大的空间。

1MB = 2^20 = 10^6 = 100W

1GB = 2^30 = 10^9 = 10亿

50亿 = 5G * 64 Byte = 320G

明显是不可能全部加载到内存中的。我们可采用以下方法解决:

方法1:

采用Bloom filter,假设布隆过滤器的错误率为0.01,则位数组大小m约为输入元素个数n的13倍,此时需要的哈希函数k约为8个。

元素个数:n = 5G

位数组大小:m = 5G * 13 = 65G = 650亿 即需要650亿个bit位才能达到错误率0.01

而我们拥有的内存可容纳bit位个数:4G * 8bit = 32G bit = 320亿,按此实现错误率大于0.01。

 

方法2:

分别扫描A,B两个文件,根据hash(url)%k(k为正整数,比如k = 1000,那么每个小文件只占用300M,内存完全可以放得下)将url划分到不同的k个文件中,比如a0,a1,....a999;b0,b1,...b999;这样处理后相同的url肯定在对应的小文件中(a0 vs b0,a1 vs b1,...a999 vs b999)因为相同的url%1000的值肯定相同,不对应的小文件不可能有相同的url;然后我们只要求出1000对小文件中相同的url即可。比如对于a0 vs b0,我们可以遍历a0,将其中的url存放到hash_map中,然后遍历b0,如果b0中的某个url在hash_map中,则说明此url在a和b中同时存在,保存下来即可。

æµ·éæ°æ®å¤çé¢è¯é¢ï¼1ï¼

1)a,b分别用hash分成m个小文件 
2)在a对应第i个文件,用hash表标记url是否出现,遍历在b对应的第i个文件查看url在hash表中是否存在,若存在则为共同url 
3)合并m个文件中找到的共同url 

2、 海量日志数据,提取出某日访问百度次数最多的那个IP。

IP有32位,共有232232个IP。 
1)采用hash的方式,ip%m,将大文件分成m个小文件。 
2)对每个小文件,用hash表统计ip出现的次数。找出这个小文件出现次数最多的ip 
3)在这m个ip中,比较得到出现次数最多的ip。 
如果是top k的话,就维护一个长度为k的最小堆。

3、统计最热门的10个查询串,要求使用的内存不能超过1G。

假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。每个查询串的长度为1-255字节。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。 
300万*255=7.65x10^8<1GB 
1)用hash表统计查询串出现的频率 
2)维护长度为k的最小堆

4、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。

10文件顺序读取,然后hash,分散到10个文件里面去。再hash表统计词频,排序。最后归并。

 

二、 海量数据,不重复or重复的数据

1、2.5亿个整数中找出不重复的整数的个数

32位整数共有232232个,每个数用1bit标记是否出现,共需要232bit=4G/8=512M232bit=4G/8=512M 
申请512M的内存,每一bit,0表示未出现,1表示已出现。 
计数器count初始化为0。 
遍历数据文件,对每一个数,查看对应标志位,如果为0,则count+1,并标记为1;

2、2.5亿个整数中找出不重复的整数

2-Bitmap,每个数用2个bit来标记,00未出现,01出现1次,10出现多次,11无意义。需要1G内存。 
遍历数据文件,对每个数查看标志位,为00则改为01,为01则改为10 
最后,查看bitmap输出标志位01的数。

3、5亿个int找它们的中位数

思路是先分治,再用双堆法: 
首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

双堆法的思路: 
序列中的元素,前一半存储在一个最大堆中,后一半存储在一个最小堆中。控制MaxHeap与MinHeap的大小差不能超过1。

 

参考:

https://www.cnblogs.com/chenhuan001/p/5866916.html

https://blog.csdn.net/my_lovely_lemon_tree/article/details/78195957

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值