将布隆过滤器变形,判断两个list是否据有包含关系(不一定准确,但一定能判断出不包含)

一. 布隆过滤器的原理

  1. 使用一个Bit Array,不断将到来的key通过一个hash函数散列到这个bitArray中。
  2. 然后就可以使用这个bitArray比较新来到的key散列后是否能够映射到这个bitArray为1的位。

这里提出一个小问题:第二步中如何具体比较?
我的想法是:可以将新key的散列值与bitarray&操作,得到的结果如果与bitarry相同即为能够映射。

二. 扩展

将布隆过滤器变形,判断两个list是否据有包含关系(不一定准确,但一定能判断出不包含)

举例: 我们要判断list A是否包含B。

  1. 我们将list A的元素全部散列到bitArray A中。
  2. 将list B的元素全部散列到bitArray B中。
  3. bitArray A与bitArray B 进行&操作,得到结果如果与bitArray A完全相同,即A包含B。
### 布隆过滤器的工作原理 布隆过滤器利用多个哈希函来映射元素到一个固定大小的位组中。对于每一个要加入集合中的新元素,会通过一系列独立的哈希函计算若干个索引位置,并将这些位置上的比特值设为1[^1]。 当需要查询某元素是否存在于该集合时,同样使用相同的哈希函集对该元素进行处理得到对应的索引位置。如果所有这些位置上的比特都为1,则认为此元素可能已经存在于集合之中;反之,只要有一个位置上是1,则可以肯定地说这个元素集合内。 由于可能存在同的输入经过同哈希函后指向相同的位置的情况发生(即碰撞),所以即使所有的测试位都是1也能百分之百确定该元素确实曾经被插入过——这就是所谓的假阳性错误率。然而值得注意的是,真正的阴性情况永远现误报现象:一旦布隆过滤器表明某个项目属于给定的据集,那么这一点是可以完全信赖的。 ```python import mmh3 from bitarray import bitarray class BloomFilter(object): def __init__(self, size, hash_num): self.size = size self.hash_num = hash_num self.bit_array = bitarray(size) self.bit_array.setall(0) def add(self, item): for seed in range(self.hash_num): result = mmh3.hash(item, seed) % self.size self.bit_array[result] = 1 def lookup(self, item): for seed in range(self.hash_num): result = mmh3.hash(item, seed) % self.size if not self.bit_array[result]: return "Definitely not present" return "Probably present" bf = BloomFilter(500000, 7) bf.add('hello') print(bf.lookup('hello')) # Probably present print(bf.lookup('world')) # Definitely not present ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值