日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

布隆過濾器的原理以及java 簡單實現

瀏覽:20日期:2022-08-20 14:33:19

一.布隆過濾器

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

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

布隆過濾器的原理是,當一個元素被加入集合時,通過K個Hash函數將這個元素映射成一個位數組中的K個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。這就是布隆過濾器的基本思想。

布隆過濾器數據結構

布隆過濾器是一個 bit 向量或者說 bit 數組,長這樣:

布隆過濾器的原理以及java 簡單實現

如果我們要映射一個值到布隆過濾器中,我們需要使用多個不同的哈希函數生成多個哈希值,并對每個生成的哈希值指向的 bit 位置 1,例如針對值 “baidu” 和三個不同的哈希函數分別生成了哈希值 1、4、7,則上圖轉變為:

布隆過濾器的原理以及java 簡單實現

值得注意的是,4 這個 bit 位由于兩個值的哈希函數都返回了這個 bit 位,因此它被覆蓋了。現在我們如果想查詢 “dianping” 這個值是否存在,哈希函數返回了 1、5、8三個值,結果我們發現 5 這個 bit 位上的值為 0,說明沒有任何一個值映射到這個 bit 位上,因此我們可以很確定地說 “dianping” 這個值不存在。而當我們需要查詢 “baidu” 這個值是否存在的話,那么哈希函數必然會返回 1、4、7,然后我們檢查發現這三個 bit 位上的值均為 1,那么我們可以說 “baidu” 存在了么?答案是不可以,只能是 “baidu” 這個值可能存在。

這是為什么呢?答案跟簡單,因為隨著增加的值越來越多,被置為 1 的 bit 位也會越來越多,這樣某個值 “taobao” 即使沒有被存儲過,但是萬一哈希函數返回的三個 bit 位都被其他值置位了 1 ,那么程序還是會判斷 “taobao” 這個值存在。

支持刪除么

目前我們知道布隆過濾器可以支持 add 和 isExist 操作,那么 delete 操作可以么,答案是不可以,例如上圖中的 bit 位 4 被兩個值共同覆蓋的話,一旦你刪除其中一個值例如 “tencent” 而將其置位 0,那么下次判斷另一個值例如 “baidu” 是否存在的話,會直接返回 false,而實際上你并沒有刪除它。

如何解決這個問題,答案是計數刪除。但是計數刪除需要存儲一個數值,而不是原先的 bit 位,會增大占用的內存大小。這樣的話,增加一個值就是將對應索引槽上存儲的值加一,刪除則是減一,判斷是否存在則是看值是否大于0。

代碼簡單實現布隆過濾器

package com.jd.demo.test;import java.util.Arrays;import java.util.BitSet;import java.util.concurrent.atomic.AtomicBoolean;public class MyBloomFilter { //你的布隆過濾器容量 private static final int DEFAULT_SIZE = 2 << 28; //bit數組,用來存放結果 private static BitSet bitSet = new BitSet(DEFAULT_SIZE); //后面hash函數會用到,用來生成不同的hash值,可隨意設置,別問我為什么這么多8,圖個吉利 private static final int[] ints = {1, 6, 16, 38, 58, 68}; //add方法,計算出key的hash值,并將對應下標置為true public void add(Object key) { Arrays.stream(ints).forEach(i -> bitSet.set(hash(key, i))); } //判斷key是否存在,true不一定說明key存在,但是false一定說明不存在 public boolean isContain(Object key) { boolean result = true; for (int i : ints) { //短路與,只要有一個bit位為false,則返回false result = result && bitSet.get(hash(key, i)); } return result; } //hash函數,借鑒了hashmap的擾動算法 private int hash(Object key, int i) { int h; return key == null ? 0 : (i * (DEFAULT_SIZE - 1) & ((h = key.hashCode()) ^ (h >>> 16))); }}

測試

public static void main(String[] args) { MyNewBloomFilter myNewBloomFilter = new MyNewBloomFilter(); myNewBloomFilter.add('張學友'); myNewBloomFilter.add('郭德綱'); myNewBloomFilter.add(666); System.out.println(myNewBloomFilter.isContain('張學友'));//true System.out.println(myNewBloomFilter.isContain('張學友 '));//false System.out.println(myNewBloomFilter.isContain('張學友1'));//false System.out.println(myNewBloomFilter.isContain('郭德綱'));//true System.out.println(myNewBloomFilter.isContain(666));//true System.out.println(myNewBloomFilter.isContain(888));//false}

二.具體代碼使用

在實際應用當中,我們不需要自己去實現BloomFilter。可以使用Guava提供的相關類庫即可。

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

判斷一個元素是否在集合中

public class Test1 { private static int size = 1000000; private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size); public static void main(String[] args) { for (int i = 0; i < size; i++) { bloomFilter.put(i); } long startTime = System.nanoTime(); // 獲取開始時間 //判斷這一百萬個數中是否包含29999這個數 if (bloomFilter.mightContain(29999)) { System.out.println('命中了'); } long endTime = System.nanoTime(); // 獲取結束時間 System.out.println('程序運行時間: ' + (endTime - startTime) + '納秒'); }}

運行結果如下:

命中了程序運行時間: 441616納秒

自定義錯誤率

public class Test3 { private static int size = 1000000; private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.01); public static void main(String[] args) { for (int i = 0; i < size; i++) { bloomFilter.put(i); } List<Integer> list = new ArrayList<Integer>(1000); // 故意取10000個不在過濾器里的值,看看有多少個會被認為在過濾器里 for (int i = size + 10000; i < size + 20000; i++) { if (bloomFilter.mightContain(i)) {list.add(i); } } System.out.println('誤判的數量:' + list.size()); }}

運行結果如下:

誤判的數量:941

對于緩存宕機的場景,使用白名單或者布隆過濾器都有可能會造成一定程度的誤判。原因是除了Bloom Filter 本身有誤判率,宕機之前的緩存不一定能覆蓋到所有DB中的數據,當宕機后用戶請求了一個以前從未請求的數據,這個時候就會產生誤判。當然,緩存宕機時使用白名單/布隆過濾器作為應急的方式,這種情況應該也是可以忍受的。

以上就是布隆過濾器的原理以及java 簡單實現的詳細內容,更多關于java 布隆過濾器的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品伦理| 欧美日韩国产综合网| 久久狠狠久久| 99日韩精品| 亚洲色诱最新| 日韩高清不卡在线| 日韩欧美一区二区三区在线观看| 国产精品高颜值在线观看| 欧美久久天堂| 久久精品青草| 美女尤物久久精品| 欧美一区二区三区久久精品| 国产极品久久久久久久久波多结野| 精品国产一区二区三区av片| 久久久天天操| 日产欧产美韩系列久久99| 久久精品国产亚洲一区二区三区| 亚洲黄色网址| 婷婷激情久久| 久久激五月天综合精品| 精品国产aⅴ| 国产一区二区色噜噜| 欧美日韩亚洲在线观看| 日韩极品在线观看| 桃色一区二区| 日韩福利视频网| 高清av不卡| 亚洲影视一区二区三区| 国产精品yjizz视频网| 国产精品婷婷| 成人一二三区| 日韩精品视频网站| 国产一区二区三区视频在线| 中文字幕av亚洲精品一部二部| 久久久91麻豆精品国产一区| 视频一区二区三区中文字幕| 亚洲深夜影院| 免费在线观看日韩欧美| 亲子伦视频一区二区三区| 日韩精品电影一区亚洲| 精品日韩一区| 日韩精品一区二区三区免费视频| 亚洲黄色中文字幕| 国产日韩视频在线| 五月天久久久| 婷婷激情一区| 国产一区二区三区探花| 久久国产乱子精品免费女| 三级欧美在线一区| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲精品动态| 欧美日韩国产一区二区三区不卡| 高清一区二区三区av| 欧美日韩91| 青青草伊人久久| 日韩一区二区三区免费视频 | 精品美女视频 | 国产日韩欧美一区二区三区| 久久亚洲成人| 精品丝袜在线| 久久精品国产大片免费观看| 久久精品国产大片免费观看| 在线成人直播| 国产高清一区| 婷婷精品视频| 蜜桃伊人久久| 欧美亚洲tv| 成人国产精选| 久久高清免费| 欧美一级专区| 国产精品伊人| 日韩精品专区| 国产精品成人一区二区不卡| 成人精品视频| 亚洲激情中文在线| 亚洲欧洲一区二区天堂久久| 亚洲欧洲一区二区天堂久久| 中文精品视频| 久久国产免费看| 91视频久久| 成人久久一区| 狠狠干综合网| 欧美综合精品| 日韩av一级| 蜜桃久久精品一区二区| 91精品麻豆| 国产精品13p| 99精品美女| 日本午夜精品一区二区三区电影 | 伊人精品在线| 亚洲另类av| 欧美天堂一区| 捆绑调教日本一区二区三区| 九九综合在线| 午夜亚洲福利| 日韩精品1区| 欧美日本一区| 99国产成+人+综合+亚洲欧美| 亚洲福利专区| 国产免费播放一区二区| 日韩电影免费网站| 婷婷精品在线| 久久三级福利| 国产精品亚洲欧美一级在线| 今天的高清视频免费播放成人| 久久国产精品毛片| 色婷婷色综合| 日韩中文字幕| 亚洲欧洲美洲国产香蕉| 黄色日韩在线| 丁香六月综合| 91精品国产自产观看在线| 欧美不卡高清| 岛国精品一区| 国产亚洲人成a在线v网站| 香蕉国产精品| 日本美女一区| 久久不见久久见免费视频7| 美女国产精品| 亚洲高清二区| 欧美二三四区| 精品国产成人| 国产成人精品免费视| 欧美91在线|欧美| 欧美一区免费| 日韩国产在线不卡视频| 在线亚洲国产精品网站| 欧美精品日日操| 国产黄色精品| 欧美一区在线观看视频| 国产亚洲一区二区三区不卡| 蜜臀久久99精品久久久久宅男| 欧美日韩国产综合网| 久久精品99久久无色码中文字幕| 涩涩av在线| 色综合狠狠操| 国产a亚洲精品| 日韩在线免费| 欧美影院三区| 亚洲特级毛片| 影院欧美亚洲| 夜夜精品视频| 日韩福利视频导航| 91成人在线网站| 涩涩涩久久久成人精品| 日本午夜精品视频在线观看| 国产欧美高清| 高清一区二区三区av| 欧美成人基地| 亚洲精品三级| 成人一区不卡| 日韩视频不卡| 日韩二区三区在线观看| 国产亚洲欧美日韩在线观看一区二区| 国产日韩亚洲| 亚洲夜间福利| 日韩高清在线不卡| 亚洲男女自偷自拍| 午夜在线一区| 精品精品99| 99久久99视频只有精品| 日韩国产在线观看一区| 日韩大片在线| 国产欧美日韩一级| 亚洲精品888| 欧美精品aa| 激情婷婷综合| 国产美女久久| 午夜欧美理论片| 青草国产精品| 99精品在线免费在线观看| 久久美女性网| 欧美偷窥清纯综合图区| 精品一区二区三区在线观看视频 | 美女毛片一区二区三区四区最新中文字幕亚洲| 久久精品国产999大香线蕉| 亚洲一区二区三区四区五区午夜| 国产精品一级| 水蜜桃久久夜色精品一区的特点| 日韩avvvv在线播放| 午夜亚洲精品| 国产乱码精品一区二区三区亚洲人| 在线视频观看日韩| 日本成人中文字幕| 国产手机视频一区二区| 精品亚洲自拍| 欧美一级二区| 国产精品日本一区二区不卡视频| 中文字幕一区二区三区四区久久| 欧美丰满日韩| 精品视频在线一区二区在线| 日本视频一区二区| 欧美aa一级| 四虎4545www国产精品| 国产h片在线观看| 久久影视三级福利片| 伊人www22综合色| 国产综合婷婷| 国产在线看片免费视频在线观看| 中国字幕a在线看韩国电影|