成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中的布隆過濾器,你知道嗎?

開發 前端
布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤識別率和刪除困難。

原理

布隆過濾器(Bloom Filter)是1970年由伯頓·霍華德·布?。˙urton Howard Bloom)提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。

布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤識別率和刪除困難。

如果想判斷一個元素是不是在一個集合里,一般想到的是將集合中所有元素保存起來,然后通過比較確定。鏈表、樹、散列表(又叫哈希表,Hash Table)等等數據結構都是這種思路。但是隨著集合中元素的增加,我們需要的存儲空間越來越大。同時檢索速度也越來越慢,上述三種結構的檢索時間復雜度分別為O(n)、O(logn)、O(1)。

布隆過濾器的原理是,當一個元素被加入集合時,通過K個散列函數將這個元素映射成一個位數組中的K個點,把它們置為1。

圖片圖片

檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。

圖片圖片

接下來,我們看下在Java中怎么使用。

單機版:Guava

首先引入依賴:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>33.2.1-jre</version>
</dependency>

然后使用Guava中的BloomFilter類開始實現:

@Test
public void testBloomFilter() {
    final List<String> itemsToInsert = Arrays.asList("apple", "banana", "cherry", "elderberry");

    // 創建布隆過濾器
    BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), 100, 0.01);
    // 當前元素數量為0
    Assertions.assertEquals(0, bloomFilter.approximateElementCount());

    // 向布隆過濾器中插入數據
    for (String item : itemsToInsert) {
        bloomFilter.put(item);
    }
    // 當前元素數量為4
    Assertions.assertEquals(4, bloomFilter.approximateElementCount());

    // 測試已插入的數據
    for (String item : itemsToInsert) {
        Assertions.assertTrue(bloomFilter.mightContain(item), "Item should be in the Bloom Filter: " + item);
    }

    // 測試未插入的數據
    final List<String> itemsNotInserted = Arrays.asList("grape", "orange", "peach", "quince", "raspberry");
    for (String item : itemsNotInserted) {
        Assertions.assertFalse(bloomFilter.mightContain(item), "Item should not be in the Bloom Filter: " + item);
    }
}

Guava實現的是單機版,雖然提供了文件寫出的功能,可以將文件分發到分布式系統中,但是這種方式只能是補充。推薦只在單機場景中使用Guava的布隆過濾器。

如果想要在分布式服務中使用,可以選擇Redission。

分布式版:Redission

引入依賴:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.11.5</version>
</dependency>

使用Docker在本地啟一個Redis服務,用來驗證:

docker run -d -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest

然后編碼測試:

@Test
public void testBloomFilter() {
    // 使用Docker本地啟動一個Redis服務用來測試:
    //  docker run -d -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest

    Config config = new Config();
    config.useSingleServer().setAddress("redis://127.0.0.1:6379");

    // 生成key是 myBloomFilter 的存儲
    // 會生成兩個key,"myBloomFilter"、"{myBloomFilter}:config"
    // "myBloomFilter"是string類型,布隆過濾器的主存
    // "{myBloomFilter}:config"是hash結構,存儲元信息,比如大小size、期望容量expectedInsertions、誤報率falseProbability、使用的哈希函數數量hashIterations等。
    RBloomFilter<String> bloomFilter = Redisson.create(config)
            .getBloomFilter("myBloomFilter");

    // 初始化布隆過濾器,定義期望容量和誤報率
    bloomFilter.tryInit(1000000, 0.01);

    // 準備一些測試數據
    final List<String> itemsToInsert = Arrays.asList("apple", "banana", "cherry", "elderberry");

    // 向布隆過濾器中插入數據
    for (String item : itemsToInsert) {
        bloomFilter.add(item);
    }

    // 測試已插入的數據
    for (String item : itemsToInsert) {
        Assertions.assertTrue(bloomFilter.contains(item), "Item should be in the Bloom Filter: " + item);
    }

    // 測試未插入的數據
    final List<String> itemsNotInserted = Arrays.asList("grape", "orange", "peach", "quince", "raspberry");
    for (String item : itemsNotInserted) {
        Assertions.assertFalse(bloomFilter.contains(item), "Item should not be in the Bloom Filter: " + item);
    }
}

使用Redission的RBloomFilter,會根據布隆過濾器名字在Redis中生成兩個key,比如上面代碼的名字是“myBloomFilter”,生成的配置為:

  • "myBloomFilter"是string類型,布隆過濾器的主存,用來存儲二進制數組;
  • "{myBloomFilter}:config"是hash結構,存儲元信息,比如大小size、期望容量expectedInsertions、誤報率falseProbability、使用的哈希函數數量hashIterations等。


責任編輯:武曉燕 來源: 看山的小屋
相關推薦

2024-01-05 09:04:35

隆過濾器數據結構哈希函數

2025-02-08 17:30:00

布隆過濾器數據結構

2024-09-18 10:08:37

2025-01-22 00:00:00

布隆過濾器二進制

2024-03-15 11:21:22

布隆過濾器數據庫數據

2023-01-31 08:19:53

二進制元素數量

2025-04-30 08:47:41

2024-11-04 08:45:48

布隆過濾器元數據指紋值

2020-10-29 07:16:26

布隆過濾器場景

2019-03-22 15:15:25

Redis緩存擊穿雪崩效應

2022-03-21 08:31:07

布隆過濾器Redis過濾器原理

2021-09-03 06:33:24

布隆過濾器高并發

2024-10-09 15:54:38

布隆過濾器函數

2024-09-25 17:44:08

2021-03-06 14:41:07

布隆過濾器算法

2023-04-26 08:32:45

Redis布隆過濾器

2023-07-06 10:15:38

布隆過濾器優化

2023-11-20 14:18:55

大數據布隆過濾器布谷鳥過濾器

2016-12-07 09:56:13

JavaFilter過濾器

2020-08-28 13:02:17

布隆過濾器算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费九九视频 | 日日爱夜夜操 | 精品中文字幕在线观看 | 欧美 日韩 国产 成人 在线 91 | 黄色欧美在线 | 国产一区二区三区免费视频 | 亚洲看片| 欧美日韩亚 | 蜜桃免费一区二区三区 | 日韩免费一区二区 | 日本福利在线 | 韩国理论电影在线 | 在线视频91 | 国产精品三级久久久久久电影 | 久久小视频 | 国产偷录叫床高潮录音 | 视频三区 | 91精品国产高清久久久久久久久 | 国产精品美女久久久久aⅴ国产馆 | 久草资源在线 | 黄色片免费看视频 | 成人网av | 国产亚洲欧美在线视频 | 亚洲黄色av | 国产欧美一级 | 国产91视频播放 | 亚洲成人黄色 | 欧美a在线| 日本成人久久 | 国产成人综合一区二区三区 | 国精产品一品二品国精在线观看 | 91大神在线看 | 超碰日本 | 亚洲狠狠爱一区二区三区 | 一区在线视频 | av黄色免费在线观看 | 亚洲国产精品久久久久婷婷老年 | 精品视频成人 | 天天综合久久 | 亚洲免费视频一区 | 97视频在线免费 |