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

目录

前文

一,为什么有布隆过滤器

二,什么是布隆过滤器

三,布隆过滤器的实现

 四,布隆过滤器的优缺点

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://xiahunao.cn/news/352084.html

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

相关文章

5月VR大数据:Quest 2下跌超1%,其它变化不大

Hello大家好&#xff0c;每月一期的VR内容/硬件大数据统计又和大家见面了。 想了解VR软硬件行情么&#xff1f;关注这里就对了。我们会统计Steam平台的用户及内容等数据&#xff0c;每月初准时为你推送&#xff0c;不要错过喔&#xff01; 本数据报告包含&#xff1a;Steam VR硬…

如何打开谷歌地图

1、入口是map.cnmaps.cn是镜像过来的谷歌地图 2、把网站改成。www.google.cn//maps/ ①&#xff1a;map.cnmaps.cn ②&#xff1a;www.google.cn//maps/

BIGEMAP中打开高清卫星影像谷歌地图

说明&#xff1a;批量添加可以同时添加多个在线地图&#xff0c;一次性添加完成 下载安装地球软件&#xff1a; www.bigemap.com 选择立即下载 第一步 &#xff1a; 下载批量添加批处理文件&#xff1a;添加文件 第二步&#xff1a; 查看文件&#xff0c;打开一个txt文件&am…

arcgis加载谷歌地图和天地图

1加载谷歌地图 bug&#xff1a;科学上网和弹窗 1.1.下载插件arcgoogle 选择合适的版本下载链接 1.2.安装软件 双击setup.exe进行安装 1.3.加载工具 自定义>从文件添加……>arcgoole.tlb 1.4.加载地图 右键软件空白&#xff0c;勾选ArcGoogle-ungdungmoi.com&am…

谷歌地图网页版_如何在网站嵌入谷歌地图

为何要在外贸网站嵌入谷歌地图?而不用国内常用地图? 1、国外用户常用工具(老外常用地图软件) 2、嵌入地图为动态,可放大缩小,定位区域 3、用户查看更生动 4、嵌入谷歌地图代码可以根据浏览器语言,自动识别显示对应国家语言,用户体验度高 操作步骤 1、打开Google地图 具体…

集成谷歌地图不显示的问题

最近做了一个项目&#xff0c;要用到谷歌地图&#xff0c;这也是第一次用谷歌地图&#xff0c;当按照文档集成以后&#xff0c;地图就是不显示。最后鼓捣半天&#xff0c;终于出来了。希望能帮助入坑的小伙伴。由于谷歌地图是国外服务器&#xff0c;想必大家都会想办法登录谷歌…

目标检测算法:YOLO v1论文解读

目标检测算法&#xff1a;YOLO v1论文解读 前言 ​ 其实网上已经有很多很好的解读各种论文的文章了&#xff0c;但是我决定自己也写一写&#xff0c;当然&#xff0c;我的主要目的就是帮助自己梳理、深入理解论文&#xff0c;因为写文章&#xff0c;你必须把你所写的东西表达清…

html加入谷歌地图,html页面插入百度谷歌地图

一、百度地图 1、打开“百度地图生成器”的网址&#xff1a;http://api.map.baidu.com/lbsapi/creatmap/index.html 2、在“1.定位中心点”中&#xff0c;查找具体位置 3、在“2.设置地图”中&#xff0c;按照自己的需求修改地图的外观&#xff1a; a、地图的宽和高 b、地图上显…

怎么在html插入谷歌地图,html页面插入百度or谷歌地图

一、百度地图 1、打开“百度地图生成器”的网址&#xff1a;http://api.map.baidu.com/lbsapi/creatmap/index.html 2、在“1.定位中心点”中&#xff0c;查找具体位置 3、在“2.设置地图”中&#xff0c;按照自己的需求修改地图的外观&#xff1a; a、地图的宽和高 b、地图上显…

安卓谷歌地图 Google Maps不显示地图

问题 一个用到 Google Maps API 的安卓项目&#xff0c;在A电脑上build后&#xff0c;正常运行&#xff0c;显示地图&#xff0c;而且可以正常定位&#xff0c;将项目拷贝到B电脑上后&#xff0c;重新build&#xff0c;不能正常运行&#xff1a;不显示地图&#xff0c;地图界面…

百度二级网页打不开_网页打不开,原因在这里!

不知道小伙伴们&#xff0c;有没有遇到这样的问题&#xff0c;网络明明没问题&#xff0c;QQ等工具也可以正常登陆&#xff0c;就是有一部分网页打不开&#xff01; 打不开一般就俩原因&#xff1a; 1.网站服务器出问题了&#xff0c;网页访问不了&#xff01; 2.DNS问题&#…

基本农田卫星地图查询_谷歌地图打不开?试试这个替代网站,街景功能很好用!...

现在,谷歌地图在国内无法访问。大家如果想要查询国外的地理位置等信息,就必须要靠谷歌地图来解决。像百度、高德这些地图查询国内的信息还不错,但是要查国外的内容就没办法实现了。 全球地图/图:allinprior.com 谷歌地图有很多强大的功能,比如去国外旅游,首先得查询国外的…

谷歌地图开发使用记录 Google Maps

谷歌地图开发文档 申请谷歌地图密钥 可参考此链接https://blog.csdn.net/edsoki/article/details/123391685 https://www.wppop.com/get-google-api-key.html 引入 <script src"https://maps.googleapis.com/maps/api/js?key密钥&languageen"></script…

谷歌地图打不开怎么办?

谷歌地图打不开怎么办&#xff1f; 方法一&#xff1a;使用在线版google地图,点击下方链接进入 天天看地图 https://www.tiantianditu.com/3d.html 方法二&#xff0c;使用奥维地图&#xff0c;打开google图层 打开google图层需要3个步骤&#xff0c;1&#xff0c;下载奥…

实现UDP通信(socket接口函数扩展)

一、write/read到send/recv 函数原型&#xff1a; ussize_t send(int sockfd, const void *buf, size_t len, int flags);//发送 ussize_t recv(int sockfd, void *buf, size_t len, int flags);//接收 前三个参数同read/write一样&#xff1b; ussize_t read(int fd, voi…

预制菜进击万亿市场,谁能更快上桌“吃菜”?

文 | 螳螂观察 作者 | 图霖 消费行业很少有可持续的风口&#xff0c;这两年的预制菜算其中一个。 艾媒咨询发布的行业预测显示&#xff0c;2026年我国预制菜市场规模有望达到10720亿元。 过去这一年&#xff0c;武汉、大同等地已相继召开了预制菜相关的产业峰会。峰会规模有…

玩转ChatGPT:制作AI播报视频

一、写在前面 羊了几天&#xff0c;上线就发现&#xff0c;GPT的第三方插件的数量越来越多&#xff0c;使得官方推出了搜索功能&#xff1a; 我逛了一圈&#xff0c;发现这个插件挺有意思&#xff0c;用来生成AI语音播报视频的。 下面给大家尝尝鲜。 二、实战过程 &#xff0…

halcon入门之_提取遥控器字符并且写入txt文本

*老生常谈 read_image (Image, a) rgb1_to_gray (Image, GrayImage) dev_display (GrayImage) * 首先要把它转化为灰度图,在机器视觉中,大部分的图像处理算子都是建立在灰度图上的,所以gray(灰度图)是标志性存在的*转化为灰度图后,就要进入正式的图像处理了,先来一波阈值分割au…

ts泛型 不能将类型“string”分配给类型“U”。 “U”可以使用与“string”无关的任意类型进行实例化。

function cyc<T,U>(msg:T):U{let str:string"你输入了:";strmsg;return str; } var logcyc<string,string>("1"); console.log(log) var log1cyc<number,string>(2); console.log(log1) 报错如下 不能将类型“string”分配给类型“U”…

富文本编辑器 wangeditor 的使用

富文本编辑器 wangeditor 的使用 为什么选择使用 wangeditor a. 轻量、简洁、界面美观、文档齐全、易用、开源免费、开源团队维护、有专业Q群答疑、持续更新、无需使用其他库。插件功能基本符合我们目前的业务需求 b. 相比较于TinyMCE一类的编辑器&#xff0c;中文文档入门简单…