91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何快速判斷元素是否在集合里

發布時間:2023-04-20 09:47:18 來源:億速云 閱讀:214 作者:iii 欄目:編程語言

本篇內容主要講解“java如何快速判斷元素是否在集合里”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java如何快速判斷元素是否在集合里”吧!

1、什么叫布隆過濾器

布隆過濾器(Bloom Filter)是一個叫做 Bloom 的老哥于1970年提出的。

實際上可以把它看作由二進制向量(或者說位數組)和一系列隨機映射函數(哈希函數)兩部分組成的數據結構。

它的優點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。

java如何快速判斷元素是否在集合里

2、實現原理

先來一張圖

java如何快速判斷元素是否在集合里

布隆過濾器算法主要思想就是利用 n 個哈希函數進行 hash 過后,得到不同的哈希值,根據 hash 映射到數組(這個數組的長度可能會很長很長)的不同的索引位置上,然后將相應的索引位上的值設置為1。

判斷該元素是否出現在集合中,就是利用k個不同的哈希函數計算哈希值,看哈希值對應相應索引位置上面的值是否是1,如果有1個不是1,說明該元素不存在在集合中。

但是也有可能判斷元素在集合中,但是元素不在,這個元素所有索引位置上面的1都是別的元素設置的,這就導致一定的誤判幾率(這就是為什么上面是活可能在一個集合中的根本原因,因為會存在一定的 hash 沖突)。

注意:誤判率越低,相應的性能就會越低。

3、作用

布隆過濾器是可以用于判斷一個元素是不是(可能)在一個集合里,并且相比于其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優勢。

注意上面的一個詞:可能。這里先預留一個懸念,下文會詳細分析到。

判斷給定數據是否存在

防止緩存穿透(判斷請求的數據是否有效避免直接繞過緩存請求數據庫)等等、郵箱的垃圾郵件過濾、黑名單功能等等。

4、具體實現

看完了布隆過濾器的算法思想,那就開始具體的實現的講解。

我先來舉個例子,假設有旺財和小強兩個字符串,他們分別經過三次的 hash 算法,然后根據 hash 的結果將對應的數組(假設數組長度為 16)的索引位置的值置為1,先來看下旺財這個詞組:

java如何快速判斷元素是否在集合里

旺財經過三次 hash 過后,值分別為2,4,6 那么根據可以得到索引值分別為 2、4、6,于是就將該數組的索引(2、4、6)位置的值置為1,其余當做是0,現在假設需要查找旺財 ,同樣經過這個三個hash 然后發現得到的索引 2、4、6對應的位置的值都為1,那么可以判斷旺財可能是存在的。

接著有將小強插入到布隆過濾器中,實際的過程和上面的一樣,假設得到的下標是 1、3、5

java如何快速判斷元素是否在集合里

拋開旺財的存在,小強此時是這樣子在布隆過濾器中的,結合旺財和小強實際的數組是這樣子的:

java如何快速判斷元素是否在集合里

現在有來一個數據:9527,現在要求是判斷 9527 是否存在,假設9527 經過三次 hash 過后得到的下標分別為:5、6、7。結果發現下標為 7 的位置的值為0,那么可以肯定的判斷出,9527 一定不存在。

接著又來了一個 國產007,經過三次 hash 過后得到的下標分別為:2、3、5,結果發現 2、3、5下標對應的值全是1,于是可以大致判斷出 國產007可能存在。但是實際上經過我們剛剛的演示,國產007 根本就不存在,之所以 2、3、5 索引位置的值為1 ,那是因為其他的數據設置的。

說到這里,不知道大家有沒有明白布隆過濾器的作用。

5、代碼的實現

作為 java 程序員,我們真的是很幸福了,我們使用到很多的框架和工具,基本都被封裝好了,布隆過濾器,我們就使用 google 封裝好的工具類。當然還有其他方法,大家可以探索探索。

首先添加依賴

<!--布隆過濾依賴-->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>25.1-jre</version>
</dependency>

代碼的實現

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.nio.charset.Charset;
public class BloomFilterDemo {
        public static void main(String[] args) {
        /**
         * 創建一個插入對象為一億,誤報率為0.01%的布隆過濾器
         * 不存在一定不存在
         * 存在不一定存在
         * ----------------
         *  Funnel 對象:預估的元素個數,誤判率
         *  mightContain :方法判斷元素是否存在
         */
        BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 100000000, 0.0001);
        bloomFilter.put("死");
        bloomFilter.put("磕");
        bloomFilter.put("Redis");
        System.out.println(bloomFilter.mightContain("Redis"));
        System.out.println(bloomFilter.mightContain("Java"));
    }
}

具體的解釋已經寫在注釋中了。到這里相信大家一定明白了布隆過濾器和其怎么使用了。

6、實戰

我們來模擬這樣的場景:通過布隆過濾器來解決緩存穿透。

首先你的知道什么叫緩存穿透吧?

緩存穿透是指用戶訪問一個緩存和數據庫中都沒有的數據,因為緩存中不存在,所以就會去訪問數據庫,如果并發很高。很容易會擊垮數據庫

那布隆過濾器是如何解決這個問題的呢?他

的原理是這樣子的:將數據庫中所有的查詢條件,放入布隆過濾器中,當一個查詢請求過來時,先經過布隆過濾器進行查,如果判斷請求查詢值存在,則繼續查;如果判斷請求查詢不存在,直接丟棄。

其代碼如下:

String get(String key) {
    String value = redis.get(key);     
    if (value  == null) {
        if(!bloomfilter.mightContain(key)){
            return null; 
        }else{
            value = db.get(key); 
            redis.set(key, value); 
        }    
    }
    return value;
}

到此,相信大家對“java如何快速判斷元素是否在集合里”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衢州市| 吉木乃县| 新平| 桦南县| 南川市| 南城县| 漳州市| 孙吴县| 酒泉市| 青川县| 闵行区| 永平县| 松阳县| 大英县| 顺义区| 韶关市| 宕昌县| 沛县| 博罗县| 迁西县| 从江县| 尼勒克县| 霍林郭勒市| 仁怀市| 新乐市| 读书| 读书| 前郭尔| 天水市| 沙湾县| 富民县| 年辖:市辖区| 白山市| 潞城市| 镇雄县| 黄梅县| 星子县| 裕民县| 南宁市| 靖宇县| 长沙市|