基于Guava布隆过滤器的海量字符串高效去重实践

这篇具有很好参考价值的文章主要介绍了基于Guava布隆过滤器的海量字符串高效去重实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Java环境中处理海量字符串去重的问题时,布隆过滤器(BloomFilter)是一种非常高效的数据结构,尽管它有一定的误报率。布隆过滤器适用于那些可以接受一定误报率,并且希望节省空间和时间成本的场景。
基于Guava布隆过滤器的海量字符串高效去重实践,源码,guava,java,算法,数据结构,spring cloud,mysql,面试

布隆过滤器应用

使用Google Guava库来实现基于布隆过滤器的海量字符串去重是一个很好的选择。布隆过滤器是一种空间效率极高的概率型数据结构,它利用位数组表示集合,并使用哈希函数将元素映射到位数组的某些位置。布隆过滤器可以高效地检查一个元素是否可能属于某个集合,但有一定的误报率。

首先,确保你的项目中包含了Guava库。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

<dependency>  
    <groupId>com.google.guava</groupId>  
    <artifactId>guava</artifactId>  
    <version>31.0.1-jre</version> <!-- 使用你需要的版本 -->  
</dependency>

然后,你可以使用下面代码创建布隆过滤器进行字符串去重:

import com.google.common.hash.Funnels;  
import com.google.common.primitives.Ints;  
import com.google.common.util.concurrent.BloomFilter;  
  
import java.nio.charset.StandardCharsets;  
import java.util.ArrayList;  
import java.util.List;  
  
public class BloomFilterDeduplication {  
  
    public static void main(String[] args) {  
        // 预计的字符串数量(根据实际情况进行调整)  
        long expectedInsertions = 1000000L;  
        // 可接受的误报率(根据实际情况进行调整)  
        double fpp = 0.01; // 1%的误报率  
  
        // 创建一个布隆过滤器实例  
        BloomFilter<String> bloomFilter = BloomFilter.create(  
                Funnels.stringFunnel(StandardCharsets.UTF_8),  
                expectedInsertions,  
                fpp  
        );  
  
        // 模拟海量字符串  
        List<String> strings = new ArrayList<>();  
        // 假设这里有很多重复的字符串...  
        strings.add("hello");  
        strings.add("world");  
        strings.add("hello"); // 重复字符串  
        strings.add("guava");  
        strings.add("bloom");  
        strings.add("filter");  
        strings.add("world"); // 重复字符串  
  
        // 去重过程  
        List<String> deduplicatedStrings = new ArrayList<>();  
        for (String str : strings) {  
            if (!bloomFilter.mightContain(str)) {  
                // 如果布隆过滤器中可能不包含该字符串,则将其添加到过滤器和结果列表中  
                bloomFilter.put(str);  
                deduplicatedStrings.add(str);  
            }  
        }  
  
        // 输出结果  
        System.out.println("Deduplicated strings:");  
        for (String uniqueStr : deduplicatedStrings) {  
            System.out.println(uniqueStr);  
        }  
    }  
}

在这个示例中,我们首先创建了一个布隆过滤器实例,指定了预计的字符串数量和可接受的误报率。然后,我们模拟了一个包含重复字符串的列表,并使用布隆过滤器进行去重。对于每个字符串,如果布隆过滤器可能不包含它(mightContain返回false),我们就将其添加到过滤器和去重后的字符串列表中。

布隆过滤器原理详解

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存,布隆过滤器说这个数存在可能不存在(误判,后续会讲)。

布隆过滤器是一种空间效率极高的概率型数据结构,它利用位数组表示集合,并使用哈希函数将元素映射到位数组的某些位置。布隆过滤器并不直接存储数据本身,而是通过位数组中的特定位来表示数据是否存在。

布隆过滤器的数据结构主要由两部分组成:

  • 位数组(Bit Array):布隆过滤器使用一个长度固定的位数组来存储数据。每个位置只占用一个比特(0或1),初始时所有位都设置为0。位数组的长度和哈希函数的数量决定了过滤器的误报率和容量。

  • 哈希函数集合:布隆过滤器使用多个哈希函数,每个函数都会将输入数据映射到位数组的一个不同位置。哈希函数的选择对过滤器的性能有很大影响,理想的哈希函数应该具有良好的散列性,使得不同的输入尽可能均匀地映射到位数组的不同位置。

如下就是一个简单的布隆过滤器示意图,其中k1、k2代表增加的元素,a、b、c即为无偏hash函数,最下层则为二进制数组。
基于Guava布隆过滤器的海量字符串高效去重实践,源码,guava,java,算法,数据结构,spring cloud,mysql,面试

布隆过滤器的操作主要包括:

  • 添加元素:当向布隆过滤器中添加一个新元素时,会使用所有的哈希函数对该元素进行哈希,并将位数组中对应位置设置为1。注意,同一个位可能会被多个元素哈希到,因此可能会被多次设置为1,但实际上只需要第一次设置。

例如,key = Liziba,无偏hash函数的个数k=3,分别为hash1、hash2、hash3。三个hash函数计算后得到三个数组下标值,并将其值修改为1
基于Guava布隆过滤器的海量字符串高效去重实践,源码,guava,java,算法,数据结构,spring cloud,mysql,面试

  • 查询元素:当需要查询一个元素是否可能存在于布隆过滤器中时,同样会使用所有的哈希函数对该元素进行哈希,并检查位数组中对应位置是否都为1。如果有任何一个位置为0,则可以确定该元素一定不在过滤器中。如果所有位置都为1,则元素可能存在于过滤器中,但存在一定的误报率。

  • 删除元素:布隆过滤器不支持直接删除元素。这是因为删除一个元素需要将位数组中对应位置重置为0,但这样可能会影响到其他也被哈希到该位置的元素。因此,布隆过滤器是一种“添加容易,删除困难”的数据结构。

布隆过滤器的好处

  • 空间效率:布隆过滤器不需要存储实际数据,只需要一个位数组和一些哈希函数,因此空间效率非常高。
  • 查询速度:布隆过滤器的查询操作只需要进行哈希和位操作,因此速度非常快。
  • 添加速度:添加元素到布隆过滤器中同样只需要进行哈希和位操作,速度也很快。
  • 安全性:布隆过滤器不存储实际数据,因此在某些对安全性要求较高的场景中很有用。
    需要注意的是,布隆过滤器有一定的误报率。这是因为不同的元素可能会哈希到相同的位置,导致位数组中对应位置被错误地设置为1。此外,布隆过滤器不支持删除操作,因为删除一个元素可能会影响到其他元素。

布隆过滤器的缺点

  • 误报率:布隆过滤器有一定的误报率,即可能会错误地认为某个不在集合中的元素在集合中。误报率与二进制向量的长度和哈希函数的数量有关,可以通过调整这两个参数来控制误报率。
  • 无法删除元素:由于布隆过滤器的特性,一旦一个元素被添加到过滤器中,就无法从过滤器中删除。这是因为删除元素可能会导致其他元素被误删。

总的来说,布隆过滤器是一种非常适合处理海量数据去重问题的数据结构,尤其是在空间和时间成本都非常敏感的场景下。虽然它有一定的误报率,但在很多应用中,这个缺点是可以接受的。在使用布隆过滤器时,需要根据具体的应用场景和需求来调整参数,以达到最佳的效果。文章来源地址https://www.toymoban.com/news/detail-819974.html

到了这里,关于基于Guava布隆过滤器的海量字符串高效去重实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 哈希的应用 -- 布隆过滤器与海量数据处理

    布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,以用来告诉你 “ 某样东西一定不存在或者可能存在 ”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也

    2024年02月02日
    浏览(31)
  • 数据结构:位图、布隆过滤器以及海量数据面试题

    1.1概念 引入 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 (1)遍历: 时间复杂度O(N) (2)排序加二分:时间复杂度O(N*logN) 其中 方法(2)是行不通 的,因为内存很难装下这么多数据(40亿整数大概为16G)。 方法(1) 可行

    2024年02月05日
    浏览(34)
  • 【C++】位图|布隆过滤器|海量数据处理面试题

    所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在。 首先我们来看一道题目: 给定40亿个不重复的无符号整数,没有进行排序。现在给一个无符号整形,如何快速判断一个数是否存在这40亿个数中。 现在有三种

    2024年02月13日
    浏览(32)
  • 布隆过滤器四种实现(Java,Guava,hutool,Redisson)

    为预防大量黑客故意发起非法的时间查询请求,造成缓存击穿,建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数(哈希函数)来记录与识别某个数据是否在一个集合中。如果数据不在集合中,能被识别出来,不需要到数据库中进

    2024年01月16日
    浏览(27)
  • 【C++】海量数据处理面试题(位图和布隆过滤器)

    都是大厂面试题哦~ 文章目录 一.位图面试题     1. 给定 100 亿个整数,设计算法找到只出现一次的整数     2.给两个文件,分别有 100 亿个整数,我们只有 1G 内存,如何找到两个文件交集?     3. 1 个文件有 100 亿个 int , 1G 内存,设计算法找到出现次数不超过 2 次的所有整

    2024年02月07日
    浏览(47)
  • 哈希思想应用【C++】(位图,布隆过滤器,海量数据处理面试题)

       目录 一,位图 1. 位图概念 2.实现 3. 测试题 位图的优缺点 二,布隆过滤器 1). 布隆过滤器提出 2). 概念 3). 布隆过滤器的查找 4). 布隆过滤器删除(了解) 5). 布隆过滤器优点 6). 布隆过滤器缺陷 三,海量数据面试题 1)哈希切割 我们首先由一道面试题来理解位图 给40亿个不

    2024年02月04日
    浏览(35)
  • 【SpringBoot篇】基于布隆过滤器,缓存空值,解决缓存穿透问题 (商铺查询时可用)

    缓存穿透是指在使用缓存机制时,大量的请求无法从缓存中获取到结果,导致请求都要直接访问后端存储系统,从而增加了系统的负载和响应时间。 通常的缓存机制是将请求的结果缓存在内存或其他高速存储介质中,当相同的请求再次到达时,可以直接从缓存中获取结果,避

    2024年02月04日
    浏览(32)
  • 算法~布隆过滤器

    布隆过滤器(Bloom Filter)是一种高效的概率数据结构,用于判断一个元素是否存在于集合中。它基于位数组和多个哈希函数,并具有以下特点: Bloom Filter 是一个基于概率的数据结构:它只能告诉我们一个 元素绝对不在集合内 或 可能在集合内 快速查询:布隆过滤器具有快速

    2024年02月05日
    浏览(34)
  • 布隆过滤器详解

    本文全部代码地址 布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于一个集合中.它的主要优点是速度快,空间占用少,因此在需要快速判断某个元素是否在集合中的场合得到广泛引用. 布隆过滤器就是 一个大型的位数组和几个不一样的无偏hash函数. 所谓无偏就是

    2023年04月22日
    浏览(43)
  • 位图以及布隆过滤器

    本文主要讲解哈希思想的实际应用,位图和布隆过滤器。 讲解位图之前我们先来解答这样一道腾讯的面试题 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】 很多人立马就想到了用哈希表或者红黑树,因为足够

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包