利用Python实现BloomFiter(布隆过滤器)

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)

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值