【数据结构与算法】《布隆过滤器:高效数据筛选的魔法工具》

在这里插入图片描述

标题:《布隆过滤器:高效数据筛选的魔法工具》

摘要:本文将带你深入了解布隆过滤器这一神奇的数据结构。从研究推荐系统中的已读内容排除和重复内容去重问题引入,详细介绍布隆过滤器的产生契机、设计思想、优缺点及用途。通过阅读本文,你将掌握布隆过滤器的工作原理和应用场景,为你的数据处理工作带来新的思路。

关键词:布隆过滤器、推荐系统、数据去重、哈希函数、假阳性、空间效率、时间效率

一、引子

最近在研究推荐系统中已读内容排除以及重复内容去重相关的问题,布隆过滤器是解决这类问题最好的工具之一。它能够在不占用大量空间的情况下,快速检测集合中是否存在特定元素,为推荐系统的优化提供了有力支持。

二、布隆过滤器介绍

  1. 定义
    • 布隆过滤器(Bloom Filter,简称 BF)由 Burton Howard Bloom 在 1970 年提出,是一种空间效率高的概率型数据结构。
    • 专门用来检测集合中是否存在特定的元素。
  2. 产生契机
    • 当集合中元素数量极多时,传统的存储方式如线性表、平衡二叉树(BST)、哈希表等,在查找时间和空间占用上都会面临巨大挑战。
    • 线性表存储查找时间复杂度为 O(n)。
    • 平衡 BST(如 AVL 树、红黑树)存储时间复杂度为 O(logn)。
    • 哈希表存储并用链地址法与平衡 BST 解决哈希冲突(参考 JDK8 的 HashMap 实现方法),时间复杂度也要有 O[log(n/m)],m 为哈希分桶数。
    • 布隆过滤器就是为了解决这个矛盾而诞生的利器。

三、设计思想

  1. 组成结构
    • 布隆过滤器由一个长度为 m 比特的位数组(bit array)与 k 个哈希函数组成。
    • 位数组初始化为 0,哈希函数可以把输入数据尽量均匀地散列。
  2. 插入元素
    • 当要插入一个元素时,将其数据分别输入 k 个哈希函数,产生 k 个哈希值。
    • 以哈希值作为位数组中的下标,将所有 k 个对应的比特置为 1。
  3. 查询元素
    • 当要查询即判断是否存在一个元素时,同样将其数据输入哈希函数,然后检查对应的 k 个比特。
    • 若有任意一个比特为 0,表明该元素一定不在集合中。若所有比特均为 1,表明该集合有较大的可能性在集合中,但不是一定在集合中,这就是所谓“假阳性”(false positive)。相对地,“假阴性”(false negative)在 BF 中是绝不会出现的。
  4. Java 代码片段示例
import java.util.BitSet;
import java.util.HashSet;
import java.util.Set;public class BloomFilter {private int bitSize;private int hashFunctionCount;private BitSet bitSet;private Set<Integer> hashFunctions;public BloomFilter(int bitSize, int hashFunctionCount) {this.bitSize = bitSize;this.hashFunctionCount = hashFunctionCount;bitSet = new BitSet(bitSize);hashFunctions = new HashSet<>();for (int i = 0; i < hashFunctionCount; i++) {// 这里可以使用不同的哈希函数生成方法,为了简单起见,使用随机数模拟哈希函数hashFunctions.add((int) (Math.random() * bitSize));}}public void add(Object element) {for (Integer hashFunction : hashFunctions) {int hashValue = Math.abs(hashFunction.hashCode() ^ element.hashCode()) % bitSize;bitSet.set(hashValue);}}public boolean contains(Object element) {for (Integer hashFunction : hashFunctions) {int hashValue = Math.abs(hashFunction.hashCode() ^ element.hashCode()) % bitSize;if (!bitSet.get(hashValue)) {return false;}}return true;}public static void main(String[] args) {BloomFilter filter = new BloomFilter(1000, 5);filter.add("apple");filter.add("banana");System.out.println(filter.contains("apple")); // trueSystem.out.println(filter.contains("orange")); // false or might be false positive}
}
  1. 流程图
graph TD;A[开始] --> B[插入元素/查询元素?];B -->|插入元素| C[将元素输入 k 个哈希函数];C --> D[获取 k 个哈希值];D --> E[以哈希值为下标,将位数组对应比特置为 1];E --> F[结束插入];B -->|查询元素| G[将元素输入 k 个哈希函数];G --> H[获取 k 个哈希值];H --> I[检查对应比特是否全为 1];I -->|是| J[可能在集合中(有假阳性可能)];I -->|否| K[一定不在集合中];J --> L[结束查询];K --> L;

四、优缺点与用途

  1. 优点
    • 不需要存储数据本身,只用比特表示,因此空间占用相对于传统方式有巨大的优势,并且能够保密数据。
    • 时间效率也较高,插入和查询的时间复杂度均为 O(k)。
    • 哈希函数之间相互独立,可以在硬件指令层面并行计算。
  2. 缺点
    • 存在假阳性的概率,不适用于任何要求 100%准确率的情境。
    • 只能插入和查询元素,不能删除元素。
  3. 用途
    • 在对查准度要求没有那么苛刻,而对时间、空间效率要求较高的场合非常合适,如推荐系统中的已读内容排除和重复内容去重。
    • 用作“不存在”逻辑的处理时有奇效,比如可以用来作为缓存系统(如 Redis)的缓冲,防止缓存穿透。

五、假阳性率的影响因素

在哈希函数的个数 k 一定的情况下:位数组长度 m 越大,假阳性率越低;已插入元素的个数 n 越大,假阳性率越高。

六、Redis 中的应用

Redis 提供的 Bitmap 正好能够作为布隆过滤器所需要的位数组的基础。

表格对比传统存储方式与布隆过滤器

存储方式查找时间复杂度空间占用是否有假阳性是否可删除元素
线性表O(n)较大
平衡 BSTO(logn)较大
哈希表(JDK8 实现)O[log(n/m)]较大可(有一定限制)
布隆过滤器O(k)极小不可

Excel 表格展示文章内容

内容描述
布隆过滤器介绍空间效率高的概率型数据结构,用于检测集合中元素。
产生契机解决传统存储方式在元素数量极多时的查找慢和空间大问题。
设计思想由位数组和哈希函数组成,通过置位比特判断元素是否可能在集合中。
优缺点与用途优点包括空间小、时间快、可并行;缺点是有假阳性且不能删除元素;适用于对查准度要求不高的场合。
假阳性率影响因素位数组长度 m 越大假阳性率越低,已插入元素个数 n 越大假阳性率越高。
Redis 中的应用Redis 的 Bitmap 可作为位数组基础。

嘿,小伙伴们!布隆过滤器是不是很有趣呢?快来评论区分享你在实际应用中使用布隆过滤器的经验和心得吧!让我们一起探索更多数据结构的奇妙之处。😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455227.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用

市场应用背景 DELTA并联机械手是由三个相同的支链所组成&#xff0c;每个支链包含一个转动关节和一个移动关节&#xff0c;具有结构紧凑、占地面积小、高速高灵活性等特点&#xff0c;可在有限的空间内进行高效的作业&#xff0c;广泛应用于柔性上下料、包装、分拣、装配等需要…

MyBatis 基础知识:配置文件、映射器与 SQL 示例详解

本篇博客将深入探讨 MyBatis 的基础知识&#xff0c;包括配置文件的设置、映射器的使用以及实际的 SQL 示例。 文章目录 前言 准备工作 根据主键删除 日志输出 ​编辑 预编译SQL SQL注入 ​编辑 参数占位符 新增员工 主键返回 更新 查询&#xff08;根据ID查询&#x…

世界前沿思想升命学说:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪

在当今哲学的前沿探索中&#xff0c;山东济南的名人颜廷利教授的《升命学说》一书以其独到的见解和深刻的洞察力&#xff0c;为我们揭示了十二生肖背后的象征意义。这些生肖包括鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗以及猪&#xff0c;每一种动物都承载着独特的文化寓意…

哥德巴赫猜想渐行渐远

我现在的工作&#xff0c;表明经典分析可能出了问题&#xff0c;如此则连Vinogradov的三素数定理都不成立了&#xff0c;更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立&#xff0c;由于我指出Siegel定理不成立&#xff0c;陈景润和张益唐的工作就不成立。…

卡牌抽卡机小程序,带来新鲜有趣的拆卡体验

随着移动信息技术的发展&#xff0c;小程序得到了快速普及&#xff0c;遍布到了各行各业中&#xff0c;成为企业发展的利器。如今&#xff0c;卡牌抽卡机小程序层出不穷&#xff0c;为玩家带来了更多有趣的拆卡体验。 卡牌在今年中受到了广泛关注&#xff0c;“小马宝莉”等一…

Qt中使用线程之QRunnable

1、自定义1个子类继承自QRunnable 2、重写run方法&#xff0c;编写子线程的业务逻辑 3、使用QThreadPool的全局方法来开启这个线程 4、线程的回收不需要关注&#xff0c;由QThreadPool处理 5、缺点&#xff1a;无法使用信号槽机制 6、适合一些不需要和主线程通信的耗时的任…

如何使用的是github提供的Azure OpenAI服务

使用的是github提供的Azure OpenAI的服务gpt-4o 说明&#xff1a;使用的是github提供的Azure OpenAI的服务&#xff0c;可以无限薅羊毛。开源地址 进入&#xff1a; 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…

[Ansible实践笔记]自动化运维工具Ansible(一):初探ansibleansible的点对点模式

文章目录 Ansible介绍核心组件任务执行方式 实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端&#xff0c;实现免密登录测试一下是否实现免密登录 常用工具ansibleansible—docansible—playbook 主要配置文件 Ansible 模…

【数据结构】快速排序(三种实现方式)

目录 一、基本思想 二、动图演示&#xff08;hoare版&#xff09; 三、思路分析&#xff08;图文&#xff09; 四、代码实现&#xff08;hoare版&#xff09; 五、易错提醒 六、相遇场景分析 6.1 ❥ 相遇位置一定比key要小的原因 6.2 ❥ 右边为key&#xff0c;左边先走 …

dd小程序如何监听props中对象的值

组件内代码 Component({mixins: [],data: {infoData:{}},props: {rowData:Object},didMount() {console.log(this.props.rowData,this.props.rowDatathis.props.rowData)this.setData({infoData:this.props.rowData})},didUpdate() {console.log(this.props.rowData)},didUnmo…

落实“双碳”行动,深兰科技推动分子能源技术在AI硬件产品领域的应用及产业化进程

10月21日&#xff0c;上海气候周分子能研究中心(筹)成立仪式在上海环境能源交易所举行。仪式上&#xff0c;深兰科技践行“双碳”目标&#xff0c;与上海东八能源技术有限公司签署分子能源AI应用产业化合作协议。 根据协议&#xff0c;国际分子能量发电开拓者、上海气候周分子能…

论当前的云计算

随着技术的不断进步和数字化转型的加速&#xff0c;云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算&#xff0c;作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…

TMGM平台可靠么?交易是否安全?

在选择外汇交易平台时&#xff0c;安全性与可靠性是投资者最关注的要素之一。作为全球知名的外汇及差价合约交易平台&#xff0c;TMGM&#xff08;tmgm-pt.com&#xff09;的安全性与可靠性可以从多个方面进行评估&#xff0c;包括监管环境、资金安全、客户服务、交易技术与服务…

[项目][boost搜索引擎#4] cpp-httplib使用 | log.hpp | 前端 | 测试及总结

目录 编写http_server模块 1. 引入cpp-httplib到项目中 2. cpp-httplib的使用介绍 3. 正式编写http_server 九、添加日志到项目中 十、编写前端模块 十一. 详解传 gitee 十二、项目总结 项目的扩展 写在前面 项目 gitee 已经上传啦 &#xff08;还是决定将学校和个人…

LabVIEW共享变量通信故障

问题概述&#xff1a; 在LabVIEW项目中&#xff0c;使用IO服务器创建共享变量&#xff0c;并通过LabVIEW作为从站进行数据通信。通讯在最初运行时正常&#xff0c;但在经过一段时间或几个小时后&#xff0c;VI前面板出现错误输出&#xff0c;导致数据传输失败。虽然“分布式系统…

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上&#xff0c;华为原生鸿蒙 HarmonyOS NEXT&#xff08;5.0&#xff09;正式发布。 华为官方透露&#xff0c;截至目前&#xff0c;鸿蒙操作系统在中国市场份额占据 Top2 的领先地位&#xff0c;拥有超过 1.1 亿 的代码行和 6…

[LeetCode] 230. 二叉搜索树中第K小的元素

题目描述&#xff1a; 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1示例 2&am…

欧盟 RED 网络安全法规 EN 18031

目录 1. &#x1f4c2; EN 18031 1.1 背景 1.2 专业术语 1.3 覆盖产品范围 1.4 EN 18031标准主要评估内容&#xff1a; 1.5 EN 18031标准主要评估项目&#xff1a; 1.6 EN 18031 与 ETSI EN 303 645 的主要差异 1.7 RED 网络安全法规解读研讨会 2. &#x1f531; EN 1…

Docker:namespace环境隔离 CGroup资源控制

Docker&#xff1a;namespace环境隔离 & CGroup资源控制 Docker虚拟机容器 namespace相关命令ddmkfsdfmountunshare 进程隔离文件隔离 CGroup相关命令pidstatstresscgroup控制 内存控制CPU控制 Docker 在开发中&#xff0c;经常会遇到环境问题&#xff0c;比如程序依赖某个…

VirtualBox虚拟机桥接模式固定ip详解

VirtualBox虚拟机桥接模式固定ip详解 VirtualBox 桥接设置Ubuntu 24.04使用固定IP问题记录 VirtualBox 桥接设置 为什么设置桥接模式&#xff1f;桥接模式可以实现物理机和虚拟机互相通信&#xff0c;虚拟机也可以访问互联网&#xff08;推荐万金油&#xff09;&#xff0c;物…