布隆过滤
最近经常在别人的文章中看到布隆过滤,看了一些应用场景,觉得这个东西还真是在特定的情况能发挥超常的作用。
比如我们在刷今日头条的时候,我们看完一段,然后下刷,头条就推荐一些新文章给我们。
头条有无数个文章,我们也读了一些文章,那么头条是怎么做到不推荐重复文章给我们的呢?这里就是用到布隆过滤的时候了。
先来个官方的解释:https://en.wikipedia.org/wiki/Bloom_filter
布隆过滤呢,是布隆这个人在1970提出来的一种数据结构,可以用来计算一个是不是包含在一个超大的集合中,但是有一定的误差。
如果计算到元素不在集合中,那么这个元素一定不在集合中;
如果计算到元素在集合中,那么这个元素可能在集合中。
假如我们有m个元素,现在要检查元素x是否在m中。那么布隆是怎么计算检查的呢?
1,建一个长度为n的数组,元素全部为0,
2,h个哈希算法,每个算法都把m中的元素hash成整数N
3,把数组的N元素设置成1
4,增加的时候,再用h个哈希算法,算出h个整数N,再把数组的元素N设置成1
查找时,把元素x,用h个哈希算法,算出h个整数N,如果数组的N元素某个为0,则我们认为x不在m中
这样我们的布隆过滤的数据结构就做好了。从中我们可以看到一些布隆过滤的优点:
1,没有存储m个元素的值
2,速度比较快
缺点就是有时候不准。m的数量越来越多,就越不准确。
有点像现在互联网分布式系统中的CAP理论
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得 。