布隆過濾器

布隆過濾器是大數據領域的一個常見算法,它的目的是過濾掉那些不是目標的元素。也就是說如果一個要搜索的詞並不存在與我的數據中,那麼它可以以很快的速度返回目標不存在。

class BloomFilter(object):
    def __init__(self, size):
        self.values = [False] * size
        self.size = size
        
    def hash_value(self,value):
        return hash(value) % self.size

    def add_value(self,value):
        h = self.hash_value(value)
        self.values[h] = True

    def might_contain(self,value):
        h = self.hash_value(value)
        return self.values[h]

    def print_contents(self):
        print(self.values)

bf = BloomFilter(100)
bf.add_value('dog')
bf.add_value('fish')
bf.add_value('cat')
bf.add_value('bird')
bf.print_contents()

for term in ['dog','fish','cat','duck','emu','chick','bot0']:
    print('{}:{} {}'.format(term,bf.hash_value(term),bf.might_contain(term)))

  1. 基本的數據結構是個數組(實際上是個位圖,用1/0來記錄數據是否存在),初始化是沒有任何內容,所以全部置False。實際的使用當中,該數組的長度是非常大的,以保證效率。
  2. 利用哈希算法來決定數據應該存在哪一位,也就是數組的索引
  3. 當一個數據被加入到布隆過濾器的時候,計算它的哈希值然後把相應的位置爲True
  4. 當檢查一個數據是否已經存在或者說被索引過的時候,只要檢查對應的哈希值所在的位的True/Fasle

看到這裏,大家應該可以看出,如果布隆過濾器返回False,那麼數據一定是沒有索引過的,然而如果返回True,那也不能說數據一定就已經被索引過。在搜索過程中使用布隆過濾器可以使得很多沒有命中的搜索提前返回來提高效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章