海量数据处理题集
1、海量日志数据,提取出某日访问百度次数最多的那个IP。
因为ip地址本省就是用简单的数字表示,可以直接利用hash算法建立一个ip与访问次数的键值对。ip地址最多有2^32约等于40亿,对ip地址用1000取余,得到有1000个4M左右个记录的文件,每个文件都可以直接读入到内存中。然后按照访问次数对每个文件排序,取出每个文件中的最大值,在1000个最大值中再找到最大的那个。
2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
由于最多有3百万个不重复的记录,即小于3M个记录,对每个记录建立搜索串到查询次数的键值对,大约需要3M*256=768M的空间,可以一次性存入内存中。下来的问题就是如何找到最大的10记录,可以维护一个10个节点的最小堆。它们就是最热门的10个记录。
《======TOP K算法总结=====》
3、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
由于1G大小的文件并不能一次性放入到内存中去,可以建立从单词到频数的哈希映射,将原始文件分割成5000个小文件,平均每个大约200k大小。如果分割后文件还是大于1M,还可以继续分,然后将每个文件加载到内存中,就和第2题的问题一样了。
4、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
对每个文件中的每一行建立query与频度的hash映射,得到多个文件,每个文件都可以直接放入内存中去,然后根据频度排序就可以了
《==========回答的不详细,除了hash外还可以其他方法============》
5、 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
一个文件大小大概为5G*64个字节=320GB大小,肯定不能一次性放入内存中去,可以首先用hash法将一个原始文件映射到多个小文件中去。比如说让每个url对1000取余,得到每个大概为0.32G的文件。要查找共同的url,只需要对每两个的文件进行查找就可以。
6、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
两种方法:
i.双位位图法
用内存中的每两位表示对应的数字的信息,如00表示不存在,01表示存在一个,10表示存在多个。因为是整数,所以最多需要2^32*2bits=1GB大小的空间来表示数据的信息(注意:不能这样算,2.5亿个整数需要0.25G/8*2=62.5M的空间),可以直接存入到内存中去。查找出位图信息为01的数据即可。
《===========关于位图法的理解还不够深刻=====================》
ii.hash映射法
将2.5亿个数进行hash映射到多个文件中去,使每个文件都可以被读入到内存当中去。对每个文件进行统计得到整数的重复次数。得到重复次数为1的整数。
7、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
与上题思路大致相同。只不过这道题要的查找一个数,上题得到查找的是很多个数。
位图法只需要使用单位就可以了。
hash方法中要先对各文件按数据大小排序(可以使用快速排序),再对排序结果进行二分查找。
8、怎么在海量数据中找出重复次数最多的一个?
先hash,再求出各数重复次数,然后求出各文件中重复次数最多的那个数,最后在上一步中求出来的数中找到最大的那个即可。
9、上千万或上亿数据(有重复),统计其中出现次数最多的前N个数据。
先hash,再堆排序即可。
10、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
与第三题思路相同,
《====================时间复杂度=======================》
11.100w个数中找出最大的100个数。
很好做了吧?
题目来源于:
http://blog.csdn.net/v_JULY_v/article/details/6279498