1.概述

在本文中,我们将研究来自的绽放过滤器结构郭瓦图书馆。绽放过滤器是我们可以用来回答问题的记忆效率,概率的数据结构无论是给定的元素是否在一组中

没有假底片使用绽放过滤器,因此返回时错误的,我们可以100%确定元素不在集中。

但是,绽放过滤器可以返回误报,所以当它返回时真的,有一个很高的概率,元素在集合中,但我们不能100%确定。

对于更深入的分析盛开过滤器的工作原理,可以通过本教程

2. Maven依赖

我们将使用Guava的绽放过滤器的实现,因此让我们添加郭瓦依赖性:

<依赖>  com.google.guava   GUAVA   29.0-JRE  

最新版本可以找到Maven Central.

3.为什么使用Bloom过滤器?

绽放过滤器是旨在节省空间且快速。使用时,我们可以指定我们可以接受的假正响应的概率并且,根据该配置,盛开的过滤器将占用只能很少。

由于这种空间效率,绽放过滤器将很容易地适合内存即使是大量的元素。某些数据库,包括Cassandra和Oracle,使用此过滤器作为第一个检查,例如,在进行磁盘或缓存之前,例如,当特定ID的请求进入时。

如果过滤器返回ID不存在,则数据库可以停止进一步处理请求并返回给客户端。否则,它将进入磁盘并在磁盘上找到找到元素。

4.创建绽放过滤器

假设我们想创建最多500的绽放过滤器整数并且我们可以忍受误报的百分比(0.01)概率。

我们可以使用布卢默来自课程的课程郭瓦图书馆实现这一目标。我们需要通过我们预期插入过滤器的元素数量以及所需的错误正概率:

BloomFilter  Filter = BloomFilter.Create(Funnels.interfunnel(),500,0.01);

现在让我们向筛选器添加一些数字:

filter.put(1);filter.put(2);filter.put(3);

我们只添加了三个元素,我们定义了最大插入数将为500,因此我们的绽放过滤器应该产生非常准确的结果。让我们使用它测试它montcontain()方法:

asserthat(filter.mightcontain(1))。Istrue();asserthat(filter.mightcontain(2))。istrue();asserthat(filter.mightcontain(3))。Istrue();asserthat(filter.mightcontain(100))。Isfalse();

顾名思义,我们不能100%确保在方法返回时实际上在过滤器中实际上是在过滤器中的真的

什么时候montcontain()回报真的在我们的示例中,我们可以确定元素在过滤器中的99%,并且结果是误报的一个百分比概率。过滤器返回时错误的,我们可以100%确定元素不存在。

5.过度饱和的绽放过滤器

当我们设计我们的绽放过滤器时,重要的是,我们为预期的元素数提供合理准确的价值。否则,我们的滤镜将以比所需的更高速率返回误报。让我们看一个例子。

假设我们创建了一个具有百分之一的假误概率的过滤器,并且预期的某些元素等于五,但我们插入了100,000个元素:

BloomFilter  Filter = BloomFilter.Create(Funnels.integerFunnel(),5,0.01);INTSTRAME.RANGE(0,100_000).Foreach(过滤器::放);

因为预期的元素数量如此小,所以过滤器将占用非常小的内存。

但是,随着我们添加更多的物品,而不是预期过滤器变为过度饱和,并且返回错误阳性结果具有更高的概率比所需的百分比:

asserthat(filter.mightcontain(1))。Istrue();asserthat(filter.mightcontain(2))。istrue();asserthat(filter.mightcontain(3))。Istrue();asserthat(filter.mightcontain(1_000_000))。istrue();

请注意moullcontatin()方法真的即使是我们没有插入的价值以前进入过滤器。

六,结论

在这个快速的教程中,我们研究了绽放过滤器数据结构的概率性质 - 利用郭瓦执行。

您可以找到所有这些示例和代码片段的实现GitHub项目

这是一个Maven项目,所以应该易于导入和运行。

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!