大数据处理题型分析

来源:互联网 发布:乐乎城市青年社区租房 编辑:程序博客网 时间:2024/05/16 05:13

大数据处理,顾名思义,数据量非常大,有些可以一次处理,有些需要分割后对其进行处理。解决这类题型的第一点就是要算出其所需空间的大小;

1.给定100亿个整数,设计算法找到只出现一次的整数;

解题思路:有100亿个整数,一个整数4字节,共所占空间:100亿*4字节 = 10G*4 = 40G;所有整数的范围为0到42亿9千万;

需要找到只出现一次的整数,那么我们就可以直接断定一个数出现的状态就有三个-------->没有出现,出现1次,出现1次以上。三种状态用两个二进制位足以表示;

使用位图的变形就可完成这个题的解答(由原来位图的1个位表示一个数,变形为2个位表示一个数);

40亿左右的整数,一个数用两个位表示,所占大约1G的空间;


2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

对与两个大文件中比较的处理,首先要考虑的是内存中是否能放的下这个文件,如果放不下就需要切分,如何切分是个重要的问题,一种是等分,一种是哈希切分,怎么切要视情况而定。针对本次等分显然是有大的问题,比如说,相同数据不在一个块中;所以需要的是哈希切分;什么是哈希切分,如果不知道,就去看看上一篇博客把;哈希切分之后,相同的数肯定是进入了同一个小文件。

3.1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数?

100亿个int,占约40G的空间,要找出现次数不超过2次的所有整数,也是三个状态------>不存在,不超过2次,超过两次;
int 类型所能表示数的个数大约位42亿9千万;两个二进制位表示一个数所需要大约1G的空间;
这道题与第一个题是相同的;

4.给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法?

100亿个query == 320G;
(1)精确算法:要求的是不能有误差;
利用哈希切分,切分为计算机能处理的大小,切成1000份,平均下来每个小文件占320M,也可以保证两个文件中相同query进入编号相同的小文件;一次比较小文件即可;与题2一样;
(2)近似算法:可以允许可忍受范围的误差;
利用布隆过滤器;一个整形可以表示范围为42亿9千万,要减小布隆的误判,一个数用五个位来表示,这样就可以有效减少误判;在保证未使用的二进制为占总的1/2前提下,1G内存,能表示1024*1024**1024*32 = 8589934592个二进制位(即80亿左右的二进制位),(若100亿个query都不相同,一个80亿是不够表示的,可以把100亿等分再布隆)



5.如何扩展BloomFilter使得它支持计数操作?

要BloomFilter支持计数操作,每一位至少是一个int类型的,所以位图就不能作为底层进行实现了,底层需要加一个整形数组去实现,数组中存放的是这一位所出现的次数;

6.如何扩展BloomFilter使得它支持删除元素的操作

扩展BlommFilter支持删除,必须在底层加一个引用计数,使其每一位的删除不影响别的数据;计数已经在上一题说明了思路;


0 0
原创粉丝点击