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]的节点的表,每次找出出现次数最少的进行替换。???