【后端基礎】布隆過濾器原理

文章目錄

    • 一、Bloom Filter(布隆過濾器)概述
      • 1. Bloom Filter 的特點
      • 2. Bloom Filter 的工作原理
    • 二、示例
      • 1. 添加與查詢
      • 2. 假陽性
    • 三、Bloom Filter 的操作
      • 1、假陽性概率
      • 2、空間效率
      • 3、哈希函數的選擇
    • 四、應用

Bloom Filter 是一種非常高效的概率型數據結構,廣泛應用于需要快速判斷元素是否在集合中的場景。雖然它可能會產生假陽性,但通過調整位數組的大小和哈希函數的數量,可以控制假陽性率。在內存受限的環境中,Bloom Filter 提供了一個非常節省空間的解決方案。

通過適當的哈希函數和合理的配置,Bloom Filter 在大數據系統、搜索引擎、網絡安全等領域具有廣泛的應用前景。

一、Bloom Filter(布隆過濾器)概述

Bloom Filter 是一種空間高效的概率型數據結構,用于測試一個元素是否屬于一個集合。它的特點是可以快速地判斷某個元素是否在集合中,但是有一定的假陽性率。也就是說,Bloom Filter 可能會錯誤地告訴你某個元素存在,但實際上它并不在集合中;然而,假陰性(即元素確實存在,但 Bloom Filter 卻說它不存在)是永遠不會發生的。

1. Bloom Filter 的特點

  1. 空間高效: 相較于傳統的哈希表,Bloom Filter 在固定大小的情況下可以表示一個元素數量極大的集合。它不需要存儲實際的元素值,而是通過一組哈希函數和一個位數組來表示集合。

  2. 永不產生假陰性: Bloom Filter 不會錯誤地告訴你某個元素不存在,只會可能錯誤地告訴你某個元素已經存在(即假陽性)。

  3. 增加元素時不會失敗: 向 Bloom Filter 中添加元素不會失敗,但是隨著添加的元素增多,假陽性率會逐漸增加,直到所有的位都被設置為 1 為止,在此時所有查詢都會返回存在的結果。

  4. 無法刪除元素: 刪除元素在 Bloom Filter 中是不可能的,因為如果清除某個哈希值對應的位,會影響其他元素的存在性。例如,如果你刪除 “geeks”,可能會錯誤地刪除 “nerd”。這就是 Bloom Filter 無法刪除元素的原因。

?

2. Bloom Filter 的工作原理

Bloom Filter 的基本操作包括:

  • 插入元素(insert):通過多個哈希函數計算出元素的哈希值,并將這些哈希值對應的位設置為 1。
  • 查詢元素(lookup):同樣計算該元素的哈希值,如果對應位全為 1,則認為元素可能存在;如果有任何一個位是 0,則可以確定元素不在集合中。

二、示例

1. 添加與查詢

通過概率+節點個數來決定布隆過濾器的函數個數、數組位數

假設我們有一個長度為 10 的位數組,所有位初始值為 0,我們使用 3 個哈希函數來添加 “geeks” 和 “nerd” 這兩個元素。

在這里插入圖片描述

  1. 添加 “geeks”

    • 計算哈希值:
      • h1(“geeks”) % 10 = 1
      • h2(“geeks”) % 10 = 4
      • h3(“geeks”) % 10 = 7
    • 將位數組中的索引 1、4、7 設置為 1。
  2. 添加 “nerd”

    • 計算哈希值:
      • h1(“nerd”) % 10 = 3
      • h2(“nerd”) % 10 = 5
      • h3(“nerd”) % 10 = 4
    • 將位數組中的索引 3、5、4 設置為 1。

在這里插入圖片描述

  1. 查詢 “geeks”
    • 計算哈希值并檢查位數組中的相應位置:
      • 如果所有索引(1、4、7)對應的位都為 1,則 “geeks” 可能存在。
        在這里插入圖片描述

?

2. 假陽性

由于多個元素可能會映射到同一位,Bloom Filter 會發生假陽性。例如,當我們查詢 “cat” 時,計算出哈希值為 1、3、7,查到這三個位置的值為 1,雖然 “cat” 并沒有被添加到 Bloom Filter 中,但它的哈希值與其他元素(如 “geeks” 和 “nerd”)重合了,因此 Bloom Filter 錯誤地認為 “cat” 存在。這就是假陽性。
在這里插入圖片描述

?

三、Bloom Filter 的操作

  • insert(x):將元素 x 插入到 Bloom Filter 中。
  • lookup(x):檢查元素 x 是否存在于 Bloom Filter 中,返回“可能存在”或“肯定不存在”。

1、假陽性概率

假陽性概率可以通過以下公式計算:

P = ( 1 ? ( 1 ? 1 m ) k n ) k P= \left( 1 - \left( 1 - \frac{1}{m} \right)^{kn} \right)^k P=(1?(1?m1?)kn)k

其中:

  • m 是位數組的大小,
  • k 是哈希函數的數量,
  • n 是預計插入元素的數量。

位數組大小的計算

m = ? n ? ln ? ( p ) ( ln ? ( 2 ) ) 2 m= \frac{-n \cdot \ln(p)}{(\ln(2))^2} m=(ln(2))2?n?ln(p)?

哈希函數數量的計算

k = m n ? ln ? ( 2 ) k= \frac{m}{n} \cdot \ln(2) k=nm??ln(2)

?

2、空間效率

Bloom Filter 的空間效率非常高。傳統的集合存儲結構(如哈希表、數組或鏈表)需要存儲數據本身,而 Bloom Filter 只需要一個位數組,這使得它在內存使用上非常高效。
?

3、哈希函數的選擇

Bloom Filter 使用的哈希函數應該是獨立且均勻分布的。常用的非加密哈希函數如 MurmurHashFNVJenkins 都能很好地工作。加密哈希函數雖然穩定且具有較強的保證,但在性能上較慢,因此在 Bloom Filter 中更常用非加密哈希函數以提高性能。

?

四、應用

  1. 中等大小的集合過濾:Medium 用 Bloom Filter 來推薦用戶已經看過的帖子,從而避免重復推薦。
  2. Quora:實現了一個共享的 Bloom Filter,過濾用戶已經看過的帖子。
  3. Google Chrome:用 Bloom Filter 來識別惡意 URL。
  4. 大數據存儲系統:Google BigTable、Apache HBase、Apache Cassandra 和 PostgreSQL 等都使用 Bloom Filter 來減少磁盤查詢,特別是在沒有存在的行或列時。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70571.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pytorch實現論文之三元DCGAN生成RGB圖像用于紅外圖像著色生成

簡介 簡介:采用了三次DCGAN單獨生成單通道圖像之后進行組成RGB圖像放入鑒別器中檢測,并在鑒別器和生成器的損失訓練中采用梯度方法來提升或者降低權重。該方法將用于獲得紅外圖像著色的生成。 論文題目:Infrared Image Colorization based on a Triplet DCGAN Architectur…

Qt中QDockWidget的使用方式

在PyQt5中使用QDockWidget可以創建靈活的停靠窗口,增強應用程序的多功能性。以下是詳細的步驟和示例代碼: 基本步驟 導入模塊:確保導入必要的PyQt5模塊。創建主窗口:繼承QMainWindow并初始化界面。設置中心部件:例如…

docker獨立部署milvus向量數據庫

milvus鏡像:國外封鎖,國內源也不好用。基本上所有源都不能用 首先想到阿里云服務,但是阿里云國外服務器便宜的300~400呢。 基于成本考慮終于裝上心心念念的milvus(*^▽^*) 安裝 Milvus 安裝 Milvus 獨立版 wget https://raw.githubuserco…

【SpringBoot整合系列】HttpClient遠程訪問的示例

前言 使用Apache的HttpClient庫,添加Apache HttpClient的依賴。工具類的封裝。通常,工具類需要處理GET、POST請求,可能還有其他方法如PUT、DELETE。需要設計一個工具類,提供靜態方法,可以發送請求,并處理響…

Git操作整體流程

文章目錄 1.Git創建個人倉庫2、Git全局配置3、Git本地管理4. Git本地管理常用命令匯總5、使用Git命令將項目提交到遠程碼云管理6.使用IDEA進行管理7、Idea里面的終端8、關于提交總結 1.Git創建個人倉庫 打開https://gitee.com/,登錄個人賬號,右上角加號…

MySQL MHA 部署全攻略:從零搭建高可用數據庫架構

文章目錄 1.MHA介紹2.MHA組件介紹3.集群規劃4.服務器初始化5.MySQL集群部署5.1 安裝MySQL集群5.2 配置一主兩從5.3 測試MySQL主從5.4 賦予MHA用戶連接權限 6.安裝MHA環境6.1 安裝MHA Node6.2 安裝MHA Manager 7.配置MHA環境8.MySQL MHA高可用集群測試8.1 通過VIP連接MySQL8.2模…

如何查看java的字節碼文件?javap?能用IDEA嗎?

編譯指令: javac YourProject.java 查看字節碼文件的指令: javap -c -l YourProject.class 不添加-c指令就不會顯示字節碼文件: 不添加 -l 就不會顯示源代碼和字節碼文件的對應關系: 添加-l之后多出來這些: IDEA不太…

1、Window Android 13模擬器 將編譯的映像文件導入Android Studio

1、環境準備 編譯環境:Ubuntu-18.04.5編譯版本:android13-release下載地址:清華大學開源軟件鏡像站AOSP # 下載repo # 同步代碼:repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…

JUC并發—9.并發安全集合三

大綱 1.并發安全的數組列表CopyOnWriteArrayList 2.并發安全的鏈表隊列ConcurrentLinkedQueue 3.并發編程中的阻塞隊列概述 4.JUC的各種阻塞隊列介紹 5.LinkedBlockingQueue的具體實現原理 6.基于兩個隊列實現的集群同步機制 1.并發安全的數組列表CopyOnWriteArrayList …

報錯:Cannot read properties of null (reading ‘ce‘)解決方法

背景 工作項目中要做右鍵菜單打開趨勢圖彈窗的需求,這個彈窗使用了vue-resizable的第三方插件,這個插件的主要作用是把彈窗設置為可拖拽的效果。這個用vue-resizable做的彈窗已經做好了,在別的項目中能夠正常的運行。但是我把它拿過來放在新…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_process_options

ngx_process_options 聲明在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 定義在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) {u_char *p;size_t len;if (ngx_prefix) {len ngx_strlen(ngx_prefix);p …

數據結構系列二:包裝類+泛型

包裝類泛型 一、包裝類(1)基本數據類型和對應的包裝類(2)裝箱和拆箱 二、泛型(1)什么是泛型(2)引出泛型(3)語法(4)泛型類的使用1.語法…

量子計算驅動的金融衍生品定價革命:突破傳統蒙特卡洛模擬的性能邊界

引言:金融計算的算力困局 某國際投行采用128量子位處理器對亞洲期權組合定價時,其量子振幅估計算法在2.7秒內完成傳統GPU集群需要68小時的計算任務。在蒙特卡洛路徑模擬實驗中,量子隨機游走算法將10,000維衍生品的價格收斂速度提升4個數量級…

Spring容器初始化擴展點:ApplicationContextInitializer

目錄 一、什么是ApplicationContextInitializer? 1、核心作用2、適用場景 二、ApplicationContextInitializer的使用方式 1、實現ApplicationContextInitializer接口2、注冊初始化器 三、ApplicationContextInitializer的執行時機四、實際應用案例 1、動態設置環境…

hive—常用的函數整理

1、size(split(...))函數用于計算分割后字符串數組的長度 實例1):由客戶編號列表計算客戶編號個數 --數據準備 with tmp_test01 as ( select tag074445270 tag_id,202501busi_mon , 012399931003,012399931000 index_val union all select tag07444527…

vue3 采用xlsx庫實現本地上傳excel文件,前端解析為Json數據

需求:本地上傳excel 文件,但需要對excel 文件的內容進行解析,然后展示出來 1. 安裝依賴 首先,確保安裝了 xlsx 庫: bash復制 npm install xlsx 2. 創建 Vue 組件 創建一個 Vue 組件(如 ExcelUpload.v…

若依框架實現動態失效時間JWT Token的實踐指南

一、功能需求背景 在前后端分離架構中,JWT(JSON Web Token)作為無狀態認證方案被廣泛使用。若依(RuoYi)框架的TokenService默認采用固定失效時間策略,但在實際開發中常需要根據業務場景動態調整Token有效期…

C++ 設計模式-策略模式

支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基礎策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…

國產編輯器EverEdit - 如何在EverEdit中管理工程?

1 工程管理 1.1 應用場景 用戶創建工程后&#xff0c;會涉及到工程的管理 &#xff0c;比如&#xff1a;打開工程、關閉工程等 1.2 使用方法 1.2.1 打開工程 單擊主菜單工程 -> 打開工程&#xff0c;會彈出打開對話框&#xff0c;用戶在對話框中選擇需要打開的工程文件即…

MYSQL-數據庫-DDL-DML-DQL-DCL-基礎學習

MySql概念&#xff1a; 建立在關系模型基礎上&#xff0c;有多張相互連接的二維表組成的數據庫 SQL通用語法&#xff1a; 1.SQL語句可以單行或多行書寫&#xff0c;以分號結尾 2.SQL語句可以使用空格/縮進來增強語句的可讀性 3.MySQL數據庫的SQL語句不區分大小寫&#xff0c;關…