布隆过滤器

布隆过滤器是一种高效的数据结构,它可以用来判断一个元素是否在一个集合中。布隆过滤器使用一个位数组来表示集合中的元素,当一个元素被添加到集合中时,布隆过滤器会将位数组中与该元素相关的位设置为 1。当需要判断一个元素是否在集合中时,布隆过滤器会检查与该元素相关的位是否都为 1,如果是,则该元素一定在集合中;如果不是,则该元素一定不在集合中。

布隆过滤器具有很高的准确率,但也有可能出现误判的情况。误判是指布隆过滤器判断一个元素在集合中,但实际上该元素不在集合中。误判的概率与布隆过滤器的大小有关,布隆过滤器越大,误判的概率就越小。

布隆过滤器常用于减少数据库查询的次数和提高查询效率,例如,布隆过滤器可以用于判断一个 URL 是否在数据库中,如果不在,则直接返回结果,无需查询数据库;如果在,则再查询数据库进行进一步判断。

import java.util.BitSet;

public class BloomFilter {

    private static final int DEFAULT_SIZE = 256;
    private static final int DEFAULT_HASH_COUNT = 3;

    private BitSet bitset;
    private int size;
    private int hashCount;

    public BloomFilter() {
        this(DEFAULT_SIZE, DEFAULT_HASH_COUNT);
    }

    public BloomFilter(int size, int hashCount) {
        this.size = size;
        this.hashCount = hashCount;
        this.bitset = new BitSet(size);
    }

    public void add(String element) {
        for (int i = 0; i < hashCount; i++) {
            int hash = hash(element, i);
            bitset.set(hash);
        }
    }

    public boolean contains(String element) {
        for (int i = 0; i < hashCount; i++) {
            int hash = hash(element, i);
            if (!bitset.get(hash)) {
                return false;
            }
        }
        return true;
    }

    private int hash(String element, int i) {
        return Math.abs(element.hashCode() + i) % size;
    }

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

        bloomFilter.add("hello");
        bloomFilter.add("world");

        System.out.println(bloomFilter.contains("hello")); // true
        System.out.println(bloomFilter.contains("world")); // true
        System.out.println(bloomFilter.contains("foo")); // false
    }
}

你可能感兴趣的:(java)