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

場景題:海量數(shù)據(jù)如何判重?

開發(fā) 前端
在海量數(shù)據(jù)如何確定一個(gè)值是否存在?通常有兩種解決方案:哈希表和布隆過濾器,而它們兩都存在誤判的情況,但布隆過濾器更適合海量數(shù)據(jù)的判斷,因?yàn)樗加玫臄?shù)據(jù)空間更小。

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

那怎么回答這個(gè)問題呢?接下來咱們就詳細(xì)的聊一聊。

參考答案

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

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

相同點(diǎn)和不同點(diǎn)

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

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

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

結(jié)論

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

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

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

當(dāng)進(jìn)行元素判斷時(shí),查詢此元素的幾個(gè)哈希位置上的值是否為 1,如果全部為 1,則表示此值存在,如果有一個(gè)值為 0,則表示不存在。因?yàn)榇宋恢檬峭ㄟ^ hash 計(jì)算得來的,所以即使這個(gè)位置是 1,并不能確定是那個(gè)元素把它標(biāo)識為 1 的,因此布隆過濾器查詢此值存在時(shí),此值不一定存在,但查詢此值不存在時(shí),此值一定不存在

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

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

圖片

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

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

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

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

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

  1. 引入 Guava 依賴
  2. 使用 Guava API 操作布隆過濾器

具體實(shí)現(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)建一個(gè)布隆過濾器,設(shè)置期望插入的數(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)建一個(gè)布隆過濾器,指定了元素序列化方式、期望插入的數(shù)據(jù)量和期望的誤判率。然后,我們可以使用 put() 方法向布隆過濾器中插入數(shù)據(jù),使用 mightContain() 方法來判斷元素是否存在于布隆過濾器中。

小結(jié)

在海量數(shù)據(jù)如何確定一個(gè)值是否存在?通常有兩種解決方案:哈希表和布隆過濾器,而它們兩都存在誤判的情況,但布隆過濾器更適合海量數(shù)據(jù)的判斷,因?yàn)樗加玫臄?shù)據(jù)空間更小。布隆過濾器的特征是:當(dāng)布隆過濾器說,某個(gè)數(shù)據(jù)存在時(shí),這個(gè)數(shù)據(jù)可能不存在;當(dāng)布隆過濾器說,某個(gè)數(shù)據(jù)不存在時(shí),那么這個(gè)數(shù)據(jù)一定不存在。

責(zé)任編輯:武曉燕 來源: Java中文社群
相關(guān)推薦

2024-06-03 06:45:18

2025-01-08 07:00:00

MySQL數(shù)據(jù)庫判重

2024-03-06 09:22:23

C#數(shù)據(jù)庫判重

2024-02-19 11:49:23

JavaBitMap類型

2011-09-01 10:54:28

OceanBase數(shù)據(jù)庫海量

2024-08-30 17:14:34

2022-08-06 08:23:47

云計(jì)算公有云廠商成本

2022-08-26 05:18:30

分布式系統(tǒng)數(shù)據(jù)處理

2017-06-02 16:20:51

MapReduceHDFSDedoop

2013-03-26 09:25:51

MapReduceHDFS存儲

2016-04-11 14:35:59

機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘數(shù)據(jù)模型

2014-11-04 09:18:33

安全策略安全管理威脅情報(bào)

2011-08-29 14:33:41

2024-10-16 10:35:52

2024-10-25 16:31:17

Redis數(shù)據(jù)預(yù)處理線程

2019-07-12 10:20:45

海量數(shù)據(jù)搭建

2019-07-15 16:02:30

大數(shù)據(jù)數(shù)據(jù)分析輿情系統(tǒng)

2012-09-04 13:58:50

存儲海量存儲華為

2012-05-11 09:45:07

海量數(shù)據(jù)

2017-07-04 13:35:05

大數(shù)據(jù)應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 精品免费国产一区二区三区四区介绍 | 黄色成人在线观看 | 国产成人av在线播放 | 在线视频一区二区 | 黄网站免费在线看 | 日本视频在线 | 操到爽| 国产剧情久久 | 欧美a级成人淫片免费看 | 精品欧美一区二区三区久久久 | 久在线观看| 一区二区三区欧美 | 欧美亚洲视频在线观看 | 国产成人免费在线 | 本道综合精品 | 成人国产在线视频 | 久久99精品视频 | 国产一区不卡 | 久久久久久久久久久91 | 无毛av| 一区二区精品 | 国产在线不卡 | 国产高清视频一区二区 | 亚洲午夜精品一区二区三区 | 国产亚洲精品美女久久久久久久久久 | 欧美1区 | 男人的天堂中文字幕 | 中文字幕精品一区二区三区精品 | 国产精品久久久久久久久久 | av免费网址| 成人免费在线 | 日韩高清一区 | 国产视频二区 | 日本电影免费完整观看 | 欧美日韩国产中文字幕 | 国产精品精品视频一区二区三区 | 国产精品久久久久久久久久免费看 | 99亚洲国产精品 | 91五月婷蜜桃综合 | 97久久精品午夜一区二区 | 在线色网 |