布隆过滤器了解

本篇纯属兴趣爱好,只是自己简单看了一下了解了一下这是个啥。因为之前看过位图,所以理解起来比较简单。看这个之前可以先看一下位图:位图
好,正式开始,其实布隆过滤器这个东西也是因为内存限制而出现的。这是一个数据结构吧可以说是。但不同的是它是概率型的。用来告诉你,这个东西可能存在或一定不存在。有着高效的插入和查询,所以对于查询类效果很好,但是缺点就是概率型,不确切。我来慢慢道来。
首先我们假设一个场景,我要查询我的数据库里有没有“CSDN”,有的话就放入缓存区。
好,我们先像位图一样,以一个8比特为一个单元来进行位图计算吧。
在这里插入图片描述
我们在存取CSDN时,利用哈希函数生成哈希值,比如我们0、4、7这三个位,然后置1。
在这里插入图片描述
在进行查询时,我们检查这三个位置,如果都为1,说明可能存在“CSDN”。为什么是可能,这要从哈希说起,哈希函数在计算不同数的哈希值是可能会计算到同一地址。也就是说某个位不一定对应某个字符。
在这里插入图片描述
嘿嘿,布隆嘛,我们存一下LOL,可能这个布隆真是游戏里那个。在存取的时候,将3、7两位置1。问题就来了,第七位的1被覆盖了。也就是7位现在对应着两个字符,我们假设是S和L。那么我们如果查找SOS。就会出现这种情况。
在这里插入图片描述
恩,看了看,都是1,所以我们断定……等等,是不是有什么误会。
是的,因为7处对应了不同的字符,所以在检测时,如果我们SOS里面的S不存在,但是由于L将这个位置置了1,但哈希值S还是会找到此位,然后看到为1,判断S存在。
所以,我们叫它概率型。当数据越来越多的时候,可能会有其他字符也将7处置1。这时候误判率就会变高。这个跟哈希函数和过滤器长度有关。具体的计算和分析没有细细研究。
这个东西很明显我们用在允许有一定误判的情况下。就比如面试的时候,经常会有面试邮件不小心进入了垃圾邮件。这其实就是误判了。如果我们只是想确认这个东西在不在里面,如果全部位都是0,那么肯定不存在。

越来越多的数据结构接触下来,发现编程本身就是一个选择的过程。在不同场景下,每个数据结构的威力是不一样的。我们要做的是分析我们的需求,然后选择合适的数据结构和算法,而不是死套公式,死循旧规。 没有最好,只有更好。这句话也适合编程。 最后的一点感慨吧算是。编程路漫漫,加油。