当前位置 : 主页 > 网络编程 > PHP >

【Cassandra】bloom 过滤器

来源:互联网 收集:自由互联 发布时间:2023-09-07
问题:如何判断一个元素是否存在于一个集合中 最简单直观的办法就是常用的数据结构与算法---哈希表。但是哈希表的特点是必须存储每一个加入的值,所以空间复杂度与值的数目成正


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

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

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过滤器的原理。

以下是两篇不错的博客:


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


上一篇:【Java】Spring 属性注入 @Autowired 原理
下一篇:没有了
网友评论