布隆过滤器原理
布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。
理解布隆过滤器原理首先我们得从购买彩票入手,假设我们买的彩种是36选7(即从36个数中选择7个数),如果有三个从不认识而且都居住在不同的地方人都买了彩票,你说他们都选取了7个相同号码的概率是不是很低,我们先假设这三个人分别为 A,B,C
再假设他们购买的彩票号码是
A:1 5 22 8 32 7 18
B:23 5 22 8 31 7 11
C:21 11 22 8 5 7 4
我们再构造一个长度为36个元素的整数数组
arr=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
我们分别找出A、B、C数值对应的数组下标的值是否为1,经验证都为1。从而可以看出我们可以使用像D-arr这样的一个数组来记录用户购买了彩票的哪些数字,反过来这些数字的7位组合对应了某个用户,如果用户给出的7位数对应数组下标的值都为1话那么证明了这用户确实是购买了这彩票。像上面的D-arr可能还存在某个用户F,他买的号码可能是: 1 11 18 21 23 31 32。
好了,现在我们再来假设出来了一种新采种,叫作100万选9,就是说上面的arr变成了100万个元素的数组。我们再假设购买彩票的人有1万人,那么这一万人当中存在某两个人购买了相同彩票的概率是多少呢?那是很低低的,自己算去哈。。。
好吧,这就是布隆过滤器原理,就是把字符串映射成多个随机的数组下标,不同的字符串有一定概率映射到相同的数组下标,决定这个概率的因素有映射字符串的数量(就是上例的有多少人购买彩票)和arr的长度以及随机数生成的策略(就是上面购买彩票的人所使用的买彩票算法,如果每个人都使用或者大部人都使用相同的算法,那么这个概率就会增加,如果尽可能地每个人买采的算法都不同则概率降低)。
PS:此文章并非完全正确,这是作者学习布隆过滤器时候的感悟,发上来的目标也是为了求证我这感悟是否正确。谢谢!