Bloom Filter个人理解
2011-10-16 23:53
155 查看
全力一搏盛大 于是这几天看海量数据方面的文章 刚刚看了bloom filter的原理 个人总结下
首先 bloom filter用在判断一个数是否在集合中 有不可否认的速度(取决于哈希函数的个数) 以及空间复杂度
对于集合s={x1,x2....xn} 首先必须对他进行类似编码的操作 即 维护一个长度为m的位数组bitArray(每个元素都是一个二进制位,即一个bit),然后线性遍历这个集合,分别对每个元素调用K个哈希函数,将其映射到对应的bitArray中的位置,将该位置值设置为1,若该位置已经被置为1了则不进行操作,这样就初始化了bitArray
当要查找某个关键字是否在集合s中时,对其依次调用之前的K个哈希函数,分别查看哈希后的值在bitArray中是否为1,然后统计,若K个哈希调用之后,所有位置值都为1,则该元素就存在于集合s中,注意,这个存在是有一定误差的,因为可能会有特殊的值也正好使得哈希后得到的地址值在每个位上都为1,所以说,bloom filter是允许有一定误差的,这个误差解释为,可能某个不存在于集合中的值被判断为存在,即false postion,但是反之,一个存在于集合中的值不可能被误判为不存在。
这里主要的问题是集合bitArray的大小,即m的大小,以及哈希函数的个数K,这里假设正确率为e,根据一系列牛逼哄哄的数学推导,可以得出m的最小值m(min)=n*lg2(1/e),而要获得最优的哈希函数的个数K时,m=1.44m(min),K=ln2*(m/n),这里怎么得出这些式子的我就不讨论了,要是我能弄明白我就真应该去考个研了(高数没学好的劣势就在这里体现出来了~),这篇文章主要还是个人理解bloom filter
首先 bloom filter用在判断一个数是否在集合中 有不可否认的速度(取决于哈希函数的个数) 以及空间复杂度
对于集合s={x1,x2....xn} 首先必须对他进行类似编码的操作 即 维护一个长度为m的位数组bitArray(每个元素都是一个二进制位,即一个bit),然后线性遍历这个集合,分别对每个元素调用K个哈希函数,将其映射到对应的bitArray中的位置,将该位置值设置为1,若该位置已经被置为1了则不进行操作,这样就初始化了bitArray
当要查找某个关键字是否在集合s中时,对其依次调用之前的K个哈希函数,分别查看哈希后的值在bitArray中是否为1,然后统计,若K个哈希调用之后,所有位置值都为1,则该元素就存在于集合s中,注意,这个存在是有一定误差的,因为可能会有特殊的值也正好使得哈希后得到的地址值在每个位上都为1,所以说,bloom filter是允许有一定误差的,这个误差解释为,可能某个不存在于集合中的值被判断为存在,即false postion,但是反之,一个存在于集合中的值不可能被误判为不存在。
这里主要的问题是集合bitArray的大小,即m的大小,以及哈希函数的个数K,这里假设正确率为e,根据一系列牛逼哄哄的数学推导,可以得出m的最小值m(min)=n*lg2(1/e),而要获得最优的哈希函数的个数K时,m=1.44m(min),K=ln2*(m/n),这里怎么得出这些式子的我就不讨论了,要是我能弄明白我就真应该去考个研了(高数没学好的劣势就在这里体现出来了~),这篇文章主要还是个人理解bloom filter
相关文章推荐
- IOS GCD基础(串 并)(同步 异步)个人理解
- Asp.Net 服务器控件的个人理解
- 设计模式之Builder (创建者模式)的一些个人理解(转)
- 个人从源码理解JIT模式下angular编译AppModule的过程
- 个人对于JAVA反射机制的理解
- JAVA设计模式六大原则个人理解【下】
- js闭包-个人浅理解
- 无线路由器WDS桥接设置方法图解(★★★虽是转载,但是附上了个人理解,firecat推荐★★★)
- 个人理解的爱情shi什么?
- oracle介质恢复中Fuzzy bit的个人理解
- 关于Online Redo Log(ORL)和Standby Redo Log(SRL)的个人理解
- 排序算法的个人理解
- 关于位域个人理解
- swing 个人理解记录
- javascript闭包的个人理解
- 关于技术美术的一些个人理解
- JAVA NIO之个人理解
- 最近在看的freemarker,个人认为有助于理解
- 个人对静态类、静态方法、静态变量的理解
- 个人对container_of宏的理解