4 python實現布隆過濾器(去重)
阿新 • • 發佈:2022-03-08
一 布隆過濾器簡介
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(urlin bf) print("www.liuqingzheng.top" in bf)