当前位置: 首页 > news >正文

布隆过滤器

布隆过滤器

布隆过滤器就是测试一个元素是否属于一个集合。

特点

空间利用率高:布隆过滤器可以用较少的空间表示较大的集合。

**快速查找:**查询操作的时间复杂度为O(k),其中k是hash function的数量。

**存在误判:**它可能认为某个不在集合中的元素在集合中,但是不会出现某个在集中的元素说不在。(缺点,元素越多,错误率越高,不支持删除(改进版本如计数布隆过滤器可能支持)

结构

布隆过滤器由一个位数组和一组独立的hash function组成。他的工作原理是:

1.**初始化:**初始化一个大小为m的位数组,所有位都设置0。选择k哥独立的hash function。

  1. 添加元素: 对于每个要添加的元素,使用k个hash function分别计算该元素的k个hash值,将这个hash 值对应的位置都设置1.
  2. 查询元素: 对于查询的元素,同样适用k个hash函数计算其k个hash值,检查这个k个位置。如果所有位置都是1.则认为该元素可能存在集合中;如果任何一个位置为0,那么这个元素一定不在集合中。
模拟实现

假设你有一个集合,用来存储一些学生的名字,你需要快速判断一个名字是否在这个集合中。

假设你要添加名字"Alex"到集合中:

  1. 你使用哈希函数A对"Alex"进行哈希运算,得到值2。

  2. 使用哈希函数B对"Alex"进行哈希运算,得到值4。

  3. 使用哈希函数C对"Alex"进行哈希运算,得到值7

    然后你把数组中第2、4、7位设为1。现在位数组可能是这样的:[0, 0, 1, 0, 1, 0, 0, 1, 0, 0]

这时候我们要查bob

  1. 使用哈希函数A对"Bob"进行哈希运算,得到值3。
  2. 使用哈希函数B对"Bob"进行哈希运算,得到值5。
  3. 使用哈希函数C对"Bob"进行哈希运算,得到值8。

然后你检查数组中第3、5、8位:

  • 第3位是0
  • 第5位是0
  • 第8位是0

说明bob不在

这时候在查alex发现

使用哈希函数A对"Alex"进行哈希运算,得到值2。

使用哈希函数B对"Alex"进行哈希运算,得到值4。

使用哈希函数C对"Alex"进行哈希运算,得到值7。

所以alex在。

使用场景

网络缓存和数据库的快速查找。

黑名单过滤

爬虫对已访问URL的记录

分布式系统中的数据同步。

为什么存在错误判定

因为多个名字的hash值可能会碰撞,导致同一个位置被设置为1.但是布隆过滤器不会漏任何在集合中的元素。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 组蛋白乳酸化和RNA甲基化如何联动?请大数据把这个思路推给科研人
  • 五粮液提价获渠道积极反馈:增强信心、促进动销、利好产业
  • 医疗器械产品没有互联网连接,就不适用于网络安全要求吗?
  • Llama 3.1:Meta 的开源 AI 巨兽,智能新高度
  • Java中常用的配置类:最佳实践与示例
  • [C++] 容器适配器:深入理解Stack与Queue的底层原理
  • 使用 Elasticsearch 和 LlamaIndex 保护 RAG 中的敏感信息和 PII 信息
  • vue 双向绑定原理
  • 【文件解析漏洞】实战详解!
  • python:plotly 网页交互式数据可视化工具
  • 我是客服新手,打字很慢,怎么办?
  • OpenCV 图像处理 轮廓检测基本原理
  • JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南
  • C语言 柔性数组 详解
  • 锅总详解开源组织之ASF
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • CentOS7 安装JDK
  • css布局,左右固定中间自适应实现
  • HTTP中GET与POST的区别 99%的错误认识
  • mysql中InnoDB引擎中页的概念
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • react 代码优化(一) ——事件处理
  • SQLServer之创建数据库快照
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • VUE es6技巧写法(持续更新中~~~)
  • Vue 动态创建 component
  • Vue组件定义
  • 对JS继承的一点思考
  • 给Prometheus造假数据的方法
  • 构建二叉树进行数值数组的去重及优化
  • 区块链技术特点之去中心化特性
  • 以太坊客户端Geth命令参数详解
  • raise 与 raise ... from 的区别
  • #### golang中【堆】的使用及底层 ####
  • #stm32整理(一)flash读写
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (二十三)Flask之高频面试点
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Web项目创建比较不错的参考文章
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET开源、简单、实用的数据库文档生成工具
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net中应用SQL缓存(实例使用)
  • @SuppressWarnings(unchecked)代码的作用
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现