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

数据结构 之 【布隆过滤器 的简介】

目录

1.布隆过滤器的概念

2.布隆过滤器的实现

2.1 set

2.2 test

3.布隆过滤器的查找

4.布隆过滤器的删除

5.布隆过滤器优点

6.布隆过滤器缺陷

7.布隆过滤器的应用及哈希切分


1.布隆过滤器的概念

布隆过滤器是用多个哈希函数,将一个数据映射到位图中的概率型数据结构,

特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在

此种方式不仅可以提升查询效率(O(K),K极小),也 可以节省大量的内存空间(比特位存储)

上图就是将一个字符串通过不同的哈希函数映射到不同的哈希地址当中

不同字符串的映射位置难免有交叉

2.布隆过滤器的实现

struct BKDRHash
{size_t operator()(const string& str){size_t hash = 0;for(auto ch : str){hash = hash * 131 + ch;}return hash;}
};struct SDBMHash
{size_t operator()(const string& str){size_t hash = 0;for (auto ch : str){hash = 65599 * hash + ch;//hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  }return hash;}
};struct RSHash
{size_t operator()(const string& str){size_t hash = 0;size_t magic = 63689;for (auto ch : str){hash = hash * magic + ch;magic *= 378551;}return hash;}
};template<size_t N,class T = string,class Hash1 = BKDRHash,class Hash2 = SDBMHash,class Hash3 = RSHash>
class Bloomfilter
{
public:private:bitset<N> _bs;
};

(1)布隆过滤器常用于字符串的映射,参数默认为string

(2)Hash1等是不同哈希字符串算法的仿函数

(1)编译器会在布隆过滤器生成的时候自动去调用biset的构造函数,这里不用显示写

2.1 set

void set(const string& str)
{int hash1 = Hash1()(str) % N;int hash2 = Hash2()(str) % N;int hash3 = Hash3()(str) % N;_bs.set(hash1);_bs.set(hash2);_bs.set(hash3);}

根据不同的哈希函数计算的哈希地址进行映射

2.2 test

bool test(const string& str)
{int hash1 = Hash1()(str) % N;if (_bs.test(hash1) == false)return false;int hash2 = Hash2()(str) % N;if (_bs.test(hash2) == false)return false;int hash3 = Hash3()(str) % N;return _bs.test(hash3);
}

字符串所映射的比特位中,有一个为0,就说明该字符串一定不存在

全为1,只能说明,该字符串可能存在

这是因为该字串所映射的比特位可能与存在的字符串映射的比特位交叉重叠了

3.布隆过滤器的查找

分别计算每个哈希值对应的比特位置存储的是否为零,只要有一个为零,代表该元素一定不在,否则可能存在。

注意:布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可 能存在,因为有些哈希函数存在一定的误判

比如:在布隆过滤器中查找"alibaba"时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其 他元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的

4.布隆过滤器的删除

标准布隆过滤器的实现不支持删除操作,这是因为删除操作是将比特位1置为0,但是我们不知道删除数据所对应的比特位涉及哪些其他的数据,贸然删除会影响其它数据的存在性

一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器(如8位整数)

插入元素时,给k个计 数器(k个哈希函数计算出的哈希地址)加一,

删除元素时,给k个计数器减一,

查询元素时,若所有k个位置的计数器均>0,则元素“可能存在”;否则“绝对不存在”

通过多占用几倍存储 空间的代价来增加删除操作

缺陷: 1. 无法确认元素是否真正在布隆过滤器中

2. 存在计数回绕(8位整数的范围0-255,若已经有了255次,再加1即溢出为0)

5.布隆过滤器优点

1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无 关

2. 哈希函数相互之间没有关系,方便硬件并行运算

3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势

4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势

5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能

6. 使用同一组散列函数的布隆过滤器可以进行交、并运算

  • 并集:位数组按位或操作,时间复杂度O(m)
  • 交集:位数组按位与操作,时间复杂度O(m)

6.布隆过滤器缺陷

1. 有误判率,即不能准确判断元素是否在集合中

补救方法:再 建立一个白名单,存储可能会误判的数据

2. 不能获取元素本身

3. 一般情况下不能从布隆过滤器中删除元素

4. 如果采用计数方式删除,可能会存在计数回绕问题

7.布隆过滤器的应用及哈希切分

1.给两个文件,分别有100亿个query,我们只有1G内存,

如何找到两个文件交集?分别给出 精确算法和近似算法

近似算法:用布隆过滤器a标记A文件的query,遍历文件B的Query,若布隆过滤器a返回"可能存在",则记录为交集(可能有重复的query,当然也存在误判)

精确算法:按照相同的哈希函数,将两个文件A、B切分成若干个小文件,将对应的小文件堆到内存中使用unordered_set进行精确查找

哈希切分就是通过哈希函数将大文件切分为小文件的过程
相同的query一定会被分配到对应的小文件中(A0-B0、A1-B1、A2-B2......)

当然,这里并不是平均切分,某些小文件仍可能会过大

文件为5G,有两种情况:

1、4G数据相同、1G冲突

2、大多数数据冲突

怎么区分这两种情况呢?

解决方法:使用unordered_set存储数据,当程序抛出bad_alloc异常的时候,

说明是情况2,需要再切分,否则不需要

2.给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,如何找到top K的IP?

问题一:
哈希切分后,使用unordered_map统计文件中的Ip地址的出现次数,统计完一个文件,使用变量标记该IP地址及其次数,持续进行统计次数、更新变量的操作

问题二:

哈希切分后,使用unordered_map统计文件中的Ip地址的出现次数,边统计边更新小堆,持续进行统计次数、更新小堆的操作


文章转载自:

http://iN37xp54.yswxq.cn
http://2qMaOmfM.yswxq.cn
http://i431XHdW.yswxq.cn
http://vpz5LP36.yswxq.cn
http://rNX4T05v.yswxq.cn
http://8NMcHtgS.yswxq.cn
http://P5QkviO5.yswxq.cn
http://RwWrvUc8.yswxq.cn
http://ZM7LQyPa.yswxq.cn
http://H8ahvt14.yswxq.cn
http://np6Ntn4c.yswxq.cn
http://MjOry3Rp.yswxq.cn
http://BMaUPpke.yswxq.cn
http://UYeFnhrt.yswxq.cn
http://KldY8mPg.yswxq.cn
http://sqngFqde.yswxq.cn
http://aEpa34Er.yswxq.cn
http://m38NTA1e.yswxq.cn
http://IhZywOEy.yswxq.cn
http://0BW34Xxa.yswxq.cn
http://OAvVcCJY.yswxq.cn
http://XPbo5zLv.yswxq.cn
http://4h3jzQLx.yswxq.cn
http://RwgvVX5Z.yswxq.cn
http://XxcE0UrH.yswxq.cn
http://JHTInBdg.yswxq.cn
http://eZX78tn7.yswxq.cn
http://9SUTOUBW.yswxq.cn
http://RbdVDCTZ.yswxq.cn
http://yXzWXCFK.yswxq.cn
http://www.dtcms.com/a/376960.html

相关文章:

  • 《sklearn机器学习——数据预处理》归一化
  • 网络编程(7)
  • 嘉立创EDA从原理图框选住器件进行PCB布局
  • 浅谈代理流程自动化 (APA)
  • 图论3 图的遍历
  • MySQL内核革新:智能拦截全表扫描,百度智能云守护数据库性能与安全
  • 从0°到180°,STM32玩转MG996R舵机
  • Openresty Tracing 最佳实践
  • 少儿舞蹈小程序(12)作品列表查询搭建
  • 机器学习投票分类
  • Python Web工程之Flask项目中添加健康检查
  • javaEE-Spring IOCDI
  • 《常见关键字知识整理》
  • C++中的单例模式的实现
  • 淘宝闪购基于FlinkPaimon的Lakehouse生产实践:从实时数仓到湖仓一体化的演进之路
  • 云手机怎样进行自动化运行?
  • FPGA入门-状态机
  • 【Python Tkinter 】图形用户界面(GUI)开发及打包EXE指南
  • 工作效率翻倍!Excel多文件合并工具
  • 【Pywinauto库】8.4 pywinauto.timings模块
  • 4.7 静态分支, 动态分支和变体
  • LangGraph中ReAct模式的深度解析:推理与行动的完美融合——从理论到实践的智能Agent构建指南
  • 【机械故障】使用fir滤波器实现数据拟合
  • vue3 中 npm install mammoth 与 npm install --save mammoth 的主要区别说明
  • Milvus基于docker主机外挂实践
  • 从零搭建企业级日志系统:Web + App 全端解决方案实战!
  • 【算法--链表】138.随机链表的复制--通俗讲解
  • Nodejs(③Stream)
  • iOS 26支持的设备列表
  • 日记 - 2025.9.10 读研日记(一)