1 布隆过滤器简介
布隆过滤器是一种数据结构,它可以用于检索一个元素是否在一个集合中。它是由布隆在1970年提出的一种有效的数据结构,被广泛应用于各种场景,例如网络爬虫的URL去重、垃圾邮件的过滤等。
布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。它通过将一个元素映射到一个位阵列(Bit array)中的某个点,然后查看这个点是不是1来判断集合中是否存在这个元素。具体来说,它通过一个哈希函数将一个元素映射成一个位阵列中的位置,如果这个位置的值为1,则认为集合中存在这个元素。
布隆过滤器的优点是空间效率和查询时间都比一般的算法要好的多,因为它只需要存储一个很长的二进制向量,而不需要存储整个集合。同时,它的查询时间也非常快,只需要通过哈希函数计算元素的位置并查看这个位置的值是否为1即可。但是,布隆过滤器也存在一些缺点,例如有一定的误识别率和删除困难的问题。
总之,布隆过滤器是一种非常实用的数据结构,它的优点是空间和时间效率高,缺点是有一定的误识别率和删除困难。
重要点:元素映射到位数组上,当位数组的值为0时:该元素必定不存在,当位数组的值为1时:该元素可能存在(因为元素映射是通过哈希函数来进行的,存在误判)
2 Python实现程序
2.1 BloomFilter类
import pandas as pd
import numpy as np
import mmh3
class BloomFilter:
# 构造位数组
# size: 位数组大小
# hash_count: 哈希种子数
# bit_array: 位数组
def __init__(self, size, hash_count):
self.size = size
self.hash_count = hash_count
self.bit_array = pd.DataFrame({"bits": np.zeros(self.size, dtype=np.int8)})
# 过滤判断
def lookup(self, string):
for seed in range(self.hash_count):
# 计算key的hash值
# 调用了mmh3.hash()函数
hash_result = mmh3.hash(string, seed) % self.size
# 根据hash值,取位数组上的位
result = self.bit_array.loc[hash_result, "bits"]
if result == 0:
# 当位为0时,该key不存在位数组中,返回Ture
self.bit_array.loc[hash_result, "bits"] = 1
return True
else:
# 当位为1时,可能存在位数组中,返回False
return False
2.2 测试
if __name__ == '__main__':
Filter = BloomFilter(1000000, 7)
df = pd.DataFrame({"id": ["100000740653-18ce555853dc4a29b9341d0dbabd8bef",
"100000740477-3a26d0de672f41c7b31db7452fc72001",
"100000740585-aef972b483004ab5b4b6ba129e1f3e7b",
"100000740653-18ce555853dc4a29b9341d0dbabd8bef"]})
def filter_function(data):
result = Filter.lookup(data['id'])
return result
df2 = df.loc[df.apply(filter_function, axis=1)]
print(df2)
结果: