焦萌2023年1
月29日下面列舉幾個基於標準
bloom filter
的小技巧:
1.求兩個集合的並。假設有兩個
bloom filter
分別表示集合s1和
s2,它們位陣列的大小相同且使用同一組雜湊函式,那麼要求表示s1和
s2並集的
bloom filter
,只要將s1和
s2的位陣列進行「或」操作即可得到結果。2.將
bloom filter
「對折」。
如果想將乙個
bloom filter
的大小縮小一半,那麼只需將
bloom filter
的位陣列分成兩半進行「或」操作,得到的結果即為所求。在查詢某一元素時,需要將雜湊後的索引位址的最高位遮蔽掉。
3.通過
0的數目估計集合元素個數。在第一篇文章
bloom filter
概念和原理中,我們提到過:
位陣列中
0的比例非常集中地分布在它的數學期望值
m (1 - 1/m)kn
的附近,其中
m為位陣列的大小,
k為雜湊函式的個數,n為
bloom filter
所表示集合的元素個數。根據上式,知道了
0的個數就可以很容易推斷
n的大小。
4.通過內積估計集合交集元素個數。假設有兩個
bloom filter
分別表示集合s1和
s2,它們位陣列的大小相同且使用同一組雜湊函式,下面我們來看第
i位在兩個
bloom filter
同時被置為
1的概率。要讓某一位同時被置為
1,只有兩種可能:要麼它是被
s1∩s2
中的元素設定的,要麼分別是被
s1 – (s1∩s2)
和s2 - (s1∩s2)
中的元素設定的。因此第
i位在兩個
bloom filter
同時被置為
1的概率為:
|s|表示
s中元素的個數,
k表示雜湊函式的個數,
m表示位陣列的大小。經過化簡,再乘以
m,得到兩個位陣列內積的數學期望值為:
如果不知道
|s1|
和|s2|
,可以用
3中的方法根據
0的個數估計出它們的大小。最後,根據上式,我們在知道內積的情況下就可以很容易推斷
| s1∩s2|
的大小。 5.
表示全集。很簡單,將位陣列設為全
1就可以表示全集了,因為查詢任何乙個元素都會得到肯定的結果。
Bloomfilter 的應用場景
bloomfilter 一般用於檢測某元素是否在集合中存在,它的目標是解決在大資料量情況的元素判定。它的優點是它提供的資料結構具有非常高的時間查詢和空間儲存效率,缺點是可能造成誤判,就是說,它判定某元素在集合中,但是其實有可能他不在集合裡面,當然,反過來說,如果他判定元素不在集合裡面,那麼元素肯定是...
Bloom Filter 資料結構的應用
應用1 儲存字典。大家可能對於 word 的拼寫檢查功能非常了解,當你拼錯乙個單詞的時候,word 會自動將這個單詞用紅線標註出來。word 的具體工作原理不得而知,但是在另乙個拼寫檢查器 unix spell checkers 這個軟體中用到了 bloom filter。unix spell ch...
正則應用幾則
從 url 中取得主機名 從主機名中取得後面兩段 preg match host matches echo domain name is n 驗證郵件位址格式 if eregi a z0 9 a z0 9 a z0 9 a z0 9 a z get txtemail else aa 是我是它 pre...