欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java布隆過濾器的原理和實現(xiàn)分析

 更新時間:2022年10月14日 08:14:17   作者:碼農(nóng)研究僧  
數(shù)組、鏈表、樹等數(shù)據(jù)結構會存儲元素的內(nèi)容,一旦數(shù)據(jù)量過大,消耗的內(nèi)存也會呈現(xiàn)線性增長所以布隆過濾器是為了解決數(shù)據(jù)量大的一種數(shù)據(jù)結構。本文就來和大家詳細說說布隆過濾器的原理和實現(xiàn),感興趣的可以了解一下

前言

數(shù)組、鏈表、樹等數(shù)據(jù)結構會存儲元素的內(nèi)容,一旦數(shù)據(jù)量過大,消耗的內(nèi)存也會呈現(xiàn)線性增長

所以布隆過濾器是為了解決數(shù)據(jù)量大的一種數(shù)據(jù)結構

講述布隆過濾器的時候需要了解一些預備的知識點:比如哈希函數(shù)

1. 預備知識

1.1 哈希函數(shù)

哈希函數(shù)指將哈希表中元素的關鍵鍵值映射為元素存儲位置的函數(shù)

一般的線性表,樹中,記錄在結構中的相對位置是隨機的,即和記錄的關鍵字之間不存在確定的關系,因此,在結構中查找記錄時需進行一系列和關鍵字的比較。這一類查找方法建立在“比較“的基礎上,查找的效率依賴于查找過程中所進行的比較次數(shù)。 理想的情況是能直接找到需要的記錄,因此必須在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關系f,使每個關鍵字和結構中一個唯一的存儲位置相對應

具體其構造器的方法有:

直接定址法、數(shù)字分析法、平方取中法、折疊法、除留余數(shù)法等

解決其沖突的方法有:

拉鏈法、多哈希法、開放地址法、建域法等

2. 布隆過濾器

2.1 概念

它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。(位數(shù)組和哈希函數(shù))

布隆過濾器可以用于檢索一個元素是否在一個集合中。

它的優(yōu)點是空間效率和查詢時間都比一般的算法要好的多(更加高效,存儲空間?。?/p>

缺點是有一定的誤識別率和刪除困難

2.2 實現(xiàn)原理

之所以要用布隆過濾器,是因為HashMap 的實現(xiàn)也有缺點,例如存儲容量占比高,考慮到負載因子的存在,通??臻g是不能被用滿的,而且數(shù)據(jù)大了之后不可能一次性

比如存儲碼農(nóng)研究僧這個值,通過三個哈希函數(shù),算得三個哈希值,存放在3個位置中(位數(shù)組)

之后判定查詢碼農(nóng)博士僧的時候,發(fā)現(xiàn)這三個值只要有1個沒有為1,就是沒存儲到,也就是沒在集合中

但是如果存儲的值很多,再去查找的時候,可能會出現(xiàn)一定的誤判率,導致本身沒在集合中,但位數(shù)組卻都是1的情況

具體如何選擇上面所說的位數(shù)組長度和哈希函數(shù)的個數(shù)呢

布隆器如果過小,導致很多位置都很快是1,誤判率就很很高,如果布隆器過長,誤判率會越小

哈希函數(shù)的個數(shù)如果過少,其速度慢,誤判率也高,如果哈希函數(shù)的個數(shù)過多,其位1的速度加快,導致布隆過濾器的效率越低

2.3 步驟

添加元素的具體的步驟是

將添加的元素給k個哈希函數(shù)算出對應位數(shù)組上的k個位置,將這k個位置設為1

查詢元素的具體步驟是

將要查詢的元素給k個哈希函數(shù)算出對應于位數(shù)組上的k個位置,如果k個位置有一個為0,則肯定不在集合中。如果k個位置全部為1,則可能在集合中

在計數(shù)布隆過濾器中,進行刪除的前提是必須保證,值一定存在。因此單通過布隆過濾器無法保證值一定存在。如果通過其他的方法確認值存在后進行刪除,則不能保證該值在后續(xù)布隆過濾器查詢時一定返回不存在,因為該值相對應的位置并不一定為零。但確實可以一定概率上優(yōu)化查詢的效率。因此不能說計數(shù)布隆過濾器支持刪除,應該說計數(shù)布隆過濾器提供了實現(xiàn)刪除的可能

2.4 實現(xiàn)

public class MyBloomFilter {
 
    /**
     * 一個長度為10 億的比特位
     */
    private static final int DEFAULT_SIZE = 256 << 22;
 
    /**
     * 為了降低錯誤率,使用加法hash算法,所以定義一個8個元素的質(zhì)數(shù)數(shù)組
     */
    private static final int[] seeds = {3, 5, 7, 11, 13, 31, 37, 61};
 
    /**
     * 相當于構建 8 個不同的hash算法
     */
    private static HashFunction[] functions = new HashFunction[seeds.length];
 
    /**
     * 初始化布隆過濾器的 bitmap
     */
    private static BitSet bitset = new BitSet(DEFAULT_SIZE);
 
    /**
     * 添加數(shù)據(jù)
     *
     * @param value 需要加入的值
     */
    public static void add(String value) {
        if (value != null) {
            for (HashFunction f : functions) {
                //計算 hash 值并修改 bitmap 中相應位置為 true
                bitset.set(f.hash(value), true);
            }
        }
    }
 
    /**
     * 判斷相應元素是否存在
     * @param value 需要判斷的元素
     * @return 結果
     */
    public static boolean contains(String value) {
        if (value == null) {
            return false;
        }
        boolean ret = true;
        for (HashFunction f : functions) {
            ret = bitset.get(f.hash(value));
            //一個 hash 函數(shù)返回 false 則跳出循環(huán)
            if (!ret) {
                break;
            }
        }
        return ret;
    }
 
    /**
     * 測試。。。
     */
    public static void main(String[] args) {
 
        for (int i = 0; i < seeds.length; i++) {
            functions[i] = new HashFunction(DEFAULT_SIZE, seeds[i]);
        }
 
        // 添加1億數(shù)據(jù)
        for (int i = 0; i < 100000000; i++) {
            add(String.valueOf(i));
        }
        String id = "123456789";
        add(id);
 
        System.out.println(contains(id));   // true
        System.out.println("" + contains("234567890"));  //false
    }
}
 
class HashFunction {
 
    private int size;
    private int seed;
 
    public HashFunction(int size, int seed) {
        this.size = size;
        this.seed = seed;
    }
 
    public int hash(String value) {
        int result = 0;
        int len = value.length();
        for (int i = 0; i < len; i++) {
            result = seed * result + value.charAt(i);
        }
        int r = (size - 1) & result;
        return (size - 1) & result;
    }
}

到此這篇關于Java布隆過濾器的原理和實現(xiàn)分析的文章就介紹到這了,更多相關Java布隆過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring?Data?Jpa?復雜查詢方式總結(多表關聯(lián)及自定義分頁)

    Spring?Data?Jpa?復雜查詢方式總結(多表關聯(lián)及自定義分頁)

    這篇文章主要介紹了Spring?Data?Jpa?復雜查詢方式總結(多表關聯(lián)及自定義分頁),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 新版SpringSecurity安全配置說明

    新版SpringSecurity安全配置說明

    這篇文章主要介紹了新版SpringSecurity安全配置說明,在 Spring Security 5.7.0-M2 中,我們棄用了WebSecurityConfigurerAdapter,因為我們鼓勵用戶轉(zhuǎn)向基于組件的安全配置,需要的朋友可以參考下
    2023-07-07
  • Java中Map集合的常用方法(非常詳細!)

    Java中Map集合的常用方法(非常詳細!)

    Java中的Map是一種鍵值對存儲的數(shù)據(jù)結構,它提供了快速查找和訪問數(shù)據(jù)的能力,下面這篇文章主要給大家介紹了關于Java中Map集合的常用方法,需要的朋友可以參考下
    2024-01-01
  • 使用Java實現(xiàn)5種負載均衡算法實例

    使用Java實現(xiàn)5種負載均衡算法實例

    負載均衡指由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具有等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助,這篇文章主要給大家介紹了關于使用Java實現(xiàn)5種負載均衡算法的相關資料,需要的朋友可以參考下
    2021-09-09
  • Java使用entrySet方法獲取Map集合中的元素

    Java使用entrySet方法獲取Map集合中的元素

    這篇文章主要為大家詳細介紹了Java使用entrySet方法獲取Map集合中的元素,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 經(jīng)典再現(xiàn) 基于JAVA平臺開發(fā)坦克大戰(zhàn)游戲

    經(jīng)典再現(xiàn) 基于JAVA平臺開發(fā)坦克大戰(zhàn)游戲

    經(jīng)典再現(xiàn),這篇文章主要介紹了基于JAVA平臺開發(fā)坦克大戰(zhàn)游戲的相關代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • jstack和線程dump實例解析

    jstack和線程dump實例解析

    這篇文章主要介紹了jstack和線程dump實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java Spring @Autowired的這些騷操作,你都知道嗎

    Java Spring @Autowired的這些騷操作,你都知道嗎

    這篇文章主要介紹了徹底搞明白Spring中的自動裝配和Autowired注解的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • 解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題

    解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題

    這篇文章主要介紹了解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解租約機制以及在hbase中的應用

    詳解租約機制以及在hbase中的應用

    這篇文章主要介紹了詳解租約機制以及在hbase中的應用的相關資料,需要的朋友可以參考下
    2017-02-02

最新評論