布隆过滤器及其数学推导
什么是布隆过滤器
布隆过滤器是由很长的二进制向量和多个随机映射函数组成的,用于判断集合中是否存在某元素。
优点
- 是可以快速的查找和插入
- 占用空间少
空间存储和查找/插入复杂度都是常数
缺点
不可以删除并且有一定的误差(误差率可由二进制向量的长度和随机映射函数控制,且随着插入元素的增多误差率会扩大)
原因:是因为删除首先要保证元素一定要在这个集合中,但是由于布隆过滤器的误差性,导致无法做到删除元素。
布隆过滤器的实现原理
布隆过滤器是通过hash函数将元素映射到bitArray上的一个点,这样就可以通过判断是否该位置上的数是否为1来判断集合中是否有该元素。而对于多个hash函数来讲,就是将元素通过多个hash函数映射到bitArray上,然后判断这些位是否为1,进行元素的查找。
为什么使用多个hash函数
因为使用hash函数就存在hash冲突的问题,如果是hash函数过少的话,那么发生hash冲突的可能性就越大,那么误差率也会越大。所以要根据预期误差率选择合适的hash函数个数。
比如若我们的hash函数足够优秀(能够随机分配到每一个点),那么在一个hash函数的情况下,某一点为1的概率为1/m,如果有k个函数,那么k个位置都为1的概率为 ( 1 / m ) k (1/m)^k (1/m)k以次来降低冲突的概率,并且更好的利用空间。当然,hash函数的个数也不能过高,因为这样会导致位的长度不够,误差率增大。
所以要根据位长和误差率决定k的个数。
这个要根据具体的情况,样本集的大小,以及允许的误差率来确定
数学推导
- 误差率
设有n个key,位长为m,hash函数的个数是k个,失误率为p
假设hash函数足够优秀(落在每个点的概率相同),n和k已知,对于一个hash函数,某一位被置为的概率为1/m,不被置于1的概率为 1 − 1 m 1-{1 \over m} 1−m1,而对于k个hash函数,某一位不被置于1的概率为 ( 1 − 1 m ) k (1-{1 \over m})^k (1−m1)k插入n个key,某一位不被置为1的概率为 ( 1 − 1 m ) k n (1-{1\over m})^{kn} (1−m1)kn则被置为1的概率为 1 − ( 1 − 1 m )