題目:給定十億個數字,怎麼去判斷這個資料是否存在;
這個乙個典型的查詢問題,我們知道面對查詢的時候,最快的查詢是基於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位上,就是乙個很好的演算法了。那麼怎麼去判斷的呢:
詳細的概率公式如下:
有空可以理解一下。
資料存在? 布隆過濾器
布隆過濾器是一種能夠在大量資料中判斷資料是否存在的演算法。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。在介紹 布隆過濾器 之前,先介紹一下 位圖 的思想 這...
大資料去重 Bitmap和布隆過濾器
場景描述 在某場景下有乙個使用者關係鏈,比如a關注了b,然後b關注了c,然後使用者b知道自己被誰關注,也知道他關注了誰。假如說將這個資訊放在統一的資料庫中,然後使用者查詢的時候每次去遍歷,那麼就會對資料庫造成非常大的負擔,而且在乙個億級使用者系統中這樣的時間延遲是不可接受的。這種情況下我們可以為每個...
資料結構 布隆過濾器
基於位圖的缺點 只能儲存整型,在現實中的應用有了很大的侷限性,所以又引出了一種新的雜湊變形,其實也算是點陣圖的變形 布隆過濾器。如圖,把字串經過布隆過濾器的處理,對映到位圖的多個位置,讓這幾個位置都置成1用來表示這個字串的存在。所以只要有乙個位置為0,那麼這個資料就不存在。1.本來不存在的資料,可能...