這次kata的內容:實現一個布隆過濾器
布隆過濾器 (Bloom Filter)
什么是布隆過濾器呢?簡單來說, 布隆過濾器可以告訴你一個元素是否在一個集合中.
有同學可能就會說了, 這很簡單啊, 集合中本來就有所有的元素, 我只要檢查輸入內容是否在里面不就行了.
沒錯, 這種方法成功率最高(100%), 但是效率最低.
如果只是處理十個字符串、一百個字符串, 這都沒問題, 但是如果要處理成百上千萬的字符串, 顯然是不可行的, 空間和時間都無法接受.
這時候該主角出場了——布隆過濾器.
布隆過濾器的核心思想就是用盡可能少的空間來存儲盡可能多的內容, 同時盡量保證準確率.布隆過濾器本質上很像哈希表, 把一個大的空間映射到一個小的空間, 那么問題就來了, 如果兩個不同元素映射到了同一個位置怎么辦呢?哈希表有各種算法可以解決沖突, 但是布隆過濾器非常簡單粗暴——我才不管你, 映射到同一個位置那就存同一個位置.
因此, 布隆過濾器的準確率并不是100%.準確地說, 布隆過濾器具有假陽性, 也就是說如果它告訴你一個元素在集合中, 那這個結果可能是錯誤的, 因為有可能這個元素和集合中另一個不同的元素映射到了同一位置.但是反過來, 如果它告訴你一個元素不在集合中, 那這個元素就肯定不在集合中.所以布隆過濾器在某些場景下是非常合適的.
為了進一步壓縮空間同時提高準確率, 布隆過濾器有很多種改進方法, 其中比較常用的是把一個元素映射到結果集中的多個位(bit).舉例來說, 假設每個元素會被映射到5個點, 那么兩個元素只要有一個點不相同就可以判斷出來;但是如果只映射到一個點, 那么這個點只要相同就無法準確判斷了, 因此映射到多個點可以增加準確度.此外, 這個方法還可以壓縮空間, 因為映射一個點的時候, 為了減少碰撞我們必須使用很大的空間, 但是映射多個點的時候, 多個點全部相同的概率很小, 所以我們就可以使用比較小的空間.