布隆过滤器BloomFilter

题目:假设集合A有100亿个URL,每个URL是64字节,集合B包含一些URL,现在要求在找出B中的URL是否存在A中。

解法一:使用hash表。但是空间会消耗很大,每条URL64字节,100亿个,总共6400亿个字节,1GB等于10亿个字节,则6400亿个字节要640G空间。所以不现实。

解法二:布隆过滤器。使用布隆过滤器大于20G内存可以解决。布隆过滤器可以看成一个集合,布隆过滤器虽然占用内存少,但是存在失误率。此处失误率是什么?举个例子,某条URL在集合A中,使用布隆过滤器返回结果一定是true,但是一个URL不属于集合A,但是使用布隆过滤器返回的结果也可能返回true。对于这100亿个URL,布隆过滤器失误率在十万分之六。失误率高使用的内存空间小,失误率低使用的内存空间大。

布隆过滤器参数:样本量N,失误率P。布隆过滤器跟单样本大小无关。经典的布隆过滤器只能增加样本,不能减少样本。

假设布隆过滤器大小为m,是bit组成的数组,布隆过滤器上每一位表示一个bit(只能表示0或1)。往布隆过滤器增加一个数的过程:布隆过滤器通过接受样本参数,通过hash函数得到一个值,用这个值模m,得到一个数,用这个数去描黑布隆过滤器。如果一个样本经过k个hash函数,得到k个返回值,拿每个返回值模m,返回的值范围在0~m-1上,然后这些值在布隆过滤器0~m-1范围上相应描黑(描k次)。那么如何查询某个数是否在布隆过滤器里?过程与增加数类似,要查询的数obj经过k个hash函数得到k个返回值,再用返回值模m,得到k个数量的结果,如果布隆过滤器相应的数(k个数)都是黑色,表示已经存在过,如果有一个位置不是黑色,表示绝对没有加入过布隆过滤器。

给出样本量n和想要的失误率p可以确定隆过滤器m和hash函数的个数k。

1.如何确定布隆过滤器m,给出公式。

m=(-1) * (n*lnp) / ((ln2)^2),公式可能到到小数,向上取整。

2.确定hash函数的个数:

3.k=ln2 *(m/n),公式可能到到小数,向上取整。

m和k向上取整后,失误率发生变化,真实的失误率为:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值