位图和布隆过滤器学习

1.bitmap位图

将数据以二进制位表示的结构。基本原理就是用一个bit 位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。

Bitmap常用于快速去重和计数操作。Bloom Filter就是一种基于Bitmap的概率性数据结构,用于检查元素是否在一个集合中。

假设有一个集合{1, 3, 4},我们可以用一个Bitmap来表示这个集合:

  元素: 1 2 3 4 5 6
  Bitmap: 1 0 1 1 0 0

2.bloom filter

Bloom Filter是一种空间效率非常高的概率性数据结构,用于判断一个元素是否属于某个集合,去重过滤场景。它非常适合用于处理大规模数据集,尤其是在需要高效查找和节省空间的场景中。虽然Bloom Filter可能会出现假阳性错误(即错误地认为某个元素在集合中),但它不会产生假阴性错误(即不会错误地认为某个实际存在的元素不在集合中)。

Bloom Filter的核心思想是利用多个哈希函数将元素映射到一个位数组(Bitmap)中。具体步骤如下:

  1. 初始化位数组:Bloom Filter使用一个大小为m的位数组,所有位最初都设置为0。

  2. 哈希函数映射:Bloom Filter配备了k个独立的哈希函数。每个哈希函数都将输入元素映射到位数组中的一个位置。

  3. 插入元素:当插入一个元素时,通过这k个哈希函数计算出k个位置,将这些位置上的位设置为1。

  4. 查询元素:要查询一个元素是否存在时,同样通过这k个哈希函数计算出k个位置,如果所有这些位置上的位都是1,则认为元素可能存在于集合中;如果任何一个位置上的位是0,则可以确定该元素一定不存在。

使用多个哈希函数的原因:

  • 降低误判率(假阳性率)
  • 降低哈希冲突。单个哈希函数容易造成哈希冲突,多个哈希函数可以提高鲁棒性。
  • 优化空间利用率。使得分布更均匀。

2.1 优缺点

优点:空间效率高、插入速度快、查询速度快。增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)。

缺点:不可删除,删除可能会影响其他元素的判断;假阳性错误,因为有可能不同元素计算的哈希值一样。

2.2 应用场景

  • 去重操作:在大规模数据处理中,Bloom Filter常用于快速判断某个元素是否已经存在于集合中,避免重复处理。

  • 缓存策略:在分布式系统中,Bloom Filter可以用于判断某个请求是否已经缓存,如果没有则直接访问数据库或后端存储。

  • 网络爬虫:网络爬虫可以使用Bloom Filter来判断URL是否已经被访问过,以避免重复抓取。

3.如何调参

如何选择参数?布隆过滤器的大小、假阳性率、元素存储数量都分别有什么关系?

转自:布隆过滤器概念及其公式推导_lkknp-CSDN博客

  • m-占用空间大小,单位:bit(8bit= 1字节B)
  • n-要存储的样本数量
  • q-假阳性率

  • 单个样本大小不影响布隆过滤器大小,因为样本会通过哈希函数得到输出值。

哈希函数个数的计算:

计算失误率的公式:

例子:

不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64字节。要求该系统允许有万分之一以下的判断失误率,并且使用的额外空间不要超过30G。

n=100亿,p=0.0001,m=19.19n,m约为2000亿bit;

k= 14,需要14个哈希函数。再有m、n、k计算失误率为0.0006%。

4.应用例子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
位图(Bitmap)和布隆过滤器(Bloom Filter)都是常用的数据结构,用于处理大规模数据集合,但它们有着不同的应用场景和用途。 位图是一种压缩数据结构,用于快速地判断某个元素是否在集合中。位图的实现方式是将每个元素映射到一个二进制位上,如果该元素存在于集合中,则将对应的二进制位标记为1,否则标记为0。这样,当需要查询某个元素是否在集合中时,只需要查找对应的二进制位即可。由于位图的实现方式非常简单,因此可以快速地进行插入和查询操作,而且占用的空间也非常小,适合处理大规模数据集合。 布隆过滤器也是一种快速判断元素是否存在于集合中的数据结构,但其实现方式与位图略有不同。布隆过滤器使用一组哈希函数将元素映射到多个二进制位上,并将对应的二进制位标记为1。当查询某个元素是否在集合中时,将该元素进行哈希映射,并查找对应的二进制位,如果所有的二进制位都被标记为1,则说明该元素可能存在于集合中,否则可以确定该元素不存在于集合中。布隆过滤器的优点是可以快速地判断一个元素不存在于集合中,而且占用的空间也比较小,但存在误判率的问题。 因此,位图布隆过滤器虽然都可以用来处理大规模数据集合,但它们的实现方式和应用场景有所不同。位图适用于需要快速地判断某个元素是否在集合中的场景,而布隆过滤器适用于需要快速地判断一个元素不存在于集合中的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值