大數據判斷數據是否存在——布隆過濾器


 

題目:給定十億個數字,怎么去判斷這個數據是否存在;

這個一個典型的查找問題,我們知道面對查找的時候,最快的查找是基於hash查找,那么都是在O(1)的時間內找到指定的數據集,但是這樣要把數據全部load到內存里,內存大部分的時候是不支持一次性load十億的數據的,而且hash的空間利用率來說相對比較低。

 

這個時候運用得比較好的方式就是利用布隆過濾器(Bloom Filter),它可以在很小的內存空間內查找某個數據是否存在;

算法:
1. 首先需要k個hash函數,每個函數可以把key散列成為1個整數
2. 初始化時,需要一個長度為n比特的數組,每個比特位初始化為0
3. 某個key加入集合時,用k個hash函數計算出k個散列值,並把數組中對應的比特位置為1
4. 判斷某個key是否在集合時,用k個hash函數計算出k個散列值,並查詢數組中對應的比特位,如果所有的比特位都是1,認為在集合中。

 

其實這個算法的本質還是基於hash去計算的,只是多重hash去保證空間的覆蓋性;

 抄一個圖來用圖來就很好理解了,長度為8的數組,2次hash,如果來了一個數據3000,通過hash兩次發現第六個位置為0,那么說明3000這個數據一定不存在。

 

那么這個布隆過濾器就有這么幾個特點:

1.只要返回數據不存在,則肯定不存在。
2.返回數據存在,但只能是大概率存在。
3.同時不能清除其中的數據。

 

其實布隆過濾器只要盡量減少不存在的數據映射到舊的hash位上,就是一個很好的算法了。那么怎么去判斷的呢:

 

詳細的概率公式如下:

https://www.cnblogs.com/liyulong1982/p/6013002.html

有空可以理解一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM