python布隆過濾器
1. 布隆過濾器的缺點
但是布隆過濾器的缺點和優點一樣明顯。誤算率是其中之一。隨著存入的版元素數量增加權,誤算率隨之增加。但是如果元素數量太少,則使用散列表足矣。
另外,一般情況下不能從布隆過濾器中刪除元素。我們很容易想到把位列陣變成整數數組,每插入一個元素相應的計數器加1, 這樣刪除元素時將計數器減掉就可以了。然而要保證安全的刪除元素並非如此簡單。首先我們必須保證刪除的元素的確在布隆過濾器裡面. 這一點單憑這個過濾器是無法保證的。另外計數器回繞也會造成問題。
在降低誤算率方面,有不少工作,使得出現了很多布隆過濾器的變種。
2. 如何用python寫布隆過濾器
下面的是網路上找到的python的布隆過濾器的實現.
#!/usr/local/bin/python2.7
#coding=gbk
'''
Createdon2012-11-7
@author:palydawn
'''
importcmath
fromBitVectorimportBitVector
classBloomFilter(object):
def__init__(self,error_rate,elementNum):
#計算所需要的bit數
self.bit_num=-1*elementNum*cmath.log(error_rate)/(cmath.log(2.0)*cmath.log(2.0))
#四位元組對齊
self.bit_num=self.align_4byte(self.bit_num.real)
#分配內存
self.bit_array=BitVector(size=self.bit_num)
#計算hash函數個數
self.hash_num=cmath.log(2)*self.bit_num/elementNum
self.hash_num=self.hash_num.real
#向上取整
self.hash_num=int(self.hash_num)+1
#產生hash函數種子
self.hash_seeds=self.generate_hashseeds(self.hash_num)
definsert_element(self,element):
forseedinself.hash_seeds:
hash_val=self.hash_element(element,seed)
#取絕對值
hash_val=abs(hash_val)
#取模,防越界
hash_val=hash_val%self.bit_num
#設置相應的比特位
self.bit_array[hash_val]=1
#檢查元素是否存在,存在返回true,否則返回false
defis_element_exist(self,element):
forseedinself.hash_seeds:
hash_val=self.hash_element(element,seed)
#取絕對值
hash_val=abs(hash_val)
#取模,防越界
hash_val=hash_val%self.bit_num
#查看值
ifself.bit_array[hash_val]==0:
returnFalse
returnTrue
#內存對齊
defalign_4byte(self,bit_num):
num=int(bit_num/32)
num=32*(num+1)
returnnum
#產生hash函數種子,hash_num個素數
defgenerate_hashseeds(self,hash_num):
count=0
#連續兩個種子的最小差值
gap=50
#初始化hash種子為0
hash_seeds=[]
forindexinxrange(hash_num):
hash_seeds.append(0)
forindexinxrange(10,10000):
max_num=int(cmath.sqrt(1.0*index).real)
flag=1
fornuminxrange(2,max_num):
ifindex%num==0:
flag=0
break
ifflag==1:
#連續兩個hash種子的差值要大才行
ifcount>0and(index-hash_seeds[count-1])<gap:
continue
hash_seeds[count]=index
count=count+1
ifcount==hash_num:
break
returnhash_seeds
defhash_element(self,element,seed):
hash_val=1
forchinstr(element):
chval=ord(ch)
hash_val=hash_val*seed+chval
returnhash_val
'''
#測試代碼
bf=BloomFilter(0.001,1000000)
element='palydawn'
bf.insert_element(element)
printbf.is_element_exist('palydawn')'''
#其中使用了BitVector庫,python本身的二進制操作看起來很麻煩,這個就簡單多了
如果解決了您的問題請採納!
如果未解決請繼續追問
3. 用python安裝布隆過濾器報錯,這怎麼解決
但是布隆過濾器的缺抄點和優點一樣明顯。誤算率是其中之一。隨著存入的元素數量增加,誤算率隨之增加。但是如果元素數量太少,則使用散列表足矣。另外,一般情況下不能從布隆過濾器中刪除元素。我們很容易想到把位列陣變成整數數組
4. 布隆過濾器的檢索效率為什麼快於哈希演算法
bloom filter的特點是會出現誤報,但不會漏報,也就是說對於bloom filter驗證的一個數據文件,可能不包回含你查找的數據項,但答是包含你查找的數據項的數據文件它一定是會返回的,key-value系統中bloom filter返回的數據文件還是需要查看裡面的內容...
5. 看過的視頻讓用戶不再觀看為什麼使用布隆過濾器而不是直接使用setBit與getBit進行取值比對呢
不行。
因為布來隆過濾器的原源理是用多個hash函數對id進行hash後得到一系列值,而在布隆數組中看這些值對應的位上是否命中,如果都命中說明這個值重復。
用id不經過hash直接去對比,乍一想好像可以,但是你想想,假如id是10位,並且我們只用數字,那麼布隆過濾器的長度只有10位(0123456789),這個長度的過濾器幾乎沒法使用,容量太低,誤差率太高。即使算上大小寫字母,也只有62個,看似62很多,但是這里定死了id必須用這62個字元,而假如中間加一層hash,那id用什麼字元和我布隆過濾器用什麼字元以及過濾器的長度都可以自由指定,靈活很多。
6. 布隆過濾器和hashmap的區別
但是布隆過濾器的缺點和優點一樣明顯。誤算率是其中之一。隨著存入的元素數量增加,版誤算率隨之增加權。但是如果元素數量太少,則使用散列表足矣。另外,一般情況下不能從布隆過濾器中刪除元素。我們很容易想到把位列陣變成整數數組,每插入一個元
7. Python 實現一個大數據搜索引擎需要多少行代碼
十幾萬行吧
8. 布隆過濾器既然有錯誤率,為什麼還能應用在key-value系統中
bloom filter的特點是會出現誤報,但不會漏報,也就是說對於bloom filter驗證的一個數據文件,可能回不包含你查找的數據項答,但是包含你查找的數據項的數據文件它一定是會返回的,key-value系統中bloom filter返回的數據文件還是需要查看裡面的內容才能知道是否存在所需的數據的,這就保證了執行結果的正確性和完整性。因此key-value系統不會因此而出錯的,只是多訪問一些數據文件而已。在數據量很大key-value系統中,建立統一的B+樹索引的代價是非常大的,維護成本也很高,因此綜合起來bloom filter的性能是最好的。
9. 如何用布隆過濾器去重mysql
在資料庫中創建欄位的UNIQUE屬性
在資料庫中創建一個唯一的索引,在插入數據之前檢查待插入的數據是否存在
使用Set或HashSet保存數據,確保唯一
10. 如何用布隆過濾器過濾重復url,求Python代碼實現
但是布隆過濾器的缺點和優點一樣明顯。誤算率是其中之一。隨著存入的元素數量增版加,誤權算率隨之增加。但是如果元素數量太少,則使用散列表足矣。另外,一般情況下不能從布隆過濾器中刪除元素。我們很容易想到把位列陣變成整數數組