前言:因为快要工作的缘故,很想去大型互联网工作,他们对于大数据的处理能力还是要求很高的,特别是在面试环节,基本必问,特开此博客,一则打铁硬自身,二则与大家分享。此博文会不断编辑更新,直至9月份工作。所有题目来自互联网:没有转载的文章,是因为已经被转载n次了,没法查找其最初来源。
一,某君面试题:反垃圾邮件的实现原理。
我一开始想到的就是,关键词,比如:黄色,股票之类的,是垃圾邮件的概率就很大了。于是查找关键词,只要含有此类关键词,就是垃圾邮件,问题自然变成了怎么维护一个关键词表,如果邮件里面的字符每一个都得和关键词表比较的话,复杂度是O(n*m),自然是很高的,那就hash表吧,每个关键词映射到一个对应的数组,通过查看数组,能在时间复杂度为O(1)里寻找到 是否有对应关键词,总的复杂度就为O(n),可以接受,因为邮件的内容还是有限的。
有个问题是:难道有黄色就是垃圾邮件。妈的,我跟我同学发邮件经常带黄色两字。怎么每次都发过去呢?自然想到了,联合更多的关键词,比如同时出现很多关键词,就可以断定垃圾邮件。又有问题了:这么大的关键词,怎么更新呢?还有像有些词能不能成为关键词 是不是会变化,比如:SB,同学之间经常输如:**SB接受,哈哈。OK,通过查找相关资料,果然,引入了贝叶斯学习,对关键词,不断学习统计,并且赋值一个概率。我想到了我之前不久写的一个博文:hash海量数据处理的一个实现,里面的value 不就可以放概率吗?于是大体思路就出来了。贝叶斯+hash表。
二,阿里笔试题:就是说淘宝上每周都有很多浏览数据,每条PV日志都存一个1到2^63-1的数字表示浏览商品的ID。现在有10亿条PV日志文件,已知商品库中有5亿个不重复的商品,给你一台内存为2GB的电脑,让你找出哪些商品没有被浏览过。(变题:并对浏览过的排序)。
娘的,咋看这题,我都看不懂,PV什么意思。PV(page view)即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。网页浏览数是评价网站流量最常用的指标之一,简称为PV。监测网站PV的变化趋势和分析其变化原因是很多站长定期要做的工作。 Page Views中的Page一般是指普通的html网页,也包含php、jsp等动态产生的html内容。来自浏览器的一次html内容请求会被看作一个PV,逐渐累计成为PV总数。(http://baike.baidu.cn/view/40888.htm)。真的晕了,连2^63-1都不知道要干什么,后来才知道,就是一个数据至少多大,63/8=7+7/8;于是得8个字节来存放完2^63-1条数据了,10亿条,因为2^10=1024,所以2^30=1024*1024*1024,大致为10亿,少一点点。一个数据8个字节,自然得大约8个2^30B=8G.(不到8G)(记住:10亿大概是1G)。fuck,8G的数据怎么放到2G的内存,非得完爆。10亿里肯定还有重复的,因为商品库中总共才5亿。我们知道,在考虑空间要求时,然后又要兼顾运算复杂度,立马想到bloom filter,首先10亿个数据建立一个bit map,然后5亿个数据再映射过去,发现不全是1的则没有被访问过,记录下来。计算m=10亿*1.44*2大概3G,再允许一定错误率的条件下,可以接受。算法复杂度O(n)。
三 问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?http://blog.chinaunix.net/uid-26565142-id-3127581.html http://blog.csdn.net/simon582/article/details/9031169
http://hi.baidu.com/tjuer/item/bba1a52d2875d9f850fd87b0
问题 三:问题描述:海量日志数据,提取出某日访问百度次数最多的那个IP。
IP的大小为32个字节,正好4G,内存是放不下了。
采用分而治之的方法:
转载自:http://blog.csdn.net/v_JULY_v/article/details/6279498
1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;
问题 四 本周淘宝上有5亿个商品成交数据,让你找出销量最高的10000个商品
直接采用优先队列,维护一个堆,复杂度Nlg(M),.
问题 五 阿里旺旺里人和人之间交流产生了很多个商业群,要我找出一共有多少个不同的群
首先,此题,我想到的是bloom filter。毕竟bloom filter 在效率方面无可厚非,特别是看到“去重”两字。但是有个问题,这里的群号应该是个ID号,ID号怎么map过去呢?先想想 假设不同的群号有1亿个(算很多了吧),则要大概100M的空间,需要的bit大概:12M空间存放bit,完全可行。但是不像字符串那样存在一对多映射,我为什么要bloom filter。问题三,是因为查询的是字符串,但是此处是ID号,ID映射不会出现一对多,一对一就足够了,OK 那就一对一吧,这不就是bitmap的思想吗?好吧,那就就bitmap.由此可见bitmap和bloom filter的区别。
,
问题 六
某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新。现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名。用户最大规模为2亿;积分为非负整数,且小于100万。
问题七 教育部志愿填写速度定位。
问题 八
乍一看,数据的大小为40G,远大于2G,没法一次读入内存。总结:查找算法无非静态的用二分,动态用二叉树,还有一个hash。这里由于数据太大hash没法用。静态更没法用了,只能构造一个树形结构了。思路如下:
2,每个8B可以记录的数据大小为:2^64-1>>2^32-1,假如整数是4字节的。
3,从头到尾依次扫描,记录在每个区间段中的数据的个数;
4,依次累计划分段后的2G内存,当扫描到第5G时,停止扫描,并记录此时