什么是布隆过滤器

在网络爬虫中,经常需要确认一个网址是否已经访问过,这样可以节约资源,减少不必要的开销。有一个最直接的方法就是将集合中的全部元素存入计算机,每遇到一个新元素,将它和集合中的元素直接比较即可。

把已访问过的url存入哈希表(Hash Table)中,当需要判断当前url是否已经访问时可以访问哈希表,如果存在则表明已经访问过。其优点是快速准确,缺点也显而易见,耗费了大量的存储空间,尤其是当集合规模巨大的时候。

而今天我们要介绍的布隆过滤器(Bloom Filter)就能解决这样的问题。它能够告诉我们“某个url已经访问过或者可能访问过”。这也是布隆过滤器的一个特点,有一定的误识别率。

工作原理

布隆过滤器实际上是一个很长的二进制向量和一些列随机映射函数。比如当前有100个url,先建立一个1000比特的全零向量,对每一个url,分别使用20个hash函数,把这个url 哈希对应的比特位置为1。我们在判断当前url是否已经访问过,可以看该url哈希之后对应的比特位是否全部为1。若全部为1,则说明该url已经访问过或者可能访问过。

     误识别问题

布隆过滤器不会判错任何一个确实已经访问过的url,但它也有可能将未访问过的url判成已访问。因为不同url在经过哈希之后,这些对应的比特位可能恰好也都被置为1,即误识别问题。

估算这个误识别的概率(在检验上称之为“假阳性”)并不难。我们可以假定共有n个url,布隆过滤器有m比特,共有k个哈希函数。在经过k次哈希之后,布隆过滤器中某一位比特未被置为1的概率为:

插入n个url后还没有将某一位比特置为1的概率P(A)为

那么被置成1的概率为1-P(A),现在假定这n个url都放入到布隆过滤器中,新插入一个不在集合中的url,该url哈希函数正好命中某个值为1的比特的概率就是1-P(A)。一个不在集合中的url被误判为在集合中,需要所有的哈希函数对应的比特值均为1,其概率为(在m比较大的情况下可以近似)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 布隆过滤器(Bloom Filter)是一种数据结构,用于判断一个元素是否在一个集合中。它可以快速的判断出一个元素是否在集合中,但是可能会把不在集合中的元素误判成在集合中。因此,布隆过滤器并不能精确地判断一个元素是否在集合中,而是可以快速的判断出一个元素可能在集合中。 布隆过滤器的实现方式通常是使用一个位数组和多个哈希函数。首先,创建一个由 0 和 1 组成的位数组,然后使用多个哈希函数对每个要添加到集合中的元素进行哈希。每个哈希函数会生成一个数字,该数字表示在位数组中的位置。将位数组中对应的位置的值设为 1,表示该元素可能在集合中。 当要判断一个元素是否在集合中时,同样使用多个哈希函数对该元素进行哈希,得到对应的位置。如果位数组中对应的位置的值都为 1,则该元素可能在集合中;如果位数组中对应的位置的值有 0,则该元素一定不在集合中。 布隆过滤器的优点在于,它可以快速的判断出一个元素是否在集合中 ### 回答2: 布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于集合中。它使用位数组和多个哈希函数来进行存储和判定。 布隆过滤器的实现过程如下: 1. 初始化:创建一个长度为m的位数组,全部初始化为0。 2. 添加元素:将待添加的元素通过k个哈希函数分别映射到位数组的k个位置上,将这些位置的值设为1。 3. 判断元素是否存在:将待判断的元素同样通过k个哈希函数映射到位数组的k个位置上,如果发现其中任何一个位置的值为0,则说明该元素一定不存在于集合中;如果所有位置的值都为1,则该元素可能存在于集合中。 布隆过滤器的基本原理是通过哈希函数将元素映射到位数组上,从而实现高效的元素判定。它具有空间效率高、查询速度快的特点,但有一定的误判率。这是因为多个不同的元素可能映射到位数组的同一个位置上,因此当查询时,有可能判断某个元素存在于集合中,但实际上该元素并不存在。 布隆过滤器在实际应用中具有广泛的用途,如URL去重、缓存穿透、垃圾邮件过滤等。在设计时需要合理选择位数组长度(m)和哈希函数个数(k),以较小的误判率为前提,同时兼顾时间和空间效率。 ### 回答3: 布隆过滤器是一种数据结构,用于快速判断某个元素是否存在于一个大规模集合中。它通过使用位数组和多个哈希函数来实现。 在布隆过滤器中,首先需要创建一个长度为m的位数组,并将所有位初始化为0。同时,我们需要选择k个哈希函数,每个哈希函数将元素映射到位数组中的一个位上。 当要插入一个元素时,需要将该元素经过k个哈希函数得到对应的k个位置,并将这些位置的位值设为1。当要查询一个元素是否存在时,同样需要将该元素经过k个哈希函数,然后检查对应的k个位置的位值。如果其中任何一个位值为0,则表明该元素一定不存在于集合中。但如果所有位值都为1,则该元素可能存在或者是误判,可能需要进一步验证。 布隆过滤器的实现主要依赖于位数组和哈希函数。位数组可以使用一个比特位模拟,节约存储空间。哈希函数可以选择常用的哈希函数,如MD5、SHA等,也可以使用布谷鸟哈希等特殊的哈希函数,以提高过滤器的效果。 然而,布隆过滤器也存在一些缺点。首先,无法删除已插入的元素,因为删除操作会影响到其他元素的判断结果。其次,布隆过滤器的判断结果有一定的误判率,即存在一定的概率将不存在的元素判断成存在。 布隆过滤器常被应用于快速判断一个元素是否存在,例如在大规模的缓存系统和分布式系统中,可以通过布隆过滤器减少对底层存储系统的查询次数,提高系统的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值