布隆过滤器介绍

布隆过滤器是一种 概率型数据结构,用于判断一个元素是否可能属于一个集合。
它的特点是:

    •    可能会误判:它可能告诉你一个元素在集合中,实际上它不在。
    •    绝不会漏判:如果它说元素不在集合中,那么元素一定不在。

这使得布隆过滤器适合用于 快速判断一个元素是否存在,尤其是在对空间和时间效率要求较高的场景。

核心思想

布隆过滤器底层是一个固定长度的位数组和一组哈希函数:

    1.    位数组:初始时,所有位都设置为 0。
    2.    哈希函数:用于将元素映射到位数组的不同位置。

元素插入流程:

    •    对元素 x 应用多个哈希函数,计算出多个数组下标。
    •    将这些下标对应的位数组位置置为 1。

元素查询流程:

    •    对查询的元素 y 应用同样的哈希函数,得到多个下标。
    •    检查这些下标对应的位是否全为 1:
    •    如果全为 1,则说明元素 可能存在。
    •    如果有任何一位是 0,则说明元素 一定不存在。

优缺点

优点:

    1.    节省空间:相比传统的哈希表或集合,布隆过滤器占用的内存更小。
    2.    快速查询:时间复杂度为 O(k),其中 k 是哈希函数的数量。
    3.    无需存储元素:仅需存储位数组,不需要保存实际数据。

缺点:

    1.    误判概率:可能出现“假阳性”,即报告某元素存在,但实际上不存在。
    2.    无法删除元素:布隆过滤器的位数组是共享的,删除元素可能影响其他元素的正确性。
    3.    大小固定:布隆过滤器的大小一旦确定,就无法动态扩展。

误判概率计算

布隆过滤器的误判概率由以下因素决定:

    1.    位数组长度 m
    2.    哈希函数数量 k
    3.    插入的元素个数 n

误判率公式:


P \approx \left(1 - e^{-\frac{kn}{m}}\right)^k


    •    k = \frac{m}{n} \ln 2 是最佳哈希函数数量。
    •    随着 n 增大,误判概率也会增大。

使用场景

    1.    缓存系统
在 Redis 缓存中,使用布隆过滤器快速判断数据是否在数据库中,避免缓存穿透。
    2.    垃圾邮件检测
布隆过滤器存储垃圾邮件的特征值,用于快速判断是否可能是垃圾邮件。
    3.    网页爬虫
爬虫使用布隆过滤器存储已访问的 URL,避免重复爬取。
    4.    区块链和去中心化网络
比特币网络使用布隆过滤器过滤感兴趣的交易。
    5.    推荐系统
快速判断用户是否已经看过某个推荐内容。

示例代码

以下是 Python 中布隆过滤器的简单实现:

from bitarray import bitarray
import mmh3

class BloomFilter:
    def __init__(self, size, hash_count):
        self.size = size                # 位数组大小
        self.hash_count = hash_count    # 哈希函数数量
        self.bit_array = bitarray(size)
        self.bit_array.setall(0)        # 初始化位数组

    def add(self, item):
        for i in range(self.hash_count):
            index = mmh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值