海量数据面试题

青春壹個敷衍的年華 提交于 2019-12-08 17:42:26

from: http://kenby.iteye.com/blog/1031124

 

一 给定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条

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!