Bloom filter是一種空間效率很高的概率性數(shù)據(jù)結(jié)構(gòu),用來判斷一個(gè)元素是否屬于一個(gè)集合。它通過使用多個(gè)哈希函數(shù)和一個(gè)位數(shù)組來實(shí)現(xiàn)。
以下是Bloom filter的使用步驟:
初始化Bloom filter:創(chuàng)建一個(gè)位數(shù)組,所有位都初始化為0。
添加元素:對(duì)于要添加的元素,使用多個(gè)哈希函數(shù)生成多個(gè)哈希值。然后將對(duì)應(yīng)的位數(shù)組位置設(shè)為1。
查詢?cè)兀簩?duì)于要查詢的元素,使用同樣的哈希函數(shù)生成多個(gè)哈希值。檢查對(duì)應(yīng)的位數(shù)組位置是否都為1。如果都為1,則可能在集合中;如果有任何一個(gè)位為0,則肯定不在集合中。
以下是一個(gè)簡單的Python代碼示例,演示如何使用Bloom filter:
import hashlib
from bitarray import bitarray
class BloomFilter:
def __init__(self, size, num_hash):
self.size = size
self.num_hash = num_hash
self.bit_array = bitarray(size)
self.bit_array.setall(0)
def add(self, element):
for i in range(self.num_hash):
index = self._hash(element, i)
self.bit_array[index] = 1
def contains(self, element):
for i in range(self.num_hash):
index = self._hash(element, i)
if self.bit_array[index] == 0:
return False
return True
def _hash(self, element, index):
hash = hashlib.sha256()
hash.update(bytes(element, 'utf-8'))
return int.from_bytes(hash.digest(), 'little') % self.size
# 使用示例
bloom_filter = BloomFilter(100, 3)
bloom_filter.add('apple')
bloom_filter.add('banana')
print(bloom_filter.contains('apple')) # True
print(bloom_filter.contains('banana')) # True
print(bloom_filter.contains('orange')) # False
在實(shí)際使用中,你可以根據(jù)需要調(diào)整位數(shù)組的大小和哈希函數(shù)的數(shù)量,以平衡空間和查詢準(zhǔn)確性的需求。