Java 实现布隆过滤器

news/2024/10/8 10:25:34/

在开发过程中,我们经常会遇到需要判断一个元素是否存在于一个庞大的集合中的情况。如果直接使用传统的数据结构如哈希表,可能会面临内存占用大、查询效率低等问题。而布隆过滤器(Bloom Filter)则是一种高效的空间利用率极高的概率型数据结构,可以用来判断一个元素是否可能存在于一个集合中。

一、布隆过滤器简介

布隆过滤器是由 Burton Howard Bloom 在 1970 年提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误判率,即存在把不属于这个集合的元素判断为属于这个集合的情况。

二、布隆过滤器的原理

  1. 初始化:创建一个长度为m的位数组(通常初始值全为 0),并选择k个不同的哈希函数。
  2. 插入元素:对于要插入集合的元素,使用k个哈希函数分别计算出k个哈希值,然后将位数组中对应的k个位置设置为 1。
  3. 查询元素:对于要查询的元素,同样使用k个哈希函数计算出k个哈希值,然后检查位数组中对应的k个位置是否都为 1。如果有任何一个位置为 0,那么该元素肯定不在集合中;如果所有位置都为 1,那么该元素可能在集合中。

三、Java 实现布隆过滤器

以下是使用 Java 实现布隆过滤器的代码示例:

java">import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.BitSet;public class BloomFilter {private BitSet bitSet;private int bitSetSize;private int numHashFunctions;public BloomFilter(int expectedElements, double falsePositiveRate) {bitSetSize = optimalSize(expectedElements, falsePositiveRate);bitSet = new BitSet(bitSetSize);numHashFunctions = optimalNumOfHashFunctions(expectedElements, bitSetSize);}private int optimalSize(int n, double p) {return (int) (-n * Math.log(p) / (Math.log(2) * Math.log(2)));}private int optimalNumOfHashFunctions(int n, int m) {return (int) ((double) m / n * Math.log(2));}public void add(String element) {for (int i = 0; i < numHashFunctions; i++) {int hash = createHash(element, i);bitSet.set(hash % bitSetSize);}}public boolean contains(String element) {for (int i = 0; i < numHashFunctions; i++) {int hash = createHash(element, i);if (!bitSet.get(hash % bitSetSize)) {return false;}}return true;}private int createHash(String element, int seed) {try {MessageDigest md = MessageDigest.getInstance("MD5");md.update((element + seed).getBytes());return new BigInteger(1, md.digest()).intValue();} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}}
}

你可以使用以下方式测试这个布隆过滤器:

java">public class BloomFilterTest {public static void main(String[] args) {BloomFilter filter = new BloomFilter(1000, 0.01);filter.add("apple");filter.add("banana");filter.add("orange");System.out.println(filter.contains("apple")); // trueSystem.out.println(filter.contains("grape")); // false (but might be wrongly reported as true due to false positives)}
}

四、布隆过滤器的应用场景

  1. 数据库查询优化:在数据库查询中,可以使用布隆过滤器来快速判断一个记录是否存在于数据库中。如果布隆过滤器判断记录不存在,那么就可以直接返回,避免进行昂贵的数据库查询操作。
  2. 缓存穿透防护:在缓存系统中,布隆过滤器可以用来防止缓存穿透。如果一个请求的键值不在布隆过滤器中,那么就可以直接返回空结果,而不需要去查询数据库,从而避免了对数据库的不必要访问。
  3. 网络爬虫:在网络爬虫中,可以使用布隆过滤器来记录已经访问过的 URL,避免重复访问。

五、总结

布隆过滤器是一种非常有用的数据结构,它可以在空间效率和查询时间上提供很大的优势。在 Java 中实现布隆过滤器也相对简单,只需要使用位操作和哈希函数即可。但是需要注意的是,布隆过滤器存在一定的误判率,因此在使用时需要根据具体情况进行权衡。


http://www.ppmy.cn/news/1536073.html

相关文章

c++primer第十三章 类继承

本章内容&#xff1a;单个类就可以提供用于管理对话框的全部资源。通常&#xff0c;类库是以源代码的方式提供的&#xff0c;这意味着可以对其进行修改&#xff0c;以满足需求。但是&#xff0c;C-提供了比修改代码更好的方法来扩展和修改类。这种方法叫作类继承(class inheria…

在 Ubuntu 下通过 Docker 部署 NAS 服务器

今天我们在阿贝云的免费服务器上进行 NAS 服务器的部署测试。阿贝云的免费云服务器真是个不错的选择&#xff0c;配置上有1核CPU、1G内存、10G硬盘和5M带宽&#xff0c;完全能满足基本的测试需求。对于小型项目或学习来说&#xff0c;这样的免费云服务器实在是不可多得的资源&a…

信号与系统 第六章(拉普拉斯变换)

一、拉普拉斯变换 1、拉普拉斯变换公式 &#xff08;1&#xff09;一个单位冲激响应为的线性时不变系统&#xff0c;对复数输入信号的响应为&#xff0c;其中&#xff0c;若s为纯虚数&#xff08;即&#xff09;&#xff0c;则对应于的傅里叶变换&#xff0c;对一般的复变量s…

OpenAI董事会主席Bret Taylor的Agent公司Sierra:专注于赋能下一代企业用户体验

本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结&#xff0c;2小时视频&#xff0c;5分钟阅读&#xff0c;加速内容学习与传播。 视频来源 youtube: https://www.youtube.com/watch?vriWB5nPNZEM&t47s 大纲 介绍 欢迎与介绍 介绍Bret Taylor&#x…

【OpenCV 实战】1.手势虚拟拖拽(双手骨骼点识别)

step: 1.opencv 获取视频流 2.在画面上画一个方块 3.通过mediapipe获取手指关键点坐标 4.判断手指是否在方块上 5.若在方块上&#xff0c;方块跟着手指移动 mediapipe网站介绍&#xff1a;Hands - mediapipe (chuoling.github.io) 已上传到GitHub &#xff1a; plumqm/OpenC…

『网络游戏』制作加载进度UI【04】

将上一章的提示界面隐藏 创建空节点重命名为LoadingWnd 设置父物体为伸展 创建一个image背景重命名为bg 将以下资源放进Art文件夹 设为精灵模式后拖拽 将下面资源图片放进Art文件夹 创建Image作为进度条重命名为loadingbg 复制一份重命名为loadingfg 将loadingfg设置为水平填充…

什么是 HTTP 请求中的 preflight 类型请求

在浏览器的 HTTP 请求中&#xff0c;当我们使用 fetch API 或者 XMLHttpRequest 来进行跨域请求时&#xff0c;浏览器有时会发送一种称为 Preflight 的请求。这种请求是浏览器在实际发送跨域请求前&#xff0c;先与目标服务器进行的一次 “探测” 请求&#xff0c;以确认服务器…

机器学习框架

机器学习框架是用于构建、训练和评估机器学习模型的工具集。以下是一些常用的机器学习框架&#xff1a; TensorFlow&#xff1a;由Google开发的开源框架&#xff0c;支持深度学习和传统机器学习模型。 PyTorch&#xff1a;由Facebook开发的开源框架&#xff0c;重点支持动态计…