您的位置:首页 > 其它

海量数据搜索、查询

2016-05-13 16:18 218 查看

1.有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”这个单词出现的次数。

要求效率最高,并写出算法的时间级。

方法一:

假设不区分大小写,由于英文字母有26个,因此,可以将单词映射为数字。csdn被映射成:

  ( ‘c ‘- ‘a ‘)*32*32*32+( ‘s ‘- ‘a ‘)*32*32+( ‘d ‘- ‘a ‘)*32+( ‘n ‘- ‘a ‘)

  即:( ‘c ‘- ‘a ‘)(1 < <15)+( ‘s ‘- ‘a ‘)(1 < <10)+( ‘d ‘- ‘a ‘)*(1 < <5)+( ‘n ‘- ‘a ‘)

再将每个英文字母进行映射,定义循环,从第一个字符开始的映射开始,向后加四个并与CSDN的映射进行比较即可。

时间复杂度:O(n*len),n为单词个数,len是单词的平均长度。

方法二:

KMP算法,进行字符串匹配。时间复杂度度O(num+4).num指的是所有字符的个数。

2.从1亿个ip中找出访问次数最多的IP

算法思想:

IP地址最多有2^32=4G种取值可能,所以不能完全加载到内存中。

可以考虑分而治之的策略;

map

按照IP地址的hash(IP)%1024值,将海量日志存储到1024个小文件中,每个小文件最多包含4M个IP地址。

reduce

对于每个小文件,可以构建一个IP作为key,出现次数作为value的hash_map,并记录当前出现次数最多的1个IP地址。

有了1024个小文件中的出现次数最多的IP,我们就可以轻松得到总体上出现次数最多的IP。

类似问题:

(1)假设有1kw个身份证号,以及他们对应的数据。身份证号可能重复,要求找出出现次数最多的身份证号。

(2)怎么在海量数据中找出重复次数最多的一个

3.百度每天都会接受数亿的查询请求, 如何在这么多的查询(Query)中找出高频的Query是一个不小的挑战.

而你的任务则更加艰巨, 你需要在极其有限的资源下来找出这些高频的Query.(使用内存不得多于1MB) 。输入文件是一行一个Query,以文件结束符结尾。每个Query字节数L(一个汉字两个字节)满足:0<=16. 输入大小不超过1GB(包括换行符)。 输出你认为最高频的100个query. 每行一个, 不能有重复, 不能多输出, 但可以少输出(见样例).

hash,然后建立hash[103][100]的节点的表,每次找出出现次数最少的进行替换。???
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: