掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在海量數(shù)據(jù)如何確定一個值是否存在?這是一道非常經(jīng)典的面試場景題。

在曲靖等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),曲靖網(wǎng)站建設(shè)費用合理。
那怎么回答這個問題呢?接下來咱們就詳細(xì)的聊一聊。
判斷一個值是否存在?通常有以下兩種解決方案:
它們兩的相同點是:它們都存在誤判的情況。例如,使用哈希表時,不同元素的哈希值可能相同,所以這樣就產(chǎn)生誤判了;而布隆過濾器的特征是,當(dāng)布隆過濾器說,某個數(shù)據(jù)存在時,這個數(shù)據(jù)可能不存在;當(dāng)布隆過濾器說,某個數(shù)據(jù)不存在時,那么這個數(shù)據(jù)一定不存在。
它們兩的區(qū)別主要有以下幾點:
哈希表和布隆過濾器都能實現(xiàn)判重,但它們都會存在誤判的情況,但布隆過濾器存儲占用的空間更小,更適合海量數(shù)據(jù)的判重。
布隆過濾器的實現(xiàn),主要依靠的是它數(shù)據(jù)結(jié)構(gòu)中的一個位數(shù)組,每次存儲鍵值的時候,不是直接把數(shù)據(jù)存儲在數(shù)據(jù)結(jié)構(gòu)中,因為這樣太占空間了,它是利用幾個不同的無偏哈希函數(shù),把此元素的 hash 值均勻的存儲在位數(shù)組中,也就是說,每次添加時會通過幾個無偏哈希函數(shù)算出它的位置,把這些位置設(shè)置成 1 就完成了添加操作。
當(dāng)進(jìn)行元素判斷時,查詢此元素的幾個哈希位置上的值是否為 1,如果全部為 1,則表示此值存在,如果有一個值為 0,則表示不存在。因為此位置是通過 hash 計算得來的,所以即使這個位置是 1,并不能確定是那個元素把它標(biāo)識為 1 的,因此布隆過濾器查詢此值存在時,此值不一定存在,但查詢此值不存在時,此值一定不存在。
并且當(dāng)位數(shù)組存儲值比較稀疏的時候,查詢的準(zhǔn)確率越高,而當(dāng)位數(shù)組存儲的值越來越多時,誤差也會增大。
位數(shù)組和 key 之間的關(guān)系,如下圖所示:
布隆過濾器的實現(xiàn)通常有以下兩種方案:
使用 Google Guava 庫實現(xiàn)布隆過濾器總共分為以下兩步:
具體實現(xiàn)如下。
com.google.guava
guava
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class BloomFilterExample {
public static void main(String[] args) {
// 創(chuàng)建一個布隆過濾器,設(shè)置期望插入的數(shù)據(jù)量為10000,期望的誤判率為0.01
BloomFilter bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), 10000, 0.01);
// 向布隆過濾器中插入數(shù)據(jù)
bloomFilter.put("data1");
bloomFilter.put("data2");
bloomFilter.put("data3");
// 查詢元素是否存在于布隆過濾器中
System.out.println(bloomFilter.mightContain("data1")); // true
System.out.println(bloomFilter.mightContain("data4")); // false
}
} 在上述示例中,我們通過 BloomFilter.create() 方法創(chuàng)建一個布隆過濾器,指定了元素序列化方式、期望插入的數(shù)據(jù)量和期望的誤判率。然后,我們可以使用 put() 方法向布隆過濾器中插入數(shù)據(jù),使用 mightContain() 方法來判斷元素是否存在于布隆過濾器中。
在海量數(shù)據(jù)如何確定一個值是否存在?通常有兩種解決方案:哈希表和布隆過濾器,而它們兩都存在誤判的情況,但布隆過濾器更適合海量數(shù)據(jù)的判斷,因為它占用的數(shù)據(jù)空間更小。布隆過濾器的特征是:當(dāng)布隆過濾器說,某個數(shù)據(jù)存在時,這個數(shù)據(jù)可能不存在;當(dāng)布隆過濾器說,某個數(shù)據(jù)不存在時,那么這個數(shù)據(jù)一定不存在。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流