海量数据处理(一)

一:百度面试题:

题目一

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

法一:

1):首先1000万个记录,每个记录255Byte,共 10000000*255Byte= 2.55G,显然不能全部放入内存中,将这1000万个记录平均分到10个小文件中,又因为3000000*255=0.75G,所以可以在内存中维护一个长度为300万的哈希表(hash table);因此我们维护一个Key为检索的字符串值,Value为该字符串出现次数的HashTable,依次将小文件放入内存中,然后从小文件中读取一个查询串,如果不在哈希表中,那个加入该字符串,并且将Value值置为1;如果该字符串在哈希表中,那么将对应次数值+1,最终我们可以在O(N)的时间复杂度完成对该海量数据的处理。

2):那么接下来,寻找最热门的10个查询串;

维护一个最小堆 ,遍历N个数,把最先遍历到的K个数存放到堆中,并调整成一个最小堆,对于接下来的每个查询串,将其查询次数与堆顶串的查询次数相比较,若是 < 关系,则不更新堆,若大于则将堆顶元素重置为该查询串,并调整小根堆;当遍历完所有查询串,最后堆中的K个查询串就是最热门的10个查询串。


题目二

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

法一:1)   首先最多可能有2的32次方个IP地址,也就是4G,内存里可能装不下,所以考虑将Hash(IP)%1024,将IP地址映射到1024个文件中,则相同IP肯定在同一个文件中;2)  这样每个小文件最多包含4M个IP地址,对于每个小文件,以IP为key,IP出现的次数为Value的哈希表,同时记录当前出现次数最多的那个IP地址;3)  这样可以得到1024个小文件中的出现次数最多的IP,然后再依据常规的排序算法得到总体上出现次数最多的IP。

题目三

给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

答:首先50亿*64>>>>4G,所以要把a、b文件都要分成小文件,

遍历文件a,对每个url,求hash(url)%1024,将url映射到相应的小文件中a0,a1,...a999 ;对文件b,进行同样的操作;这样,操作完后,得到相应的小文件b0,b1,b2,...,b999;

这样处理后相同的url肯定在对应下标相同的小文件中,然后我们只需要求出1000对小文件中相同的url即可;

分别比对这1000个小文件,可以通过先将a0中url映射到一个hash表中,然后遍历b0中url,判断其是否在hash表中出现,若出现则为共同的url;以此类推,可以处理其他小文件,从而找到a、b文件中相同的url。

题目四:

5亿个数找中位数(待)http://www.xuebuyuan.com/97250.html

答:首先将这些数字按照 val%10000000  映射到不同的文件中 即f0(0—9999999) f1(10000000—19999999) f2(.....)....f49,并记录每个文件中数字的个数,f0 —f49的元素是按块有序的,这样很容易找到中位数位于哪个块中,对该块进行排序,就可以根据中位数位于该块的哪个位置来找到它啦~~~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值