【C++】—— 大数据处理

前面我们讲过哈希的两个应用
哈希应用之位图
哈希应用之布隆过滤器
今天我们就用这两个应用来解决一些有关大数据处理的问题

大数据处理

位图的应用
 1、给定100亿个整数,设计算法找到只出现一次的整数?


 思路分析:

- 1)100亿个数,无符号整型最多才42亿多,因此我们首先要明白,这里有很多重复的数,所以我们在进行空间的建立时,只用分析42亿多的就可以了,那么就是16G,这道题没有规定要使用多大的内存,但是如果我们直接建16G的,那也不可能,所以我们就利用位图来进行解决,那么整型是需要32位的,就需要大约500M的内存就可以了

- 2)我们将位图设置三个状态,用两个bit表示出现次数,00表示没出现过,01表示出现过1次,10表示出现过多次,11舍弃,最后归并每个文件中出现只有1次的数即为所求。然后我们就可以进行遍历找出只出现一次的整数

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


 思路分析:
1)文件进行比较,用位图显然不能解决

2)肯定要进行哈希切分,我们将两个文件分别切分为1000个文件,先对文件A分的1000个文件里的整数进行哈希分配,即取出来整数模除1000,使相同的整出进入相同的文件,文件B切分的1000个文件进行同样的处理,然后分别拿A哈希切分好的第一个文件和B哈希切分好的第一个文件对比,找出交集存到一个新文件中,依次类推,直到2000个文件互相比较完。

详细点解释就是:
使用hash函数将第一个文件的所有整数映射到1000个文件中,每个文件有1000万个整数,大约40M内存。
内存可以放下,把1000个文件记为 a1,a2,a3.....a1000,用同样的hash函数映射第二个文件到1000个文件中,这1000个文件记为b1,b2,b3......b1000,由于使用的是相同的hash函数,所以两个文件中一样的数字会被分配到文件下标一致的文件中,分别对a1和b1求交集,a2和b2求交集,ai和bi求交集,最后将结果汇总,即为两个文件的交集。

3、位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

思路分析:

1)文件进行比较,还是用位图解决,和第一题差别不大,用两位表示数出现的次数,00表示未出现,01表示出现1次,10表示出现两次,11表示两次以上。然后扫描100亿个数,查看位图中对应的位置,如果是00,01,10,则加1变成01,10,11;如果是11,则不变。最后再扫描一遍位图,输出01,10对应的数。  2^32 * 2 = 8Gbits = 1GB

2)肯定要进行哈希切分,我们将两个文件分别切分为1000个文件,先对文件A分的1000个文件里的整数进行哈希分配,即取出来整数模除1000,使相同的整出进入相同的文件,文件B切分的1000个文件进行同样的处理,然后分别拿A哈希切分好的第一个文件和B哈希切分好的第一个文件对比,找出交集存到一个新文件中,依次类推,直到2000个文件互相比较完。

布隆过滤器的应用

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

近似算法:

利用布隆过滤器:经过哈希切分后,将其中一个放到哈希表中然后让B来进行比对,利用两个布隆过滤器,思路和位图应用中的题三相似,但是布隆过滤器存在一定的误差

精确算法:

1)我们首先来看,100亿个query(一般query就当做字符串),如果我们假定这里的一个字符串大小是50,那么我们就需要500G大的内存,显然放不下,所以我们就要进行哈希切分,将10亿数据切割为不一定相等的多个部分

2)这里我将它切分成1000份,那么每份的大小就是500M,

3)然后我们使用什么方法来进行这道题的具体解决呢,我来用图示说明下:

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

思路分析:

1)首先我们知道

      布隆过滤对于不存在的数是能进行准确判断的,但是对于存在的数是不一定,因为会出现误判的情况

      由于布隆的特点,因此它在实现的时候,是有多个置位的,因此不同的数(或者是其它的类型)会出现置位的冲突,所以如果直接进行删除的话,就会影响其它的数。

2)因此,这里我们可以想到一种解决办法就是利用引用计数

3、如何扩展BlooFilter使得它支持计数操作?

思路分析:

1)上题中我们知道引用计数可以使得布隆过滤器实现删除操作,但是有问题,如果我们使用引用计数的话,至少得4个字节,而我们知道布隆过滤器的优点有节省空间,这样的话,就有点违背了,所以我们就放弃位图,所以这里我们呢就要考虑使用样的什么数据结构

2)(以字符串来为例)这里我们依然用vector来存储引用计数,然后进行哈希字符串转换算法进行转换,让转换后对应的整型数作为下标自增,这里很明显就不用位图了,利用引用计数已经完成了它的功能。

3)所以我们进行删除的时候,就将计数中大于等于1的进行减减复位
 

发布了167 篇原创文章 · 获赞 175 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chenxiyuehh/article/details/90738748