赞
踩
假设有这样一个需求:在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
大量数据的快速排序、查找、去重
假设我们要对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)
bf.add(1)
Falsebf.add(1)
True1 in bf
Truebf.exists(1)
Truebf.add([1,2,3])
Falsebf.add([1,2,3])
True[1,2,3] in bf
Truebf.exists([1,2,3])
True
bf.tofile(‘filename.suffix’)
recovered_bf = bloompy.get_filter_fromfile(‘filename.suffix’)
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)
Falsecbf.add(12)
True12 in cbf
Truecbf.count
1
cbf.delete(12)
Truecbf.delete(12)
False12 in cbf
Falsecbf.count
0
recovered_cbf = bloompy.CountingBloomFilter.fromfile(‘filename.suffix’)
3、标准扩容布隆过滤器。
当插入的元素个数超过当前过滤器的容量时,自动增加过滤器的容量,默认内置一次扩容 2 倍。支持查询和插入功能。
import bloompy
sbf = bloompy.ScalableBloomFilter(error_rate=0.001,initial_capacity=10**3)
len(sbf)
012 in sbf
Falsesbf.add(12)
False12 in sbf
Truelen(sbf)
1sbf.filters
[<bloompy.BloomFilter object at 0x000000000B6F5860>]sbf.capacity
1000
#当过滤器的元素个数达到容量极限时,过滤器会自动增加内置的标准过滤器,
#每次增加2倍容量,自动实现扩容
for i in range(1000):
sbf.add(i)600 in sbf
Truelen(sbf)
2sbf.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)
False1 in scbf
Truescbf.delete(1)
True1 in scbf
Falselen(scbf)
1scbf.filters
[<bloompy.CountingBloomFilter object at 0x000000000B6F5828>]
for i in range(1100):
scbf.add(i)len(scbf)
2scbf.filters
[<bloompy.CountingBloomFilter object at 0x000000000B6F5828>, <bloompy.CountingBloomFilter object at 0x000000000B6F5898>]
recovered_scbf = bloompy.SCBloomFilter.fromfile(‘filename.suffix’)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。