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

布隆过滤器原理

布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。


理解布隆过滤器原理首先我们得从购买彩票入手,假设我们买的彩种是36选7(即从36个数中选择7个数),如果有三个从不认识而且都居住在不同的地方人都买了彩票,你说他们都选取了7个相同号码的概率是不是很低,我们先假设这三个人分别为 A,B,C
再假设他们购买的彩票号码是
A:1 5 22 8 32 7 18
B:23 5 22 8 31 7 11
C:21 11 22 8 5 7 4


我们再构造一个长度为36个元素的整数数组


arr=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]


我们分别找出A、B、C数值对应的数组下标的值是否为1,经验证都为1。从而可以看出我们可以使用像D-arr这样的一个数组来记录用户购买了彩票的哪些数字,反过来这些数字的7位组合对应了某个用户,如果用户给出的7位数对应数组下标的值都为1话那么证明了这用户确实是购买了这彩票。像上面的D-arr可能还存在某个用户F,他买的号码可能是: 1 11 18 21 23 31 32。
好了,现在我们再来假设出来了一种新采种,叫作100万选9,就是说上面的arr变成了100万个元素的数组。我们再假设购买彩票的人有1万人,那么这一万人当中存在某两个人购买了相同彩票的概率是多少呢?那是很低低的,自己算去哈。。。
好吧,这就是布隆过滤器原理,就是把字符串映射成多个随机的数组下标,不同的字符串有一定概率映射到相同的数组下标,决定这个概率的因素有映射字符串的数量(就是上例的有多少人购买彩票)和arr的长度以及随机数生成的策略(就是上面购买彩票的人所使用的买彩票算法,如果每个人都使用或者大部人都使用相同的算法,那么这个概率就会增加,如果尽可能地每个人买采的算法都不同则概率降低)。


PS:此文章并非完全正确,这是作者学习布隆过滤器时候的感悟,发上来的目标也是为了求证我这感悟是否正确。谢谢!

相关文章:

  • C# 网络编程之最简单浏览器实现
  • Win32_4深入浅出Win32的计时器
  • response.IsClientConnected参考
  • 参数化SQL小认识
  • Win32_5程序员求爱的创意程序^_^
  • cisco单臂路由
  • VC2010中 调用DLL的方法
  • Win32_6Win32的验证码程序
  • iOS Xcode, 解决“Could not insert new outlet connection”的问题。
  • Win32_7由浅入深——滚动条
  • 简单实现web服务器负载均衡
  • Android编程之ActivityManager: Segmentation fault
  • C# 网络编程之网页简单下载实现
  • mac 下对 iterm 终端 设置代理
  • 如何理解c和c++的复杂类型声明
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【笔记】你不知道的JS读书笔记——Promise
  • CentOS从零开始部署Nodejs项目
  • js作用域和this的理解
  • Laravel核心解读--Facades
  • linux安装openssl、swoole等扩展的具体步骤
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Sass 快速入门教程
  • Vue--数据传输
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 缓存与缓冲
  • 你真的知道 == 和 equals 的区别吗?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 人脸识别最新开发经验demo
  • 说说动画卡顿的解决方案
  • 思维导图—你不知道的JavaScript中卷
  • 异步
  • Python 之网络式编程
  • 如何在招聘中考核.NET架构师
  • 数据可视化之下发图实践
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (10)ATF MMU转换表
  • (4)Elastix图像配准:3D图像
  • (Python第六天)文件处理
  • (安卓)跳转应用市场APP详情页的方式
  • (二)Linux——Linux常用指令
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (已解决)什么是vue导航守卫
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *p++,*(p++),*++p,(*p)++区别?
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net Stream篇(六)
  • .net 流——流的类型体系简单介绍
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献