大数据面试总结

1、给出一个超过100G的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址?
采用哈希切割将IP相同的文件都映射到同一个文件中,在一次统计每个文件ip的个数,求出最多的,如果一个ip出现的次数特别多,切割之后还是无法加载到内存中,我们可在对这个文件进行切割(普通切割)分成若干个小文件,最后将小文件的结果汇总,求出出现次数最多的。
2、给出一个超过100G的log file,log中存着ip地址,如何找到top K的ip?
与上一题思想相同,将文件切割成小文件,采用小堆求出每个文件的top K ip,再将结果汇总,利用小堆求出top K ip。
3、给定100亿个整数,设计算法找到只出现一次的整数?
方法一:100亿个整数加载到内存需要大约40G的空间,一次性加载到内存中是不现实的,采用bitmap,由于要记录出现的次数,一个比特位是无法做到的,我们可以采用2个比特位,00 :表示没有出现,01:表示出现一次,10:出现多次,11:舍弃。而整数大约能表示42亿9千万,100亿整数中有很多重复出现的整数,如果采用bitmap,用两个比特位表示的话大概1G就可以将数据存储下来,由于整数中有负数,我们可以将负数映射到位图的后半部分,并当作无符号数看待。
方法二:整数有32位,我们按照最高位为0和1依次将数据划分成两个部分,存入不同的文件,然后那要查找的数据的最高位比较看去哪个文件中去寻找,最多进行32次划分就能知道这个数在不在100亿数据中。
4、给定两个文件,分别有100亿个整数,只提供1G内存,如何找出两文件交集?
方法一:哈希切割
先对第一个文件进行切分,采用一个散列函数将相同的数都切分到同一个文件中,并对文件进行编号,在对第二个文件也采用同一个散列函数,并对文件进行编号,如果两个文件有交集一定在编号相同的文件里。这时候只需要把编号相同的文件进行比较就可以了。
方法二:位图
将第一个文件的数据映射到位图中,大约需要500M的内存,在用第二个文件中的数据进行寻找。

5、给定两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集?分别给出精确算法和近似算法?
精确算法:哈希切分
先对第一个文件进行切分,采用一个散列函数将相同的数都切分到同一个文件中,并对文件进行编号,在对第二个文件也采用同一个散列函数,并对文件进行编号,如果两个文件有交集一定在编号相同的文件里。这时候只需要把编号相同的文件进行比较就可以了。
近似算法:布隆过滤器:
将一个文件的内容映射到位图中,再用另一个文件进行寻找。但是布隆过滤器是有误差的。
6、如何扩展BloomFilter使得它支持删除操作?如何扩展BloomFilter使得它支持计数操作?
因为布隆过滤器一个比特位可能对应多个元素,所以删除一个元素时不能直接删除,否则会影响其他的元素,这时候我们可以采用引用计数的方式来实现删除操作,为了记录元素出现的次数,我们不能用一个比特位来表示元素了,而是采用无符号整型来表示,具体的实现是用一个vector将集合的元素通过几个哈希函数映射到多个位置,而每个位置的值表示有几个元素映射到这个位置上,删除的时候只需要将对应位置的值-1就可以了。
7、5亿个整数找它们的中位数,只有1G内存。
5亿个整数大概需要2G的内存才可以保存,我们可以将整数划分成若干个区间,为每个区间建立一个文件,将5亿个整数按照大小放到对应的文件中,然后统计们个文件元素的个数就可以找到中位数的位置了。
总结:对于大数据问题解决方法就是切分,再利用数据结构进行求解,常用的数据结构有bitmap、bloomfilter、Trie树等。

点赞