布隆过滤器的使用场景:
主要就是使用在用于海量数据中,查询一个数据是否存在。
先来看几个比较常见的例子:
1.字处理软件中,需要检查一个英语单词是否拼写正确
2.在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上
3.在网络爬虫里,一个网址是否被访问过........
布隆过滤器的本质还主要是从hash函数和数组基础的数据结构出发,核心就是使用几个hash函数和一个很大的位数组实现(跟位图法有一点点的类似)。
主要特征:
1.一个很长的二进制向量 (位数组)
2.一系列随机函数 (哈希)
3.空间效率和查询效率高
4.有一定的误判率(哈希表是精确匹配)
假设有如下3个元素x,y,z,又有3个hash函数,使用这个三个hash函数分别对x,y,z进行hash处理,把处理得到的结果记录在位数组(主要就是记录0,1,0表示这个位代表的数值不存在,1代表这个位置上代表的数值存在)查找一个新的值W是否存在于原始数据中时,就只需对使用3个hash函数分别对w进行hash处理,进而得到的数值于位数组中的值进行比对,如果三个位置上都是1则证明w就存在于原始数据之中,否则只要有一个位置出现0就证明w就不存在于原始数据中。
这时我们来讨论一下可能出现的问题:
在验证w是否存在于原始数据中时会出现一个问题就是就是hash之后的值对应位数组中的值都是1,但是w却不存在于原始数组之中,举个例子就按下图中4,5,6三个位置而言,这个三个位置值都为1,但是这个三个位置的1却是又不同数据经过hash得到的而不是一个数据经过三次hash,所以如果有另一个数据r经过三次hash之后拿到的位置是4,5,6三个位置时系统就是判定r存在于原始数组中,但是事实是r并没有在原始数组中,这就是布隆过滤器的不精确的缺陷。这个其实还是来自于hash函数,因为数据量的问题hash函数得到的值一定会具有重复性,因此布隆过滤器可以用一句话去概括“没有的一定没有,有的不一定有”。
因此选择一个合适的hash函数对于提升布隆过滤器的精度有很大的作用,布隆过滤器在数学之美中提及过一个粗略的精度值,后续在补上,有什么更加深刻的理解后续再补上,未完待续。。。。