1. 程式人生 > 其它 >4 python實現布隆過濾器(去重)

4 python實現布隆過濾器(去重)

一 布隆過濾器簡介

bloomfilter:是一個通過多雜湊函式對映到一張表的資料結構,能夠快速的判斷一個元素在一個集合內是否存在,具有很好的空間和時間效率。(典型例子,爬蟲url去重)

原理:
BloomFilter 會開闢一個m位的bitArray(位陣列),開始所有資料全部置 0 。當一個元素過來時,能過多個雜湊函式(h1,h2,h3....)計算不同的在雜湊值,並通過雜湊值找到對應的bitArray下標處,將裡面的值 0 置為 1 。

關於多個雜湊函式,它們計算出來的值必須 [0,m) 之中。

例子:

有這麼一個網址

假設長度為 20的bitArray,通過 3 個雜湊函式求值。如下圖:

另外說明一下,當來查詢對應的值時,同樣通過雜湊函式求值,再去尋找陣列的下標,如果所有下標都為1時,元素存在。當然也存在錯誤率。(如:當陣列全部為1時,那麼查詢什麼都是存在的),但是這個錯誤率的大小,取決於陣列的位數和雜湊函式的個數。

二 Python中使用布隆過濾器

#python3.6 安裝
#需要先安裝bitarray
pip3 install bitarray-0.8.1-cp36-cp36m-win_amd64.whl(pybloom_live依賴這個包,需要先安裝)
#下載地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
pip3 install pybloom_live

示例一

#ScalableBloomFilter 可以自動擴容
from pybloom_live import ScalableBloomFilter


bloom = ScalableBloomFilter(initial_capacity=100
, error_rate=0.001, mode=ScalableBloomFilter.LARGE_SET_GROWTH) url = "www.cnblogs.com" url2 = "www.liuqingzheng.top" bloom.add(url) print(url in bloom) print(url2 in bloom)

示例二

#BloomFilter 是定長的
from pybloom_live import BloomFilter

bf = BloomFilter(capacity=1000)
url='www.baidu.com'
bf.add(url)

print(url 
in bf) print("www.liuqingzheng.top" in bf)