遇到大数据处理,你会怎么办?快来看一下位图和布隆过滤器(下)

news2024/12/20 16:23:14

目录

前文

一,为什么有布隆过滤器

二,什么是布隆过滤器

三,布隆过滤器的实现

 四,布隆过滤器的优缺点

4.1 布隆过滤器的优点

 4.2 布隆过滤器的缺点及其改进方式

 4.2.1 查找误判及其改进方式分析

4.2.2 不能删除以及改进方式分析

总结


前文

本文主要讲解一下针对大数据字符串的处理——布隆过滤器,本文主要带领大家深入了解一下布隆过滤器的基本使用,优缺点分析,应用场景,应用案例

一,为什么有布隆过滤器

在我们的日常生活中,关于字符串类型的大数据搜索不在少数,例如游戏注册时,当你输入账号名字时,服务器就需要将账号名字与存储名字的数据库作对比,如果数据库里有,则当前名字已经被使用,则需要重新输入账号。

像上面这种数据库中可能有上亿或者几十亿的数据,用哈希表比对的话,数据都加载不到内存里,而上节内容讲的位图也只能处理整形类型,因此就需要引入新的数据结构——布隆过滤器来处理.

二,什么是布隆过滤器

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间

 首先字符串的映射有一个不可避免的问题:就是字符串的组合过多,如果映射一个位置,极有可能造成冲突,也就是多个不同字符串映射到同一字符串。

而我们的布隆过滤器对次的解决思路是:一个字符串通过不同的哈希函数,映射多个位置,借此来减少冲突,注意是减少冲突,哈希映射的话,字符串的冲突是无法绝对避免的,但是通过这种方法,可以极大可能的减少冲突

有的小伙伴此时可能就会提出疑问,是不是映射的位置越多,冲突的可能性越少?

这个问题可以看一下下面知乎大佬的文章,文章中对布隆过滤器数学分析有详细的描写

详解布隆过滤器的原理,使用场景和注意事项 - 知乎

三,布隆过滤器的实现

对于布隆过滤器的实现,我们以前文的位图为基础进行封装,但是这里要开的空间和位图有些不一样。

 上图中是知乎大佬推出的公式,k为哈希函数的数量,m为布隆过滤器空间大小,n为插入元素个数,p为误报率,我们这里选择的哈希函数为3个,根据公式计算可得,想要误报率保持偏低的水准,至少满足下面的比例

 4.3n=m

因此我们在开辟空间时,需要开辟4.3*N个比特的空间

具体的代码如下

struct BKDRHash
	{
		size_t operator()(const string& s)
		{
			size_t hash = 0;
			for (auto ch : s)
			{
				hash += ch;
				hash *= 31;
			}

			return hash;
		}
	};

	struct APHash
	{
		size_t operator()(const string& s)
		{
			size_t hash = 0;
			for (long i = 0; i < s.size(); i++)
			{
				size_t ch = s[i];
				if ((i & 1) == 0)
				{
					hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
				}
				else
				{
					hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
				}
			}
			return hash;
		}
	};


	struct DJBHash
	{
		size_t operator()(const string& s)
		{
			size_t hash = 5381;
			for (auto ch : s)
			{
				hash += (hash << 5) + ch;
			}
			return hash;
		}
	};




	template<size_t N, class K = string, class Hash1=BKDRHash, class Hash2=APHash, class Hash3=DJBHash>
	class BloomFilter
	{
	public:
		void set(const K& key)
		{
			int len = N * _x;

			//根据三个字符串转换size_t的函数,求三个映射位置并且插入
			size_t hash1 = Hash1()(key) % len;
			_bs.set(hash1);

			size_t hash2 = Hash2()(key) % len;
			_bs.set(hash2);

			size_t hash3 = Hash3()(key) % len;
			_bs.set(hash3);

		}

		bool test(const K& key)
		{
			int len = N * _x;

			size_t hash1 = Hash1()(key) % len;
			size_t hash2 = Hash2()(key) % len;
			size_t hash3 = Hash3()(key) % len;

			//三个映射位置都不为空才存在
			if (_bs.test(hash1)
				&& _bs.test(hash2)
				&& _bs.test(hash3))
			{
				return true;
			}

			return false;

		}

	private:
		static const size_t _x = 5;
		BitSet<N* _x> _bs;
	};

上面的三个哈希函数,是我们在网上找的效率比较高且有效的哈希函数,铁子们也可以用其他的哈希函数。

 四,布隆过滤器的优缺点

4.1 布隆过滤器的优点

1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关
2. 哈希函数相互之间没有关系,方便硬件并行运算
3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势
4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势
5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能
6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算

 4.2 布隆过滤器的缺点及其改进方式

最主要的缺点就是1.查找可能有误判,2.以及不能删除

 4.2.1 查找误判及其改进方式分析

首先为什么会有查找误判呢?

在查找的时候映射的所有位置都不为0,则说明其有可能存在,有一个为0则说明数据一定不存在,为什么说都不为0可能存在呢,我们看一下下面的图

 如上图所示,我们并为插入"饿了么",但是由于其映射的位置刚和和其他多个字符映射的位置重叠,此时查找,布隆过滤器会告诉我们该元素存在,但实际上却不存在

那么有什么改进的方式吗?

进行二次判断,当我们先用布隆过滤器进行查找,如果返回存在,我们在遍历数据库查找该数据,这样和原来直接遍历数据库查找相比,布隆过滤器会帮助我们过滤掉大部分的数据(这也是其过滤意义所在),剩下的小部分数据可能需要到数据库中查找,这样大大减少了我们遍历数据库的次数,极大的提高了效率

4.2.2 不能删除以及改进方式分析

布隆过滤器不能直接删除,因为在删除一个元素时,可能会影响其他元素.(注意布隆过滤器是主要功能用来搜索的,不是用来增删查改的)

当然,如果非要删除自然也有办法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计数器(k个哈希函数计算出的哈希地址)加一,删除元素时,给k个计数器减一,通过多占用几倍存储空间的代价来增加删除操作。

上面的删除方法也有缺陷

1. 无法确认元素是否真正在布隆过滤器中
2. 存在计数回绕

总结

位图和布隆过滤器是专门用来处理大数据文件搜索问题的,他们性能的高效和哈希表相比要高很多,但是各自也有使用场景的限制,铁子们使用时还是应该分析应用场景选择合适的数据结构

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HTML】第 1 节 - HTML 初体验

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 。 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、HTML 概念 2.1、HTML 定义 2.2、标签语法 3、HTML 基本骨架 4、标签的关系 5、注释 6、总结 1、缘起 最近在学习微信小程…

程序员0基础转行大数据年薪25万,只因我做了这件事...

现在我在成都的一家企业做大数据架构师&#xff0c;一个月税前可以拿到20k&#xff0c;还有项目奖金&#xff0c;一年下来最少也能拿25万。生活和工作也都在有条不紊地运转&#xff0c;每天也会有新的挑战&#xff0c;这正是我想要的生活。 01 机械工程专业 但我决定转行互联…

SpringBoot自定义starter之接口日志输出

文章目录 前言文章主体1 项目全部源码2 项目结构介绍3 starter 的使用3.1 配置文件 application,yml的内容3.2 启动类3.3 控制器类 4 测试结果 结语 前言 本文灵感来源是一道面试题。 要求做一个可以复用的接口日志输出工具&#xff0c;在使用时引入依赖&#xff0c;即可使用。…

MySQL数据库 10.DCL操作

目录 &#x1f914; 前言&#xff1a; &#x1f914;DCL介绍&#xff1a; &#x1f914;1.DCL管理用户&#xff1a; 1.查询用户&#xff1a; 图示&#xff1a; 2.创建用户 示例1&#xff1a; 运行结果&#xff1a;​ 示例2&#xff1a; 运行结果&#xff1a;​ 3.修改…

算法修炼之筑基篇——筑基一层中期(解决01背包,完全背包,多重背包)

✨博主&#xff1a;命运之光​​​​​​ &#x1f984;专栏&#xff1a;算法修炼之练气篇​​​​​ &#x1f353;专栏&#xff1a;算法修炼之筑基篇 ✨博主的其他文章&#xff1a;点击进入博主的主页​​​​​​ 前言&#xff1a;学习了算法修炼之练气篇想必各位蒟蒻们的基…

安全——网络安全协议的引入

TCP/IP安全缺陷 信息泄露 概述 网络中投递的报文往往包含账号、口令等敏感信息&#xff0c;若这些信息泄露则是灾难性的后果。其中嗅探是一种常见而隐蔽的网络攻击手段。 嗅探 概述 问题&#xff1a;在共享式网络架构下&#xff0c;所有的数据都是以广播方式进行发送&…

程序员大专毕业,月薪2w是什么体验?

在这个数据驱动的时代&#xff0c;大数据行业的发展前景也非常广阔&#xff0c;我相信我的未来会越来越光明 01 开始学习 是迈向前方的第一步 我是三月&#xff0c;一个来自小城市的大专毕业生。现在在杭州一家公司做大数据开发工程师&#xff0c;目前薪资是20k*13。 我本身…

运维小白必学篇之基础篇第十三集:网络概述中继实验

网络概述中继实验 实验作业&#xff08;主机名为自己的名字&#xff09;&#xff1a; 1、搭建中继环境&#xff0c;要求如下&#xff1a; 网络要求&#xff1a; 内网&#xff1a;192.168.50.50 网关&#xff1a;192.168.50.254 192.168.60.254 外网&#xff1a;192.168.60.60 主…

【论文阅读】An Object SLAM Framework for Association, Mapping, and High-Level Tasks

一、系统概述 这篇文章是一个十分完整的物体级SLAM框架&#xff0c;偏重于建图及高层应用&#xff0c;在前端的部分使用了ORBSLAM作为基础框架&#xff0c;用于提供点云以及相机的位姿&#xff0c;需要注意的是&#xff0c;这篇文章使用的是相机&#xff0c;虽然用的是点云这个…

DevOps该怎么做?

年初在家待了一段时间看了两本书收获还是挺多的. 这些年一直忙于项目, 经历了软件项目的每个阶段, 多多少少知道每个阶段是个什么, 会做哪些事情浮于表面, 没有深入去思考每个阶段背后的理论基础, 最佳实践和落地工具. 某天leader说你书看完了, 只有笔记没有总结, 你就写个总结…

小白必看!轻松理解和解决MySQL幻读问题!

大家好&#xff0c;我是小米&#xff01;今天我来给大家分享一下关于MySQL数据库中常见的一个问题——幻读&#xff0c;以及如何解决它。相信对于数据库开发和管理的小伙伴们来说&#xff0c;幻读是一个相对棘手的问题&#xff0c;但只要我们掌握了正确的解决方法&#xff0c;它…

网络故障管理

网络故障管理是以最快的方式查找、隔离和排除网络故障的过程。故障管理是网络管理的重要组成部分&#xff0c;它通过快速解决故障来最大限度地减少停机时间并防止设备故障&#xff0c;从而确保最佳的网络可用性并防止业务损失。 网络故障监控是故障管理的第一步&#xff0c;因…

Linux Shell脚本攻略

一、echo命令 1、在echo中转义换行符 默认情况下&#xff0c;echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。 echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时&#xff0c;需要使用echo -e "包含转义序列的字符串"这…

有哪些测试框架和工具推荐? - 易智编译EaseEditing

在软件测试领域&#xff0c;有许多测试框架和工具可供选择。以下是一些常见的测试框架和工具的推荐&#xff1a; Selenium: 一个用于自动化Web应用程序测试的流行框架。它支持多种编程语言&#xff0c;并提供丰富的功能和灵活性。 JUnit: 一个用于Java应用程序的单元测试框架…

MongoDB(学习笔记1.0)

最近在学非关系型数据库MongoDB&#xff0c;猛地用起来的真的没关系型数据库方便啊。 首先还是数据库的安装&#xff1a; 安装直接去官网安装即可&#xff0c;官网地址&#xff1a;MongoDB: The Developer Data Platform | MongoDB 当前也有免安装版的&#xff0c;这里就不再…

毕业三年,自学软件测试到就业,我用了4个月

我转行的经历 17年毕业&#xff0c;普通专科&#xff0c;通信专业。 当初选择这个专业是因为有一个校企合作&#xff0c;承诺学生毕业之后给学生安排就业&#xff0c;在学校里面混了三年之后&#xff0c;学校也是履行了当初安排就业的承诺&#xff0c;给我“发配”到了上海&a…

chatgpt赋能python:Python同一行输入

Python同一行输入 在Python编程中&#xff0c;你可能需要在同一行中输入多个命令或语句。这可以通过使用分号来实现。 在本文中&#xff0c;我们将介绍如何在Python中使用同一行输入&#xff0c;并探讨其优缺点。 使用分号实现同一行输入 在Python中&#xff0c;分号&#x…

地震勘探基础(九)之地震速度分析

速度分析 在地震资料数字处理中&#xff0c;速度分析是动校正和水平叠加和地震偏移的基础。 在水平界面情况下&#xff0c;共中心点时距曲线方程是一条双曲线。在共中心点时距曲线中&#xff0c;炮检距 x x x 和时间 t 0 t_0 t0​ 都是已知的&#xff0c;只有速度 v v v 是…

30天从入门到精通TensorFlow1.x 第五天,跨计算设备执行计算图-cpu

一、接前一天 前天学习了&#xff0c;数据流图&#xff0c;今天尝试在不同设备上&#xff08;cpu或者gpu&#xff09;来执行计算图。 本次使用cpu来执行&#xff0c;但是不涉及gpu。gpu放在后面学习&#xff0c;这里比较重要。 二、示例 1. 先看看自己的设备 from tensorfl…

My Note of Diffusion Models

Diffusion Models Links: https://theaisummer.com/diffusion-models/ Markovian Hierachical VAE rvs: data: x 0 x_{0} x0​,representation: x T x_{T} xT​ ( p ( x 0 , x 1 , ⋯ , x T ) , q ( x 1 , ⋯ , x T ∣ x 0 ) ) (p(x_0,x_1,\cdots,x_T),q(x_1,\cdots,x_{T…