`
kenby
  • 浏览: 717488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

海量数据面试题

阅读更多

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

两个50亿个url的文件,大概有50 0000 0000 * 64 B = 640G的大小,肯定不能全部读入内存,可以分组解决

准备1030个桶,读取两个文件的url,对每个url,通过hash(url)%1031, 把url映射到其中一个桶,然后把每个桶的

url都写入一个文件,得到1030个文件,每个文件大约640M大,可以断定,相同的url只可能出现在一个文件中。所以接下来

只需依次把1030个文件读入内存,再次通过hash表找出相同的url,当然这次的hash函数不要跟上次用一样的,不然每个url

都会出现冲突。最后汇总到一个文件,即得到了结果。算法中之所以取1031的模,是因为1031是素数,且接近1024。

 

二 有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。如何按照query的频度排序?

总共要处理10G的数据,想办法分割成512份,每份大小为20M

准备520个桶,读取10个文件的query,对每一个query,通过hash(query)%521,把query映射到其中一个桶,然后把每个

桶的query写入一个文件,得到520个文件,每个文件大约20M,可以断定,相同的query只可能出现在一个文件中。所以

接下来只需把520个文件依次读入内存,再次使用hash表,统计每个文件内每个url的频度。根据频度,从大到小,写入

文件。这样就得到另外520个排好序且不重复的url文件。最后对520个文件使用归并排序,将结果写入文件。

难点1:对于一个由url和频度组成的hash表如何根据频度排序,然后把排序结果写入文件

难点2:对于520个由url和频度组成的文件,如何使用归并排序

 

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

IP跟字符串不一样,要充分利用IP的特点,把海量日志分组处理。IP是一个32bit的整数。我们把最高位的10个比特作

为组号,将海量日志分成2^10 = 1024个组,存储到1024个小文件中,每个文件最多2^22个不同的IP地址,假设一

条日志100个字节,那么每组文件大约2^22*100B = 400M。 然后使用hash表,统计每个小文件出现次数最多的IP,最后

从1024个文件中选一个出现次数最多的IP

 

 

四 搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前10条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G。请描述思想,写出算法(c语言),空间和时间复杂度。

要处理的数据有300 0000 * 255B = 765M, 可以全部读入内存,用hash表统计每个字符串的频率,然后用size为

10的最小堆来得到最热门的前10条。具体做法为,遍历所有字符串,如果它的频率比最小堆堆顶的元素大,则取

而代之,最后最小堆剩下的字符串就是最热门的前10条

分享到:
评论
2 楼 kenby 2011-08-23  
chriszeng87 写道
您好,能不能解释下,第四题里面“用hash表统计每个字符串的频率”,这个具体怎么实现啊?

自己实现一个hash表,表的key就是字符串, value是字符串的频率, 然后实现insert方法,
把字符串都插入到hash表,具体做法为:
如果表中没有找到str,则把str插入表中,value初始化为0
如果表中有str, 则把value加1
最后遍历一下这个hash表,就可以得到每个字符串得频率了
1 楼 chriszeng87 2011-08-23  
您好,能不能解释下,第四题里面“用hash表统计每个字符串的频率”,这个具体怎么实现啊?

相关推荐

Global site tag (gtag.js) - Google Analytics