Java实现布隆过滤器示例

布隆过滤器(Bloom Filter)是一种用于快速检查一个元素是否属于一个集合的数据结构。它基于哈希函数的思想,可以在空间和时间上实现高效的元素判断。

布隆过滤器通常用于解决以下问题:

1.快速查询:布隆过滤器可以在常数时间内进行元素的查询操作,而不受集合大小的影响,因此非常适用于需要快速判断某个元素是否可能存在于一个大型集合中的场景。

2.节省空间: 布隆过滤器使用比较少的内存空间来存储数据,通常比使用传统的哈希表或者数组来存储大型数据集合更加节省空间。

3.误判率可控:虽然布隆过滤器可以提供高效的查询操作,但是它也可能会产生一定的误判率(即判断某个元素存在于集合中,但实际上它并不在集合中)。然而,通过合理地选择哈希函数的个数和布隆过滤器的大小,可以在一定程度上控制误判率。

4.数据预处理: 布隆过滤器可以用于预处理数据集,在实际的查询操作中,可以将大部分不可能存在的元素直接过滤掉,从而减轻后续查询操作的负担。

由于布隆过滤器具有以上优点,因此它在很多需要快速查询大型数据集合的场景中被广泛应用,例如网络爬虫中的 URL去重、拦截垃圾邮件、缓存系统中的缓存失效判断等。然而需要注意的是,布隆过滤器的误判率是可以控制但无法完全消除的,因此在一些对查询结果准确性要求较高的场景中,可能不适合使用布隆过滤器。

下面是一个简单的布隆过滤器实现

import java.util.BitSet;

public class BloomFilter {
    private static final int DEFAULT_SIZE = 10000; // 布隆过滤器的默认大小
    private BitSet bitSet;
    private int[] hashSeeds; // 哈希种子数组

    public BloomFilter() {
        this(DEFAULT_SIZE);
    }

    public BloomFilter(int size) {
        bitSet = new BitSet(size);
        hashSeeds = new int[]{3, 5, 7, 11, 13}; // 选择几个不同的哈希种子
    }

    // 添加元素
    public void add(String element) {
        for (int seed : hashSeeds) {
            int hash = hash(element, seed);
            bitSet.set(hash, true);
        }
    }

    // 判断元素是否可能存在
    public boolean contains(String element) {
        for (int seed : hashSeeds) {
            int hash = hash(element, seed);
            if (!bitSet.get(hash)) {
                return false;
            }
        }
        return true;
    }

    // 哈希函数
    private int hash(String element, int seed) {
        int result = 0;
        for (char ch : element.toCharArray()) {
            result = seed * result + ch;
        }
        return Math.abs(result % bitSet.size());
    }

    public static void main(String[] args) {
        BloomFilter bloomFilter = new BloomFilter();

        // 添加一些元素
        bloomFilter.add("123");
        bloomFilter.add("456");
        bloomFilter.add("789");

        // 检查元素是否存在
        System.out.println("检验123: " + bloomFilter.contains("123"));
        System.out.println("检验852: " + bloomFilter.contains("852"));
    }
}

运行一下

在这里插入图片描述

注意:布隆过滤器越大,哈希种子越多,那么误判率越低,但是同样的消耗的资源也越多,需要大家自己根据需求评估选择

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值