布隆过滤器
是一个很长的二进制向量和一系列映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.
优点:
空间效率和查询时间都比一般的算法要好很多
缺点:
有一定的误识别率和删除时比较困难
如果想要判断一个元素是否在这个集合中,一般是将所有元素保存,然后通过比较确定.链表和树等都是这种思路,但是随着集合中元素的增加,我们需要的存储空间就会越来越大,而检索速度也将会变低.不过有一种散列表的数据结构,他可以通过一个hash函数将一个元素映射成一个位阵列中的一个点.这样我们只需要去查看他这个点上是否为1就知道集合中有没有它.这就是布隆过滤器的基本思想.
算法:
- 首先需要k个hash函数,每个函数可以把key散列成为1个整数
- 初始化时,需要一个长度为n比特1数组,每个比特的初始化都为0
- 每个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
- 判断key是否在集合中,用k个hash函数计算出k个散列值,并查询出数组中对应的比特位,如果比特位都是1,则认为在集合中
注意:
如果查询时这些点由任何一个是0,则被查询的变量一定不存在;
如果都是1,则被查询的变量可能存在(因为映射函数本身就是散列函数,散列函数是会有碰撞的)
布隆数据结构:
**优点:**不需要存储key,节省内存空间
**缺点:**无法删除; 算法如果判断出元素在集合中,有一定几率其实不在其中