前言如果要判断一个元素是否在集合中 , 一般的思路是保存集合中的所有元素 , 然后通过比较来确定 。链表、树、哈希表(也叫哈希表、哈希表)等数据结构都是这种方式 , 存储位置要么是磁盘 , 要么是内存 。很多时候 , 要么时间换空间 , 要么空间换时间 。
【什么是布隆过滤器?你学会了吗?】在对响应时间要求比较严格的情况下 , 如果我们有里面 , 那么随着集合中元素数量的增加 , 我们需要的存储空间越来越大 , 检索时间也越来越长 , 导致内存过多开销和时间效率变低 。
这时候需要考虑的问题是 , 在数据量比较大的情况下 , 既能满足时间要求 , 又能满足空间要求 , 所以我们需要一种时间和空间消耗都比较小的数据结构和算法 。布隆过滤器是一种解决方案 。
什么是布隆过滤器?Bloom Filter, 布隆过滤器由 Bloom于 1970 年提出 。它实际上是一个长二进制向量和一系列随机映射函数, 布隆过滤器可用于检索元素是否在集合中 。其优点是空间效率和查询时间远超一般算法 , 缺点是存在一定的误识别率和删除难度 。根据它的特性 , 应用场景有如下:
- 爬虫过滤 。
- 邮箱垃圾邮件过滤 。
- 黑名单过滤 。
- 大数据去重 。
- 防止缓存穿透 。
Bloom Filter与单一哈希函数Bit-Map的区别在于 , Bloom Filter使用k个哈希函数 , 每个字符串对应k个bits , 从而降低碰撞概率 。
![什么是布隆过滤器?你学会了吗?](http://img.jiangsulong.com/230131/1QQ52F7-0.jpg)
文章插图
由于Bloom filter只存储0和1而不存储具体值 , 所以在一些机密场合具有先天优势 。位图的每一位都是一个位 , 所以通过位图有10亿个位置 , 位图的大小为0.12G , 插入和查询的时间复杂度为O(k),k是哈希函数的个数 。
布隆过滤器的问题布隆过滤器之所以能够在时间和空间上取得比较高的效率 , 是因为它牺牲了判断的准确性和删除的便利性 。
- 判断错误
对于这个问题 , 可以通过增加位图数组的大小(位图数组越大 , 占用的内存越大)和减少哈希冲突来解决 。但缺点是会增加占用的内存空间 。
另一种解决方案是增加散列函数的数量并减少散列冲突 。如果同一个键值等于一个函数 , 经过两个或多个哈希函数得到相等结果的概率自然会降低 。然而 , 这会导致计算效率的降低 , 因为时间复杂度退化为O(hash times) 。
- 难以去除
?Counting Bloom Filter?
?来解决这个问题 。JAVA中如何使用布隆过滤器google的guava就提供了这样的API.
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version></dependency>
编写测试代码import com.google.common.base.Charsets;import com.google.common.hash.BloomFilter;import com.google.common.hash.Funnels; public class GuavaBloomFilter {public static void main(String[] args) {int total = 1000000;// default false positive ratefpp0.03// fpp:There will always be a false positive rate in a Bloom filter// Because hash collisions are impossible to avoid 100%.// Bloom filter calls this misjudgment rate false positive probability , abbreviated as fppBloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total);// Initialize the total bar data into the filterfor (int i = 0; i < total; i++) {bf.put("" + i);}// Determine whether the value exists in the filterint count = 0;for (int i = 0; i < total + 10000; i++) {if (bf.mightContain("" + i)) {count++;}}System.out.println("Matched quantity " + count);// Specified misjudgment rate: 1/10,000 to improve matching accuracyBloomFilter<CharSequence> bfWithFpp = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total, 0.0001);for (int i = 0; i < total; i++) {bfWithFpp.put("" + i);}int countFpp = 0;for (int i = 0; i < total + 10000; i++) {if (bfWithFpp.mightContain("" + i)) {countFpp++;}}//The smaller the value of the false positive rate fpp// the higher the matching accuracy.// When the value of the false positive rate fpp is reduced// the storage space required is also larger// Therefore, in actual use,// a trade-off needs to be made between the false positive rate and the storage space.System.out.println("The specified false positive rate has matched the number " + countFpp);// (1000001 - 1000000)/(1000000 + 10000) * 100 ≈ 0.0001}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 胡歌|胡歌官宣结婚生女,直言老婆不是公众人物,网友感慨太突然
- 上证指数|今天,一堆巨亏!
- 挽救了无数生命的青霉素,竟然是被偶然发现的
- 过来人告诉你,什么样的装修才是花在刀刃上!真不是瞎说
- 装了两套房,总结出5个“装修教训”,都是“跟风”惹的祸
- 淘宝小二在哪里找;淘宝小二是什么意思?
- 调笑令韦应物赏析 唐代诗人韦应物的《调笑令》表达了什么意思?
- 联通的0元购机是什么意思最好说详细点。 0元购手机需要什么条件
- mpkg文件怎么转化为mp4格式?mpkg是什么?
- 椰砖是酸性还是碱性__海带是碱性的吗?