实例学习Bloom Filter

简介:

0. 科普
1. 为什么需要Bloom Filter
2. 基本原理
3. 如何设计Bloom Filter
4. 实例操作
5. 扩展

 

0. 科普

      Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。

 

1. 为什么需要Bloom Filter

      举例说明:假设有2000万个url,现在判断一个新的url是否在这2000万个之中。可以有的思路:

  1. 将访问过的URL保存到数据库。
  2. 用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以查到一个URL是否被访问过了。
  3. URL经过MD5等单向哈希后再保存到HashSet或数据库。
  4. Bit-Map方法。建立一个BitSet,将每个URL经过一个哈希函数映射到某一位。

分析

思路1:当数据量很大时,查询数据库变得效率底下

思路2:太消耗内存,还得把字符串全部储存起来

思路3:字符串经过MD5处理后有128个bit,比思路2省了很多空间

思路4:一个字符串仅用一位来表示,比思路3还节省空间

当然前提是会出现误判(哈希后表示相同),为了继承这么好的思路,同时减少误判的情况,可以来个折衷:一个哈希函数生成一个位,用多个哈希函数生成多个位来存储一个字符串。这样比Bit-Map多用了些空间,但是减少了误判率。

 

2. 基本原理

这样把大量的字符串存起来。查找时,用同样的哈希处理待查串,如果对应的各位上都为1,说明该字符串可能在这些字符串中,否则一定不在其中。

 

3. 如何设计Bloom Filter

如何降低误判率是关键,这需要

  • 选取区分度高的哈希函数
  • 根据存储数组、哈希函数个数、误判率之间的关系,分配空间、个数

直接利用前人的结论:

其中f'是自己期望的误判率,m是总共开辟的存储空间位数,n是待存储字符串的个数,k是哈希函数的个数,f是真正的误判率。

 

4. 实例操作

需求:2000万个已知url,100个待查url

设计

1. 设定误判率为0.1, n=2000万,计算

m = n * 1.44 * math.log(1/f)/math.log(2)=287014588
k = 0.693 * m / n= 10
f = (1 - math.exp(-1 * k * n / m)) ** k = 0.00101298781512

哈希函数的选取看这里

参考代码(c++)

makefile

  View Code

main.cc

  View Code

bloomfilter.h

  View Code

bloomfilter.cc

  View Code

hash.h

  View Code

hash.cc

  View Code

数据下载:http://pan.baidu.com/s/1hqBTks0

Github 地址:https://github.com/jihite/Bloom-Filter

 

5. 扩展

如何删除存储数组中的元素?

思路:把存储数组的每一个元素扩展一下(原来是1b)用来存储该位置被置1的次数。存储是,计数次数加一;删除的时候,计数次数减一。

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3669140.html,如需转载请自行联系原作者


相关文章
|
关系型数据库 MySQL 数据库
n8n自动化工具部署与使用
n8n是一款开源的工作流自动化工具,类似于IFTTT。它的优点是开源、可以自托管、下载安装方便、易于使用,可以互联上百种服务。n8n基于节点能够将任何工具连接在一起,轻松部署不同类型的任务。它可以做很多事情,比如:从数据库中获取数据后下载为excel然后通过邮件发送给其他人。
9410 1
|
XML 存储 API
RAG效果优化:高质量文档解析详解
本文介绍了如何通过高质量的文档解析提升RAG系统整体的效果。
15959 15
|
10月前
|
边缘计算 人工智能 搜索推荐
移动应用与系统:技术演进与未来展望
【10月更文挑战第39天】在数字时代的浪潮中,移动应用和操作系统作为连接用户与数字世界的桥梁,其技术的演进不仅改变了我们的生活方式,还不断推动着社会的数字化转型。本文将探讨移动应用开发的最新趋势、移动操作系统的技术革新,以及这些变化如何塑造我们的未来。通过深入浅出的分析,我们将一窥移动技术的未来蓝图,并思考如何在不断变化的技术环境中保持竞争力。
130 0
|
网络协议 安全 Linux
DNS 分析神器:dnsenum 保姆级教程(附链接)
DNS 分析神器:dnsenum 保姆级教程(附链接)
|
机器学习/深度学习 传感器 编解码
万字长文 | 多目标跟踪最新综述(基于Transformer/图模型/检测和关联/孪生网络)(上)
随着自动驾驶技术的发展,多目标跟踪已成为计算机视觉领域研究的热点问题之一。MOT 是一项关键的视觉任务,可以解决不同的问题,例如拥挤场景中的遮挡、相似外观、小目标检测困难、ID切换等。为了应对这些挑战,研究人员尝试利用transformer的注意力机制、利用图卷积神经网络获得轨迹的相关性、不同帧中目标与siamese网络的外观相似性,还尝试了基于简单 IOU 匹配的 CNN 网络、运动预测的 LSTM。为了把这些分散的技术综合起来,作者研究了过去三年中的一百多篇论文,试图提取出近年来研究者们更加关注的解决 MOT 问题的技术。
万字长文 | 多目标跟踪最新综述(基于Transformer/图模型/检测和关联/孪生网络)(上)
|
云安全 监控 安全
【Aquasec翻译计划】什么是应用安全姿态管理(ASPM)
【Aquasec翻译计划】什么是应用安全姿态管理(ASPM)
867 2
|
XML SQL Java
18项目实战 - IntelliJ IDEA 快速定位到Mapper对应的XML文件
18项目实战 - IntelliJ IDEA 快速定位到Mapper对应的XML文件
407 0
|
Java 关系型数据库 MySQL
【Java I/O 流】对象流:ObjectInputStream 和 ObjectOutputStream
对象流有两个类:ObjectOutputStream 和 ObjectInputStream,其主要作用是将 Java 对象序列化为流数据,或将流数据反序列化为 Java 对象。
280 0
|
供应链 程序员
大厂HR强烈推荐的简历模板
简历,是求职生涯中厚积薄发的成果,是展示自身价值的产品说明书。 一份合格甚至优秀简历,是你的名片,用简练的语言,用直观的数字,将你自身的社会价值清晰体现出来,帮助你更大概率获取心仪岗位的面试机会。
大厂HR强烈推荐的简历模板