困扰已久的大数据场景题

由于每次面试我都没有答出来该类场景题,现在做一个记录来避免下一次答不出来的困扰。

另外感谢https://blog.csdn.net/v_july_v/article/details/7382693 july 转载

1、海量日志数据,提取出某日访问百度次数最多的那个IP。 内存为XXX。 (XXX一定是不足以存下所有的IP的)

IP地址基数大概有2的32次方个,那么就将访问百度的日志中的IP提取出来放到一个大文件当中然后设计一个hash映射函数将这个文件映射成多个小文件,这个hash映射函数要求必须所有单个小文件大小都能被存入内存当中(假设为1000个).然后在每个小文件当中找出频率最大的IP并且获取相应的频率值。然后在这1000个最大的IP中再比较得到频率最大的IP值。

抽象出来就是3个步骤

(1)分而治之/哈希映射:通过hash成多个文件减小计算规模。

(2)hashmap:用hashMap(ip,出现频率)来做统计

(3)堆/快排:把这1000个最大的IP值通过排序,排序后找到最大值。

2、寻找热门查询,300万个查询字符串中统计最热门的10个查询

原题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
 

这道题和第一题有点像。但是唯一一个区别就是300M * 255 = 0.75G. 所以 所有的数据都能直接放在内存当中而不需要分而治之来减小计算规模。

所以考虑第一题的(2)(3)步骤即可解决。

3、5亿个int找它们的中位数。 (还是老规矩:内存放不下5亿个数)

这道题用分桶的思想来做, 具体的话就是说先考虑内存能放下多少个数, 根据这个数来分桶, 比如他能放下2000万个数。我就取每个数的前5位做hash来分成32个桶。这样子32个桶之间是排序的。并且我知道每一个桶的数量。通过这样操作后我肯定就知道了这个中位数他在哪个桶里面,并且它在桶里面的次序。接下来就把桶加进内存当中进行排序,然后根据奇偶性来求出中位数。

4、给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?

先计算内存占用5G * 64 = 320G大小,内存又TMD放不下,放不下就分治(那还出这道题干啥 ? 和上面都一样了)  ,所以这里增加一个知识点叫布隆过滤器,考虑能否允许一定的错误率(假阳性,也就是把不存在里面的东西判断它在里面),将4g内存做成一个布隆过滤器,然后对另一个文件的URL判断是否存在在过滤器里。

5、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。(又是TMD放不下)

这道题带来了新的知识点,不是找TopK问题了,找不重复的整数, 首先要清楚一个问题。 整数在这道题当中的属性有三个分别为:没出现过、出现过一次、出现过多次。那么传统的bitmap方法只能判断是否存在,而没有这样的功能。 所以需要让bitmap能解决上述问题,那么就要付出一个增大内存空间使用的代价,具体实现就是每个数分配2个bit而不是原来的1个。这样的话00代表了不存在,01代表了出现一次,10代表出现了多次,11的话就不管它它没有意义。现在扫描这2.5亿个整数并且查看它在bitmap当中的位数字,当位数字为00的时候代表它之前不存在,那么现在就把他变成01等等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值