海量数据处理

1、GB级海量访问日志数据存在一台电脑中,提取出某日访问次数最多的那个IP。

hash 计算ip,均衡分发到N个文件或者机器中,并行计算出IP频率最高的,最后合并最后结果,得到最多的那个IP。

map-reduce

2. 海量数据分布在10000台电脑中,想个办法高效统计出这批数据的TOPK。

如果每个数据只出现在同一台电脑上,那么就可以用上面的方法解决,还省去了Hash的过程。但是如果同样的数据可能出现在不同的电脑中呢?那么我们就要把相同的数据用Hash的办法放到同样的电脑中。相当于重新分布一下,然后类似上述思路。

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

同样的对每个url进行Hash,然后根据Hash(url)的结果将他们分成1000份(这样每一份是0.32G,如果hash算法好的话)。然后a 和 b的每个相对应的file进行比较看看有没有重复的(用hashmap就可以)因为如果是同样的hash算法的话,相同的url一定是分配到相同的file中的。

或者我们也可以给其中一个url生成一个bloom filter,然后用这个bloom filter来filter另外一个hash,如果没有重复,那么我们可以肯定没有重复,如果bloom filter的结果说可能有重复,那么我们再进到array里一个一个检查。

4. 2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

其实我们只需要把所有整数划分到能够放进内存里的bucket里面,比如说2^26 32M大小的file,然后每次check这个范围内的整数,用bitmap来看是否有重复的。 给每个integer assign一个bit,如果出现过就把这个bit设置成1,这样就知道这个bit是否见过了

5. 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

同样只要用bitmap,每个bit assign一个数,只要那个对应的数被设置成1了,就表示那个数存在,是逻辑和算法上的,和计算机的物理特性没有关系。

外排序,外排序

6. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

所以我们可以用内存作为缓冲区来进行外排序,将所有的词都按String比较大小的方法外排序。这样所有的string都已经排好序了,然后我们再一个一个统计所有string出现的次数,最后输出频率最高的那个。

你可能感兴趣的:(笔试面试)