标签:工具包 假设 string put int version import maven 哪些
最近看流式系统的时候有提到Exactly-Once 策略 可以使用布隆过滤器(Bloom Filter) 优化, 所以今天来整理一下与其相关的知识 (非科班, 底子比较薄)。
值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
坐标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
值 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
坐标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
只要布隆过滤器任务数据不存在, 就可以执行插入。
当布隆过滤器任务数据重复时, 统计可能重复的数据。
布隆过滤器的误判率(通过迭代 + 极限计算可得):
\[
f \approx (1 - e^\frac{-nk}{m})^k
\]
m: 二进制向量的大小 (bit)
k: 为hash运算的数量
n: 加入其中的key的数量
由于误判率可以计算且较小, 只要对可能重复的数据再重复进行过滤就可以将误判的数据逐渐剔除。
这些数据只要有一次被判定为非重复数据, 那么它们就不是重复数据。
Guava 是Google 开源的 常用方法 的 java语言工具包
通过maven导入Guava坐标:
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
写代码执行测试
package com.ronnie.bloom;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class BloomDemo {
// 预计要插入的数据
private static int size = 1000000;
// 预估的误判率
private static double falseProbability = 0.01;
private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, falseProbability);
public static void main(String[] args) {
// 插入数据
for (int i = 0; i < size; i++){
bloomFilter.put(i);
}
int count = 0;
for (int i = size; i < size * 2; i++){
if (bloomFilter.mightContain(i)){
count++;
System.out.println(i + "被误判了");
}
}
System.out.println("总共误判了 " + count + " 个数");
}
}
结果输出:
1999501被误判了
1999567被误判了
1999640被误判了
1999697被误判了
1999827被误判了
1999942被误判了
总共误判了 10314 个数
\[ \frac{10314}{1000000}\approx 0.01 \]
标签:工具包 假设 string put int version import maven 哪些
原文地址:https://www.cnblogs.com/ronnieyuan/p/11700749.html