18. 布隆过滤器(Bloom Filter)

布隆过滤器是一种空间效率高、概率型的数据结构,用于判断一个元素可能是否存在,常用于网页黑名单、垃圾邮件过滤和爬虫网址判重等场景。其通过多个哈希函数将元素映射到二进制向量上,添加元素时将对应位置设为1,查询时所有位置都为1则可能存在,反之则一定不存在。尽管具有一定的误判率,但其时间复杂度低,适合处理大量数据。
摘要由CSDN通过智能技术生成
1 布隆过滤器
  1. 如果要经常判断 1 个元素是否存在,你会怎么做?
    1. 很容易想到使用哈希表(HashSet、HashMap),将元素作为 key 去查找
    2. 时间复杂度:O(1),但是空间利用率不高,需要占用比较多的内存资源
  2. 如果需要编写一个网络爬虫去爬10亿个网站数据,为了避免爬到重复的网站,如何判断某个网站是否爬过?
    1. 很显然,HashSet、HashMap 并不是非常好的选择
  3. 布隆过滤器是一种时间复杂度低、占用内存较少的方案
  4. 1970年由布隆提出,它是一个空间效率高的概率型数据结构,可以用来告诉你:一个元素一定不存在或者可能存在。本质上是一个很长的二进制向量和一系列随机映射函数(Hash函数)
  5. 优缺点
    1. 优点:空间效率和查询时间都远远超过一般的算法
    2. 缺点:有一定的误判率、删除困难
  6. 常见应用:网页黑名单系统、垃圾邮件过滤系统、爬虫的网址判重系统、解决缓存穿透问题
  7. 假设布隆过滤器由 20位二进制、 3 个哈希函数组成,每个元素经过哈希函数处理都能生成一个索引位置
    1. 添加元素:将每一个哈希函数生成的索引位置都设为 1
    2. 查询元素是否存在
      1. 如果有一个哈希函数生成的索引位置不为 1,就代表不存在(100%准确)
      2. 如果每一个哈希函数生成的索引位置都为 1,就代表存在(存在一定的误判率)
      3. 添加、查询的时间复杂度都是:O(k) ,k 是哈希函数的个数。空间复杂度是:O(m) ,m 是二进制位的个数
        在这里插入图片描述
  8. 布隆过滤器的误判率
    在这里插入图片描述
  9. BloomFilter
package com.mj;

public class BloomFilter<T> {
   
	/**
	 * 二进制向量的长度(一共有多少个二进制位)
	 */
	private int bitSize;
	/**
	 * 二进制向量
	 */
	private long[] bits;
	/**
	 * 哈希函数的个数
	 */
	private int hashSize;
	
	/**
	 * @param n 数据规模
	 * @param p 误判率, 取值范围(0, 1)
	 */
	public BloomFilter(int n, double p) {
   
		if (n <= 0 || p <= 0 || p >= 1) {
   
			throw new IllegalArgumentException("wrong n or p");
		}
		
		double ln2 = Math.log(2);
		// 求出二进制向量的长度
		bitSize = (int) (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值