国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于Guava布隆過濾器的海量字符串高效去重實踐

這篇具有很好參考價值的文章主要介紹了基于Guava布隆過濾器的海量字符串高效去重實踐。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在Java環(huán)境中處理海量字符串去重的問題時,布隆過濾器(BloomFilter)是一種非常高效的數(shù)據(jù)結(jié)構(gòu),盡管它有一定的誤報率。布隆過濾器適用于那些可以接受一定誤報率,并且希望節(jié)省空間和時間成本的場景。
基于Guava布隆過濾器的海量字符串高效去重實踐,源碼,guava,java,算法,數(shù)據(jù)結(jié)構(gòu),spring cloud,mysql,面試

布隆過濾器應(yīng)用

使用Google Guava庫來實現(xiàn)基于布隆過濾器的海量字符串去重是一個很好的選擇。布隆過濾器是一種空間效率極高的概率型數(shù)據(jù)結(jié)構(gòu),它利用位數(shù)組表示集合,并使用哈希函數(shù)將元素映射到位數(shù)組的某些位置。布隆過濾器可以高效地檢查一個元素是否可能屬于某個集合,但有一定的誤報率。

首先,確保你的項目中包含了Guava庫。如果你使用Maven,可以在pom.xml文件中添加以下依賴:

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

然后,你可以使用下面代碼創(chuàng)建布隆過濾器進行字符串去重:

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) {  
        // 預(yù)計的字符串數(shù)量(根據(jù)實際情況進行調(diào)整)  
        long expectedInsertions = 1000000L;  
        // 可接受的誤報率(根據(jù)實際情況進行調(diào)整)  
        double fpp = 0.01; // 1%的誤報率  
  
        // 創(chuàng)建一個布隆過濾器實例  
        BloomFilter<String> bloomFilter = BloomFilter.create(  
                Funnels.stringFunnel(StandardCharsets.UTF_8),  
                expectedInsertions,  
                fpp  
        );  
  
        // 模擬海量字符串  
        List<String> strings = new ArrayList<>();  
        // 假設(shè)這里有很多重復(fù)的字符串...  
        strings.add("hello");  
        strings.add("world");  
        strings.add("hello"); // 重復(fù)字符串  
        strings.add("guava");  
        strings.add("bloom");  
        strings.add("filter");  
        strings.add("world"); // 重復(fù)字符串  
  
        // 去重過程  
        List<String> deduplicatedStrings = new ArrayList<>();  
        for (String str : strings) {  
            if (!bloomFilter.mightContain(str)) {  
                // 如果布隆過濾器中可能不包含該字符串,則將其添加到過濾器和結(jié)果列表中  
                bloomFilter.put(str);  
                deduplicatedStrings.add(str);  
            }  
        }  
  
        // 輸出結(jié)果  
        System.out.println("Deduplicated strings:");  
        for (String uniqueStr : deduplicatedStrings) {  
            System.out.println(uniqueStr);  
        }  
    }  
}

在這個示例中,我們首先創(chuàng)建了一個布隆過濾器實例,指定了預(yù)計的字符串數(shù)量和可接受的誤報率。然后,我們模擬了一個包含重復(fù)字符串的列表,并使用布隆過濾器進行去重。對于每個字符串,如果布隆過濾器可能不包含它(mightContain返回false),我們就將其添加到過濾器和去重后的字符串列表中。

布隆過濾器原理詳解

布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。

布隆過濾器可以告訴我們 “某樣?xùn)|西一定不存在或者可能存在”,也就是說布隆過濾器說這個數(shù)不存在則一定不存,布隆過濾器說這個數(shù)存在可能不存在(誤判,后續(xù)會講)。

布隆過濾器是一種空間效率極高的概率型數(shù)據(jù)結(jié)構(gòu),它利用位數(shù)組表示集合,并使用哈希函數(shù)將元素映射到位數(shù)組的某些位置。布隆過濾器并不直接存儲數(shù)據(jù)本身,而是通過位數(shù)組中的特定位來表示數(shù)據(jù)是否存在。

布隆過濾器的數(shù)據(jù)結(jié)構(gòu)主要由兩部分組成:

  • 位數(shù)組(Bit Array):布隆過濾器使用一個長度固定的位數(shù)組來存儲數(shù)據(jù)。每個位置只占用一個比特(0或1),初始時所有位都設(shè)置為0。位數(shù)組的長度和哈希函數(shù)的數(shù)量決定了過濾器的誤報率和容量。

  • 哈希函數(shù)集合:布隆過濾器使用多個哈希函數(shù),每個函數(shù)都會將輸入數(shù)據(jù)映射到位數(shù)組的一個不同位置。哈希函數(shù)的選擇對過濾器的性能有很大影響,理想的哈希函數(shù)應(yīng)該具有良好的散列性,使得不同的輸入盡可能均勻地映射到位數(shù)組的不同位置。

如下就是一個簡單的布隆過濾器示意圖,其中k1、k2代表增加的元素,a、b、c即為無偏hash函數(shù),最下層則為二進制數(shù)組。
基于Guava布隆過濾器的海量字符串高效去重實踐,源碼,guava,java,算法,數(shù)據(jù)結(jié)構(gòu),spring cloud,mysql,面試

布隆過濾器的操作主要包括:

  • 添加元素:當向布隆過濾器中添加一個新元素時,會使用所有的哈希函數(shù)對該元素進行哈希,并將位數(shù)組中對應(yīng)位置設(shè)置為1。注意,同一個位可能會被多個元素哈希到,因此可能會被多次設(shè)置為1,但實際上只需要第一次設(shè)置。

例如,key = Liziba,無偏hash函數(shù)的個數(shù)k=3,分別為hash1、hash2、hash3。三個hash函數(shù)計算后得到三個數(shù)組下標值,并將其值修改為1
基于Guava布隆過濾器的海量字符串高效去重實踐,源碼,guava,java,算法,數(shù)據(jù)結(jié)構(gòu),spring cloud,mysql,面試

  • 查詢元素:當需要查詢一個元素是否可能存在于布隆過濾器中時,同樣會使用所有的哈希函數(shù)對該元素進行哈希,并檢查位數(shù)組中對應(yīng)位置是否都為1。如果有任何一個位置為0,則可以確定該元素一定不在過濾器中。如果所有位置都為1,則元素可能存在于過濾器中,但存在一定的誤報率。

  • 刪除元素:布隆過濾器不支持直接刪除元素。這是因為刪除一個元素需要將位數(shù)組中對應(yīng)位置重置為0,但這樣可能會影響到其他也被哈希到該位置的元素。因此,布隆過濾器是一種“添加容易,刪除困難”的數(shù)據(jù)結(jié)構(gòu)。

布隆過濾器的好處

  • 空間效率:布隆過濾器不需要存儲實際數(shù)據(jù),只需要一個位數(shù)組和一些哈希函數(shù),因此空間效率非常高。
  • 查詢速度:布隆過濾器的查詢操作只需要進行哈希和位操作,因此速度非???。
  • 添加速度:添加元素到布隆過濾器中同樣只需要進行哈希和位操作,速度也很快。
  • 安全性:布隆過濾器不存儲實際數(shù)據(jù),因此在某些對安全性要求較高的場景中很有用。
    需要注意的是,布隆過濾器有一定的誤報率。這是因為不同的元素可能會哈希到相同的位置,導(dǎo)致位數(shù)組中對應(yīng)位置被錯誤地設(shè)置為1。此外,布隆過濾器不支持刪除操作,因為刪除一個元素可能會影響到其他元素。

布隆過濾器的缺點

  • 誤報率:布隆過濾器有一定的誤報率,即可能會錯誤地認為某個不在集合中的元素在集合中。誤報率與二進制向量的長度和哈希函數(shù)的數(shù)量有關(guān),可以通過調(diào)整這兩個參數(shù)來控制誤報率。
  • 無法刪除元素:由于布隆過濾器的特性,一旦一個元素被添加到過濾器中,就無法從過濾器中刪除。這是因為刪除元素可能會導(dǎo)致其他元素被誤刪。

總的來說,布隆過濾器是一種非常適合處理海量數(shù)據(jù)去重問題的數(shù)據(jù)結(jié)構(gòu),尤其是在空間和時間成本都非常敏感的場景下。雖然它有一定的誤報率,但在很多應(yīng)用中,這個缺點是可以接受的。在使用布隆過濾器時,需要根據(jù)具體的應(yīng)用場景和需求來調(diào)整參數(shù),以達到最佳的效果。文章來源地址http://www.zghlxwxcb.cn/news/detail-819974.html

到了這里,關(guān)于基于Guava布隆過濾器的海量字符串高效去重實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 哈希的應(yīng)用 -- 布隆過濾器與海量數(shù)據(jù)處理

    哈希的應(yīng)用 -- 布隆過濾器與海量數(shù)據(jù)處理

    布隆過濾器是由布?。˙urton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu),特點是高效地插入和查詢,以用來告訴你 “ 某樣?xùn)|西一定不存在或者可能存在 ”,它是用多個哈希函數(shù),將一個數(shù)據(jù)映射到位圖結(jié)構(gòu)中。此種方式不僅可以提升查詢效率,也

    2024年02月02日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu):位圖、布隆過濾器以及海量數(shù)據(jù)面試題

    數(shù)據(jù)結(jié)構(gòu):位圖、布隆過濾器以及海量數(shù)據(jù)面試題

    1.1概念 引入 給40億個不重復(fù)的無符號整數(shù),沒排過序。給一個無符號整數(shù),如何快速判斷一個數(shù)是否在這40億個數(shù)中。 (1)遍歷: 時間復(fù)雜度O(N) (2)排序加二分:時間復(fù)雜度O(N*logN) 其中 方法(2)是行不通 的,因為內(nèi)存很難裝下這么多數(shù)據(jù)(40億整數(shù)大概為16G)。 方法(1) 可行

    2024年02月05日
    瀏覽(29)
  • 【C++】位圖|布隆過濾器|海量數(shù)據(jù)處理面試題

    【C++】位圖|布隆過濾器|海量數(shù)據(jù)處理面試題

    所謂位圖,就是用每一位來存放某種狀態(tài),適用于海量數(shù)據(jù),數(shù)據(jù)無重復(fù)的場景。通常是用來判斷某個數(shù)據(jù)存不存在。 首先我們來看一道題目: 給定40億個不重復(fù)的無符號整數(shù),沒有進行排序。現(xiàn)在給一個無符號整形,如何快速判斷一個數(shù)是否存在這40億個數(shù)中。 現(xiàn)在有三種

    2024年02月13日
    瀏覽(23)
  • 布隆過濾器四種實現(xiàn)(Java,Guava,hutool,Redisson)

    布隆過濾器四種實現(xiàn)(Java,Guava,hutool,Redisson)

    為預(yù)防大量黑客故意發(fā)起非法的時間查詢請求,造成緩存擊穿,建議采用布隆過濾器的方法解決。布隆過濾器通過一個很長的二進制向量和一系列隨機映射函數(shù)(哈希函數(shù))來記錄與識別某個數(shù)據(jù)是否在一個集合中。如果數(shù)據(jù)不在集合中,能被識別出來,不需要到數(shù)據(jù)庫中進

    2024年01月16日
    瀏覽(19)
  • 【C++】海量數(shù)據(jù)處理面試題(位圖和布隆過濾器)

    【C++】海量數(shù)據(jù)處理面試題(位圖和布隆過濾器)

    都是大廠面試題哦~ 文章目錄 一.位圖面試題 ? ? 1. 給定 100 億個整數(shù),設(shè)計算法找到只出現(xiàn)一次的整數(shù) ? ? 2.給兩個文件,分別有 100 億個整數(shù),我們只有 1G 內(nèi)存,如何找到兩個文件交集? ? ? 3. 1 個文件有 100 億個 int , 1G 內(nèi)存,設(shè)計算法找到出現(xiàn)次數(shù)不超過 2 次的所有整

    2024年02月07日
    瀏覽(24)
  • 哈希思想應(yīng)用【C++】(位圖,布隆過濾器,海量數(shù)據(jù)處理面試題)

    哈希思想應(yīng)用【C++】(位圖,布隆過濾器,海量數(shù)據(jù)處理面試題)

    ?? 目錄 一,位圖 1. 位圖概念 2.實現(xiàn) 3. 測試題 位圖的優(yōu)缺點 二,布隆過濾器 1). 布隆過濾器提出 2). 概念 3). 布隆過濾器的查找 4). 布隆過濾器刪除(了解) 5). 布隆過濾器優(yōu)點 6).?布隆過濾器缺陷 三,海量數(shù)據(jù)面試題 1)哈希切割 我們首先由一道面試題來理解位圖 給40億個不

    2024年02月04日
    瀏覽(49)
  • 【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用)

    【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用)

    緩存穿透是指在使用緩存機制時,大量的請求無法從緩存中獲取到結(jié)果,導(dǎo)致請求都要直接訪問后端存儲系統(tǒng),從而增加了系統(tǒng)的負載和響應(yīng)時間。 通常的緩存機制是將請求的結(jié)果緩存在內(nèi)存或其他高速存儲介質(zhì)中,當相同的請求再次到達時,可以直接從緩存中獲取結(jié)果,避

    2024年02月04日
    瀏覽(22)
  • 位圖以及布隆過濾器

    位圖以及布隆過濾器

    本文主要講解哈希思想的實際應(yīng)用,位圖和布隆過濾器。 講解位圖之前我們先來解答這樣一道騰訊的面試題 給40億個不重復(fù)的無符號整數(shù),沒排過序。給一個無符號整數(shù),如何快速判斷一個數(shù)是否在這40億個數(shù)中?!掘v訊】 很多人立馬就想到了用哈希表或者紅黑樹,因為足夠

    2024年02月08日
    瀏覽(17)
  • Redis----布隆過濾器

    目錄 背景 解決方案 什么是布隆過濾器 布隆過濾器的原理 一些其他運用 比如我們在觀看新聞或者刷微博的時候,會不停地給我們推薦新的內(nèi)容,我們發(fā)現(xiàn)幾乎沒有重復(fù)的,說明后臺已經(jīng)進行了去重處理,基于如何去重,Redis給出了高效的方案---布隆過濾器 1.記錄已經(jīng)瀏覽過

    2024年02月09日
    瀏覽(24)
  • 布隆過濾器的原理

    布隆過濾器是一種用于檢索一個元素是否在一個集合中的數(shù)據(jù)結(jié)構(gòu),具有高效的查詢性能和較小的內(nèi)存占用。 布隆過濾器的底層實現(xiàn)主要涉及以下幾個步驟: 初始化數(shù)組: 首先,初始化一個比較大的數(shù)組,數(shù)組中的元素用二進制表示,初始值都為0。 Hash計算: 當一個新的元

    2024年01月18日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包