大量数据搜索的面试题

前言:因为快要工作的缘故,很想去大型互联网工作,他们对于大数据的处理能力还是要求很高的,特别是在面试环节,基本必问,特开此博客,一则打铁硬自身,二则与大家分享。此博文会不断编辑更新,直至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

有上题,我们知道,10亿大概是1G,则每个文件占用的大小为:5*64=320G>>4G,因为是找出共同的文件,相当于去重,我立马想到了bloom filter,
bloom filter 必须满足:m>=n*log2(1/E)*log2(e)=1.44*nlog2(1/E),m表示Bit的个数,n表示元素的个数,k哈希的个数。以错误率0.01计算,m=1.44*n*6.5,大概10n,也就是100亿bit,100%8=12G>4G,在允许更大错误的条件下,可以接受。首先,对一个文件进行bloom filter,把映射的位置1,然后再对第二个文件bloom filter,如果发现所有的位置都是1,则此URL重复,记录队列,整个算法的复杂度O(n*m)。暴力的复杂度  O(n*n)。为什么不能用bitmap呢?因为存在大量的多对一的情况,导致误判。
 

问题 三:问题描述:海量日志数据,提取出某日访问百度次数最多的那个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万。

       

问题七 教育部志愿填写速度定位。


问题 八

在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G(腾讯面试)
          乍一看,数据的大小为40G,远大于2G,没法一次读入内存。总结:查找算法无非静态的用二分,动态用二叉树,还有一个hash。这里由于数据太大hash没法用。静态更没法用了,只能构造一个树形结构了。思路如下:
          1,划分范围:把4G个数划分为256M区段,每个区段16个数:0-15,16-31,...。每个区段用一个8B的数据记录里面可能存在的数据个数:  256M*8B=2GB。

              2,每个8B可以记录的数据大小为:2^64-1>>2^32-1,假如整数是4字节的。

             3,从头到尾依次扫描,记录在每个区间段中的数据的个数;

             4,依次累计划分段后的2G内存,当扫描到第5G时,停止扫描,并记录此时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值