【Cassandra】bloom 过滤器

问题:如何判断一个元素是否存在于一个集合中

最简单直观的办法就是常用的数据结构与算法---哈希表。但是哈希表的特点是必须存储每一个加入的值,所以空间复杂度与值的数目成正比,并且一般哈希表是有装载因子这个指标,所以一般空间会大于元素的个数。在海量数据的情况下并不是很合适。

Bloom 过滤器就是针对海量数据情况下查询某一个元素是否存在的一种方法。

其基本的思路是:

找一个很大的bit数组m和k个哈希函数,每一个哈希函数都可以把带存储元素映射到bit数组的每一位。然后每一个待存储的元素x都让这k个哈希函数生成一个值,得到一个序列g1,g2.。。gx。然后g就是m的索引,把m中相应的位置设置为1。这样给定一个数据y,只需要根据k各哈希函数计算出g,只有m中每一个g代表的位置都是1,就认为y是存在的。这个方法的优点是所需要的空间和时间都是常数级别,更加高效。但是缺点也很明显,存在误判而且无法删除。

不过这两个缺点可以改进。

误判的概率是比较小的,据说是万分之一。以下是分析的大致过程:

如果这个元素确实被加入,那么不会误判。如果这个元素没有加入,但是它对应的m数组却恰好被其他的元素设为了1,导致我们认为该元素存在,这是误判的原因,也是我们关系的误判概率。假设已有n个元素,k个哈希函数,m数组大小是m。

那么,某一个数据经过一个哈希函数将数组中任何一位设置为1的概率是1/m。没有设置为1的概率为1-1/m。那么k个哈希函数都没有将这一位设置为1的概率为(1-1/m)^k。n个元素都没有将这一位设置为1的概率为(1-1/m)^kn。那么至少有一个数把该位设置为1的概率是1-(1-1/m)^kn,那么现在需要k位全部是1,概率就是(1-(1-1/m)^kn)^k,这也就是误判的概率。

实际上,这个误判的概率将直接决定m的大小和k的个数。

如果要支持删除,可以用int代替bit。

这便是Bloom过滤器的原理。

以下是两篇不错的博客:

http://www.cnblogs.com/hxsyl/p/4176280.html

http://blog.csdn.net/dadoneo/article/details/6847481

Cassandra中使用了Bloom过滤器来检测key所代表的数据是否存在。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值