布隆過濾器

一、基本概念
布隆過濾器是1970年由布隆提出來的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用於檢索一個元素是否在一個集合內。它的優點是空間效率和查詢效率都遠遠超過一般的算法。缺點是有一定的識別率和刪除困難。

  • 如果想要判斷一個元素是不是在一個集合裏,一般想到的是將所有元素保存起來,然後通過比較確定。鏈表,樹等等數據結構都是這種思路.但是隨着集合中元素的增加,我們需要的存儲空間越來越大,檢索速度也越來越慢(O(n),O(logn))。不過世界上還有一種叫作散列表(又叫哈希表,Hash table)的數據結構(有一個動態數組,+ 一個 hash 函數)。它可以通過一個 Hash 函數將一個元素映射成一個位陣列(Bit array)中的一個點。這樣一來,我們只要看看這個點是不是 1 就可以知道集合中有沒有它了。這就是布隆過濾器的基本思想。
  • 總結起來說:bloomfilter,布隆過濾器:迅速判斷一個元素是不是在一個龐大的集合內,
    但是他有一個弱點:它有一定的誤判率
    誤判率:原本不存在於該集合的元素,布隆過濾器有可能會判斷說它存在,但是,如果
    布隆過濾器判斷說某一個元素不存在該集合,那麼該元素就一定不在該集合內

二、優缺點
優點:
相比於其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優勢。布隆過濾器存儲空間和插入/查詢時間都是常數。另外, Hash 函數相互之間沒有關係,方便由硬件並行實現。布隆過濾器不需要存儲元素本身,在某些對保密要求非常嚴格的場合有優勢。
布隆過濾器可以表示全集,其它任何數據結構都不能;
缺點:
存在一定的誤判率,那麼在你不能容忍有錯誤率的情況,布隆過濾器不適用
布隆過濾器不支持刪除操作

三、實現原理
布隆過濾器需要的是一個位數組(和位圖類似, bytes 數組)和 K 個映射函數(和 Hash 表類似),在初始狀態時,對於長度爲 m 的位數組 array,它的所有位被置 0。
在這裏插入圖片描述
在這裏插入圖片描述

四、誤判率估計
維數組的大小:m
總共的數據大小爲:n
hash 函數的個數爲:k
假設布隆過濾器中的 hash function(哈希函數)滿足 simple uniform hashing(單一均勻散列)假設:每個元素都等概率地 hash 到 m 個 slot 中的任何一個,與其它元素被 hash 到哪個 slot 無關。若 m 爲 bit 數,則:

  • 對某一特定 bit 位在一個元素,調用了某個 hash 函數之後,別改成了 1 的概率是: 1/m
  • 對某一特定 bit 位在一個元素由某特定 hash function 插入時沒有被置位爲 1 的概率爲:1-1/m
  • 則 k 個 hash function 中沒有一個對其置位爲 1 的概率爲,也就是該 bit 位再 k 次 hash 之後還一直保持爲 0 的概率:
  • 在這裏插入圖片描述
    如果插入了 n 個元素,但都未將其置位的概率爲:
    當所有的元素都被插入進來以後,某一個特定的 bit 位還沒有被改成 1 的概率:
    則此位被置位(被改成了 1)的概率爲:
    在這裏插入圖片描述
  • 當所有的元素都被插入進來以後,某一個特定的 bit 位被改成 1 的概率:
    在這裏插入圖片描述
  • 現在考慮查詢階段,若對應某個待查詢元素的 k bits 全部置位爲 1。因此將某元素誤判的概率爲: 當要查詢一個元素的時候,我們要調用 k
    個 hash 函數得到 k 個位置值,然後再去判斷這 k個位置的位值是不是都是 1:
    在這裏插入圖片描述
    在這裏插入圖片描述
    最優哈希個數
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章