最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何實現(xiàn)海量數(shù)據(jù)判重

 更新時間:2023年09月19日 09:16:00   作者:Java中文社群  
在海量數(shù)據(jù)如何確定一個值是否存在?這是一道非常經(jīng)典的面試場景題,那怎么回答這個問題呢?下面小編就來和大家詳細的聊一聊,感興趣的可以一起學習一下

在海量數(shù)據(jù)如何確定一個值是否存在?這是一道非常經(jīng)典的面試場景題。

那怎么回答這個問題呢?接下來咱們就詳細的聊一聊。

參考答案

判斷一個值是否存在?通常有以下兩種解決方案:

  • 使用哈希表:可以將數(shù)據(jù)進行哈希操作,將數(shù)據(jù)存儲在相應的桶中。查詢時,根據(jù)哈希值定位到對應的桶,然后在桶內進行查找。這種方法的時間復雜度為 O(1),但需要額外的存儲空間來存儲哈希表。如果桶中存在數(shù)據(jù),則說明此值已存在,否則說明未存在。
  • 使用布隆過濾器:布隆過濾器是一種概率型數(shù)據(jù)結構,用于判斷一個元素是否在集合中。它利用多個哈希函數(shù)映射數(shù)據(jù)到一個位數(shù)組,并將對應位置置為 1。查詢時,只需要對待查詢的數(shù)據(jù)進行哈希,并判斷對應的位是否都為 1。如果都為 1,則該數(shù)據(jù)可能存在;如果有一個位不為 1,則該數(shù)據(jù)一定不存在。布隆過濾器的查詢時間復雜度為 O(k),其中 k 為哈希函數(shù)的個數(shù)。

相同點和不同點

它們兩的相同點是:它們都存在誤判的情況。例如,使用哈希表時,不同元素的哈希值可能相同,所以這樣就產(chǎn)生誤判了;而布隆過濾器的特征是,當布隆過濾器說,某個數(shù)據(jù)存在時,這個數(shù)據(jù)可能不存在;當布隆過濾器說,某個數(shù)據(jù)不存在時,那么這個數(shù)據(jù)一定不存在。

它們兩的區(qū)別主要有以下幾點:

  • 存儲機制:哈希表使用一個數(shù)組來存儲鍵值對,通過哈希函數(shù)將鍵映射到數(shù)組的索引位置,然后將值存儲在對應的位置上。而布隆過濾器則使用一個位數(shù)組(或位向量),通過多個哈希函數(shù)將元素映射到位數(shù)組的多個位上。
  • 查詢操作:哈希表在進行查詢時,通過計算哈希值來定位鍵值對的存儲位置,然后直接獲取對應的值。查詢時間復雜度通常為 O(1)。布隆過濾器在進行查詢時,也通過多個哈希函數(shù)計算多個位,然后判斷對應的位是否都為 1 來確定元素是否存在。查詢時間復雜度為 O(k),其中 k 為哈希函數(shù)的個數(shù)。
  • 內存占用:哈希表需要根據(jù)數(shù)據(jù)規(guī)模來動態(tài)調整數(shù)組的大小,以保證存儲效率。而布隆過濾器在預先設置位數(shù)組的大小后,不會隨數(shù)據(jù)規(guī)模的增加而增長。因此布隆過濾器更適用于海量數(shù)據(jù)。

結論

哈希表和布隆過濾器都能實現(xiàn)判重,但它們都會存在誤判的情況,但布隆過濾器存儲占用的空間更小,更適合海量數(shù)據(jù)的判重。

布隆過濾器實現(xiàn)原理

布隆過濾器的實現(xiàn),主要依靠的是它數(shù)據(jù)結構中的一個位數(shù)組,每次存儲鍵值的時候,不是直接把數(shù)據(jù)存儲在數(shù)據(jù)結構中,因為這樣太占空間了,它是利用幾個不同的無偏哈希函數(shù),把此元素的 hash 值均勻的存儲在位數(shù)組中,也就是說,每次添加時會通過幾個無偏哈希函數(shù)算出它的位置,把這些位置設置成 1 就完成了添加操作。

當進行元素判斷時,查詢此元素的幾個哈希位置上的值是否為 1,如果全部為 1,則表示此值存在,如果有一個值為 0,則表示不存在。因為此位置是通過 hash 計算得來的,所以即使這個位置是 1,并不能確定是那個元素把它標識為 1 的,因此布隆過濾器查詢此值存在時,此值不一定存在,但查詢此值不存在時,此值一定不存在。

并且當位數(shù)組存儲值比較稀疏的時候,查詢的準確率越高,而當位數(shù)組存儲的值越來越多時,誤差也會增大。

位數(shù)組和 key 之間的關系,如下圖所示:

如何實現(xiàn)布隆過濾器

布隆過濾器的實現(xiàn)通常有以下兩種方案:

  • 通過程序實現(xiàn)(內存級別方案):使用 Google Guava 庫和 Apache Commons 庫實現(xiàn)布隆過濾器。
  • 通過中間件實現(xiàn)(支持數(shù)據(jù)持久化):使用 Redis 4.0 之后提供的布隆過濾插件來實現(xiàn),它的好處是支持持久化,數(shù)據(jù)不會丟失。

Guava 實現(xiàn)布隆過濾器

使用 Google Guava 庫實現(xiàn)布隆過濾器總共分為以下兩步:

  • 引入 Guava 依賴
  • 使用 Guava API 操作布隆過濾器

具體實現(xiàn)如下。

① 引入 Guava 依賴

<dependency>
????<groupId>com.google.guava</groupId>
????<artifactId>guava</artifactId>
</dependency>

② 使用 Guava API

import?com.google.common.hash.BloomFilter;
import?com.google.common.hash.Funnels;
public?class?BloomFilterExample?{
????public?static?void?main(String[]?args)?{
????????//?創(chuàng)建一個布隆過濾器,設置期望插入的數(shù)據(jù)量為10000,期望的誤判率為0.01
????????BloomFilter<String>?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ù)空間更小。布隆過濾器的特征是:當布隆過濾器說,某個數(shù)據(jù)存在時,這個數(shù)據(jù)可能不存在;當布隆過濾器說,某個數(shù)據(jù)不存在時,那么這個數(shù)據(jù)一定不存在。

到此這篇關于Java如何實現(xiàn)海量數(shù)據(jù)判重的文章就介紹到這了,更多相關Java數(shù)據(jù)判重內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用Maven添加工程版本信息及時間戳

    利用Maven添加工程版本信息及時間戳

    這篇文章主要介紹了利用Maven添加工程版本信息及時間戳方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解Java的MyBatis框架中的緩存與緩存的使用改進

    詳解Java的MyBatis框架中的緩存與緩存的使用改進

    很多人在使用MyBatis的緩存后經(jīng)常會遇到MySQL分頁查詢的顯示問題,針對于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進,首先來回顧一下MyBatis的緩存機制與執(zhí)行:
    2016-06-06
  • java的finalize方法解讀

    java的finalize方法解讀

    這篇文章主要介紹了java的finalize方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Idea 2023.2.5配置插件、Maven的過程

    Idea 2023.2.5配置插件、Maven的過程

    這篇文章主要介紹了Idea 2023.2.5配置插件、Maven的過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • JavaWeb導出Excel文件并彈出下載框

    JavaWeb導出Excel文件并彈出下載框

    這篇文章主要為大家詳細介紹了JavaWeb導出Excel文件并彈出下載框的相關資料,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java中枚舉的實現(xiàn)原理介紹

    Java中枚舉的實現(xiàn)原理介紹

    大家好,本篇文章主要講的是Java中枚舉的實現(xiàn)原理介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java注解@Conditional與@Profile的使用區(qū)別

    Java注解@Conditional與@Profile的使用區(qū)別

    這篇文章主要介紹了Java注解@Conditional與@Profile的使用區(qū)別,@Profile和@Conditional是Spring提供的兩種常用機制,它們可以根據(jù)不同的條件動態(tài)決定某些Bean是否加載,從而實現(xiàn)環(huán)境隔離、模塊選擇、特性開關等功能,需要的朋友可以參考下
    2025-05-05
  • Springboot項目刪除項目同步target文件問題解決方案

    Springboot項目刪除項目同步target文件問題解決方案

    這篇文章主要介紹了Springboot項目刪除項目同步target文件問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Java實現(xiàn)簡單登陸界面

    Java實現(xiàn)簡單登陸界面

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單登陸界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • java HashMap詳解及實例代碼

    java HashMap詳解及實例代碼

    這篇文章主要介紹了java HashMap詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-01-01

最新評論

亚东县| 酒泉市| 仲巴县| 陆丰市| 会昌县| 凉山| 遵义市| 介休市| 大田县| 百色市| 澄江县| 高雄县| 马公市| 湟中县| 和静县| 札达县| 临洮县| 镇坪县| 嘉峪关市| 苗栗县| 阿拉善左旗| 泰顺县| 武陟县| 山西省| 武清区| 鹤峰县| 阿鲁科尔沁旗| 九江市| 土默特右旗| 肃北| 凌云县| 顺平县| 丘北县| 封开县| 秦安县| 秭归县| 那曲县| 克什克腾旗| 洛扎县| 苏尼特右旗| 南郑县|