1. 程式人生 > >【演算法】布隆過濾器

【演算法】布隆過濾器

應用場景:

網頁黑名單系統;

垃圾郵件過濾系統;

爬蟲的網址判斷重複系統;

容忍一定程度的失誤率;

對空間要求較嚴格;

概念:

布隆過濾器可以精確的代表一個集合,可以精確判斷某一元素是否在此集合裡。

精確程度由使用者的具體設計決定,做到100%的精確是不可能的。其優勢在於:利用很少的空間可以做到精確率較高。

原理和過程:

Bloom Filter

用途: 判斷一個元素是否在一個集合中、檢查一個英語單詞是否正確拼寫;

原理: 位陣列與Hash函式的聯合使用。是一個包含m位的位陣列,每位初始化為0,有k個不同的hash函式,可將集合元素對映到位陣列的某一位。插入元素需根據k個hash函式得到k個位,置為1。查詢時判斷這k個位(有0則該元素肯定不在集合中,都為1則該元素有可能在集合中)

優點: 有良好的空間效率和時間效率,插入、查詢O(n),安全性高(不儲存元素本身)

缺點: 正確率低,有可能不在集合中的元素在位陣列查詢的位得到都為1。

           

分析優點(空間效率和失誤率):

假設不安全網頁的黑名單包含100億個黑名單網頁,每個網頁的URL最多佔用64位元組,現在需要生成一個網頁過濾系統,可以根據網頁的URL判斷該網頁是否在黑名單上。要求系統有萬分之一以下的失誤率,並且額外空間不超過30G。

方法一:直接使用雜湊表,此時需要的空間為:64位元組*100億=> 640G空間

方法二:布隆過濾器:計算m=20n = 2000億, 即20G空間。且失誤率也降低。(因為m向上取整)