布隆过滤器

小谈布隆过滤器

  1. BitMap
    Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点 节省存储空间)

假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G内存

在Java中,int占4字节,1字节=8位(1 byte = 8 bit)

如果每个数字用int存储,那就是20亿个int,因而占用的空间约为 (2000000000*4/1024/1024/1024)≈7.45G

如果按位存储就不一样了,20亿个数就是20亿位,占用空间约为 (2000000000/8/1024/1024/1024)≈0.233G

  1. Bitmap有什么用

大量数据的快速排序、查找、去重

  • 快速排序

假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复),我们就可以采用Bit-map的方法来达到排序的目的。

要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0,然后将对应位置为1。

最后,遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的,时间复杂度O(n)。

优点:

运算效率高,不需要进行比较和移位;
占用内存少,比如N=10000000;只需占用内存为N/8=1250000Byte=1.25M

缺点:

所有的数据不能重复。即不可对重复的数据进行排序和查找。
只有当数据比较密集时才有优势

bloompy 提供了四种布隆过滤器:

1、标准布隆过滤器。
标准布隆过滤器只能进行数据的查询和插入,是其他过滤器的基类,可以进行过滤器的存储和恢复,代码示例:

import bloompy
bf = bloompy.BloomFilter(error_rate=0.001,element_num=10**3)

查询元素是否在过滤器里返回状态标识

如果不在里面则插入,返回False表示元素不在过滤器里

bf.add(1)
False

bf.add(1)
True

1 in bf
True

bf.exists(1)
True

bf.add([1,2,3])
False

bf.add([1,2,3])
True

[1,2,3] in bf
True

bf.exists([1,2,3])
True

将过滤器存储在一个文件里

bf.tofile(‘filename.suffix’)

从一个文件里恢复过滤器。自动识别过滤器的种类。

recovered_bf = bloompy.get_filter_fromfile(‘filename.suffix’)

或者使用过滤器类的类方法 ‘fromfile’ 来进行过滤器的复原。对应的类只能恢复对应的过滤器

recovered_bf = bloompy.BloomFilter.fromfile(‘filename.suffix’)

返回已经插入的元素个数

bf.count
2

过滤器的容量

bf.capacity
1000

过滤器的位向量

bf.bit_array
bitarray(‘00…’)

过滤器位数组长度

bf.bit_num
14400

过滤器的哈希种子,默认是素数,可修改

bf.seeds
[2, 3, 5, 7, 11,…]

过滤器哈希函数个数

bf.hash_num
10

2、计数布隆过滤器。
它是标准布隆过滤器的子类,但是可以执行删除操作。内置默认使用 4 位二进制位来表示标准布隆过滤器的 1 个位,从而实现可以增减。

import bloompy
cbf = bloompy.CountingBloomFilter(error_rate=0.001,element_num=10**3)

与标准布隆过滤器一样

cbf.add(12)
False

cbf.add(12)
True

12 in cbf
True

cbf.count
1

查询元素状态返回标识,如果元素存在过滤器里则删除

cbf.delete(12)
True

cbf.delete(12)
False

12 in cbf
False

cbf.count
0

从文件中恢复过滤器

recovered_cbf = bloompy.CountingBloomFilter.fromfile(‘filename.suffix’)

3、标准扩容布隆过滤器。
当插入的元素个数超过当前过滤器的容量时,自动增加过滤器的容量,默认内置一次扩容 2 倍。支持查询和插入功能。

import bloompy
sbf = bloompy.ScalableBloomFilter(error_rate=0.001,initial_capacity=10**3)

默认初次可以设置容量1000

len(sbf)
0

12 in sbf
False

sbf.add(12)
False

12 in sbf
True

len(sbf)
1

sbf.filters
[<bloompy.BloomFilter object at 0x000000000B6F5860>]

sbf.capacity
1000

#当过滤器的元素个数达到容量极限时,过滤器会自动增加内置的标准过滤器,
#每次增加2倍容量,自动实现扩容

for i in range(1000):
sbf.add(i)

600 in sbf
True

len(sbf)
2

sbf.filters
[<bloompy.BloomFilter object at 0x000000000B6F5860>, <bloompy.BloomFilter object at 0x000000000B32F748>]

sbf.capacity
3000

从文件中恢复过滤器

recovered_sbf = bloompy.ScalableBloomFilter.fromfile(‘filename.suffix’)

4、计数扩容布隆过滤器。
它是标准扩容布隆过滤器的子类,但支持删除元素的操作。

import bloompy
scbf = bloompy.SCBloomFilter(error_rate=0.001,initial_capacity=10**3)

scbf.add(1)
False

1 in scbf
True

scbf.delete(1)
True

1 in scbf
False

len(scbf)
1

scbf.filters
[<bloompy.CountingBloomFilter object at 0x000000000B6F5828>]

插入元素使其达到过滤器当前容量极限值

for i in range(1100):
scbf.add(i)

len(scbf)
2

scbf.filters
[<bloompy.CountingBloomFilter object at 0x000000000B6F5828>, <bloompy.CountingBloomFilter object at 0x000000000B6F5898>]

从文件中恢复过滤器

recovered_scbf = bloompy.SCBloomFilter.fromfile(‘filename.suffix’)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值