[C++]哈希应用-布隆过滤器快速入门

布隆过滤器

布隆过滤器(Bloom Filter)是一个由布隆在1970年提出的概率型数据结构,它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器的主要特点是高效的插入和查询,可以用于检索一个元素是否在一个集合中。

原理:

  • 布隆过滤器是采用位图的方式来记录数据的存在与否
  • 将要存储的数据同时映射到位图的多个节点上
  • 当寻找数据时,只需将要找的数据进行映射,观察全部映射节点的情况,就可以判断数据存在与否

其核心功能如下(此处以数据库使用布隆过滤器为例):

在这里插入图片描述

解释:

对于一个数据的查找,会先去布隆过滤器中进行多个映射点的查询。会有如下情况发生:

  1. 只有当每个映射点都存在(对应位置为1)的时候,才能说明该数据可能存在,下一步就去Database中进一步确认(因为冲突的原因,所以可能某个数据的每个映射点虽然都为1,但是该数据并不存在其中)。
  2. 如果有任何一个映射点不存在(对应位置为0)的时候,就说明该数据并不在存储空间内。

如何选择映射

布隆的核心就是最大限度减少冲突问题,进而在高查找效率的情况下,减少寻找错误的可能性!

现在提出一个问题:如果我只采用一个映射(每个数据只映射到一个位图节点上),由于哈希的局限性以及开辟空间的有限性,就会出现多个数据映射到同一个位置上

所以布隆过滤器就采用了多映射的方案(即一个值映射到多个位图节点上),大大缩小了冲突的可能性

优点:

  1. 多于不同的数据,他们在某个哈希函数下可能映射到了同一个位置,但是对于多个映射全相同的概率极小,这就使得哈希冲突变小
  2. 由于数据的查询一般采用轮询的方式(或者树形结构)导致时间复杂度较大,而布隆过滤器的查询效率是大O(1)(忽略极个别的全冲突情况)

缺点:

  1. 不存在漏报,但存在误报(即对于数据存在的判断有失准确性)。但严格来说该缺点不算大事
  2. 不能在布隆过滤器中删除元素,因为这会影响到别的与该位图节点有关联的数据(但可以改造他,使他可以实现删除操作)

哈希函数的选择:

可以采用BKDRAP等哈希函数

选择的哈希函数的前提是:需要保证映射后的值能合理放到位图中的对应位置上(如果你映射出来一个:164gxap3,那么你该放入位图中的哪个位置呢?是吧)

应用场景

  1. 快速检索元素:布隆过滤器能够快速地检索一个元素是否在一个集合中,而无需访问整个集合。这大大提高了查询效率,尤其是在处理大数据集时。
  2. 网页URL去重:在搜索引擎或爬虫系统中,布隆过滤器可以用于过滤已经访问过的网页URL,避免重复访问和存储。
  3. 垃圾邮件过滤:布隆过滤器可以存储已知的垃圾邮件发送者的地址或特征,当接收到新邮件时,可以通过检查邮件地址或内容是否在布隆过滤器中来判断其是否为垃圾邮件。
  4. 数据库查询优化:在数据库中,布隆过滤器可以用于减少不必要的磁盘查找操作。例如,当查询一个不存在的行或列时,布隆过滤器可以快速判断该数据是否存在于数据库中,从而避免不必要的磁盘访问。
  5. 恶意代码检测:在网络安全领域,布隆过滤器可以用于检测恶意代码的僵尸网络或分析不断变化的市场数据。通过存储已知的恶意代码特征或行为模式,布隆过滤器可以快速判断新发现的代码是否为恶意代码。
  6. 生物信息学应用:布隆过滤器可以用于快速查找DNA测序数据中的基因序列,以及在其他生物学和遗传学领域如蛋白质组学、转录组学和基因组学等进行数据分析。
  7. 非结构化大数据分析:在企业数据分析中,布隆过滤器可以帮助企业快速检测网站中的指定元素(如URL中的关键字、用户搜索的关键字等),从而找出其中的趋势和模式,帮助企业更好地投资和发展。
  8. 机器学习应用:在机器学习领域,布隆过滤器可以用于快速处理海量数据,提取特征并构建模型。由于布隆过滤器的快速查询能力,它可以大大提高模型训练和预测的效率。

代码实现以及成果演示

存储的元素:“hello”, “world”, “你好”, “no thank”, “why”, “4”, “-78”

查找的元素:“world”,“你好”,“早上好”,“no thank”,“8”,“4”,“0”,“-78”

分别采用了BKDR、AP、DJB三个哈希函数

uint64_t BKDR_Hash(const char* str) {uint64_t seed = 131; // 31 131 1313 13131 131313 etc..  uint64_t hash = 0;while (*str) {hash = hash * seed + (*str++);}return hash;
}
uint64_t AP_Hash(const char* str)
{uint64_t hash = 0;int i;for (i = 0; *str; i++){if ((i & 1) == 0){hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));}else{hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));}}return (hash & 0x7FFFFFFF);
}
uint64_t DJB_Hash(const char* str)
{uint64_t hash = 5381;while (*str){hash += (hash << 5) + (*str++);}return (hash & 0x7FFFFFFF);
}
int main()
{bitset<10000> st;vector<string> vstr{"hello", "world", "你好", "no thank", "why", "4", "-78"};for (int i = 0; i < vstr.size(); i++){st.set(BKDR_Hash(vstr[i].c_str()) % st.size());st.set(AP_Hash(vstr[i].c_str()) % st.size());st.set(DJB_Hash(vstr[i].c_str()) % st.size());}vector<string> vfind{"world","你好","早上好","no thank","8","4","0","-78"};for (int i = 0; i < vfind.size(); i++){cout << vfind[i];if (st[BKDR_Hash(vfind[i].c_str()) % st.size()]&& st[AP_Hash(vfind[i].c_str()) % st.size()]&& st[DJB_Hash(vfind[i].c_str()) % st.size()]){cout << " exist" << endl;}else{cout << " not exixt" << endl;}}return 0;
}

查找结果:

world exist
你好 exist
早上好 not exixt
no thank exist
8 not exixt
4 exist
0 not exixt
-78 exist

优化成可实现删除操作

对于前面的布隆过滤器的写法,有一个很明显的问题:对于数据的删除是不可实现的,因为对任意一个数据映射位置的删除,由于哈希冲突,都可能导致影响到别的数据的映射关系

所以我们采用引用计数+扩展位图的方式来实现删除操作,具体操作如下:

采用引用计数的方案,对每一个哈希映射值都采用引用计数。每新增一个映射关系就++,减少一个映射关系就- -

如此一来,对位图也需要有所更改:增大位图空间开销,比如用8个bit表示一个映射关系,而在这8个bit中就可以用引用计数实现0-255的可映射数量

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

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

相关文章

Springboot整合飞书向群组/指定个人发送消息/飞书登录

Springboot整合飞书向群组发送消息 飞书开放平台创建企业自建应用 添加应用能力-机器人 创建完成后&#xff0c;进入应用详情页&#xff0c;可以在首页看到 App Id 和 App Secret 在飞书pc端创建一群机器人 此处可以拿到该机器人的webhook地址,通过https的方式,也可以调用发送…

JavaEE企业级开发中常用的JDK7和JDK8的时间类

JDK7时间类 全世界的时间有一个统一的计算标准 在同一条经线上的时间是一样的 格林威治时间 简称GMT 计算核心 地球自转一天是24小时 太阳直射正好是12小时 但是误差太大 现在用原子钟来代替 用铯原子震动的频率来计算时间&#xff0c;作为世界的标准时间UTC 中国标准时间…

Spring-依赖注入的处理过程

前置知识 1 入口 DefaultListableBeanFactory#resolveDependency 2 每个依赖都有对应的DependencyDescriptor 3 自定绑定候选对象处理器AutowireCapableBeanFactory 注入处理 我们可以看到AutowireCapableBeanFactory中有两个方法&#xff1a; 第一个是单个注入&#xff1a;…

2024蓝桥杯CTF writeUP--cc

给了个网页&#xff0c;里面有加密算法&#xff0c;密钥&#xff0c;密文 使用在线解码工具 CTF最全在线工具整理_在线ctf工具-CSDN博客 将输出的密文&#xff0c;密钥&#xff0c;vi&#xff0c;加密方式一一对应

谈谈IP地址

IP地址 IP地址概念动态分配 IP(DHCP)NAT机制(网络转换机制)IPv6 IP地址组成特殊的IP地址 IP地址 IP协议报文结构: 概念 IP地址: 描述了主机的具体位置.有32位,利用点分十进制的方式来表示.例如: 192.168.190.77 32位ip地址表示的数据非常有限,42亿九千万…, 那么ip地址不够用…

学QT的第三天~

ikun登录界面完善 #include "mywidget.h" void MyWidget::bth1() { if(edit3 ->text()"520cxk"&&edit4 ->text()"1314520") { //1.实例化一个QmessageBox类的对象 QMessageBox box(QMessageBox::Information, //图标 "恭喜…

数据结构与算法(5)队列的基本操作

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef int ElemType; #define MaxSize 10//队列的定义 typedef struct SqQueue {ElemType data[MaxSize];int front, rear;//front为头指针&#xff0c;rear为尾指针。这里并不是真正的“指针”…

嵌入式数据库SQLite 3配置使用详细笔记教程

0、惨痛教训 随着管理开发的项目体积越来越庞大&#xff0c;产品系统涉及的数据量也越来越多&#xff0c;并且伴随着项目不久就要交付给甲方了。如果项目的数据信息没有被妥善管理&#xff0c;后期设备的运行状态、操作状况等数据流信息不能被溯源&#xff0c;当出现了一些特殊…

python:画饼图

我现在因工作需要在写一篇中文文章&#xff0c;领导要我用python处理数据和画图&#xff0c;那我也刚好学习一下python画图。 import matplotlib.pyplot as plt # 饼图数据 labels [A, B, C, D] sizes [15, 30, 45, 10] # 每个部分的大小 # 绘制饼图 plt.figure(figsize(6,…

紧跟生成式AI暴雨发布新时代推理服务器

近日&#xff0c;暴雨发布最新训推一体AI服务器&#xff0c;以大容量内存和灵活的高速互连选项满足各种AI应用场景&#xff0c;最大可能支持扩展插槽&#xff0c;从而大幅提升智能算力性能&#xff0c;以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AIG…

软考系列必过资料分享-系统架构师-系统分析师-信息系统项目管理师

建议,写在前面 知识点是公用的,原则上不分新旧。每年会有少部分的题目切合当前时间段&#xff08;也是通过旧的知识演变的&#xff09; 信息系统项目管理师证书 系统架构师证书 系统分析师证书 资料分享 关注公众号 回复 信息系统项目管理师资料 即可获取信息系统项目管理师资…

【RAG 论文】Dense X 检索:将“命题”作为检索粒度

论文&#xff1a;Dense X Retrieval: What Retrieval Granularity Should We Use? ⭐⭐⭐⭐ Code: github.com/ct123098/factoid-wiki 文章目录 一、论文速读二、命题&#xff08;Proposition&#xff09;三、FactoidWiki四、实验及分析4.1 Passage Retrieval 任务4.2 Open-Do…

VSCode-vue3.0-安装与配置-export default简单例子

文章目录 1.下载VSCode2.修改语言为中文3.辅助插件列表4.vue3模板文件简单例子5.总结 1.下载VSCode 从官网下载VSCode&#xff0c;并按下一步安装成功。 2.修改语言为中文 点击确认修改&#xff0c;如下图所示&#xff1a; 或者打开命令面板&#xff1a;输入Configure Displ…

党建教育vr虚拟现实展厅真正实现了绿色、低碳的展示方式

在数字化浪潮席卷的今天&#xff0c;传统企业门户官网已难以满足企业日益增长的展示需求。面对这一挑战&#xff0c;北京华锐凭借深厚的行业经验和领先的技术实力&#xff0c;为您提供全新的元宇宙虚拟展厅制作服务&#xff0c;助您轻松打破现实与虚拟的界限&#xff0c;开启企…

如何让vim支持python3

首先删除旧的vim。 sudo apt-get remove vim //输入re按下tab直接显示remove sudo apt-get remove vim-runtime sudo apt-get remove vim -tiny sudo apt-get remove vim-common 然后下载vim8源码&#xff1a; git clone https://github.com/vim/vim.git 进行编译安装…

【NodeMCU实时天气时钟温湿度项目 5】获取关于城市天气实况和天气预报的JSON信息(心知天气版)

| 今天是第五专题内容&#xff0c;主要是介绍如何从心知天气官网&#xff0c;获取包含当前天气实况和未来 3 天天气预报的JSON数据信息。 在学习获取及显示天气信息前&#xff0c;我们务必要对JSON数据格式有个深入的了解。 如您需要了解其它专题的内容&#xf…

C语言----杨辉三角

各位看官们好。学习到这里想必大家应该对C语言的了解也是很深刻的了吧。但是我们也不能忘记我们一起学习的知识啊。在我们以前学习C语言的时候我想大家应该都听说过杨辉三角吧。虽然我们把其中的规律找到那么这个代码就简单很多了。那么接下里我们就来讲讲杨辉三角。 首先我们先…

sql 注入 1

当前在email表 security库 查到user表 1、第一步&#xff0c;知道对方goods表有几列&#xff08;email 2 列 good 三列&#xff0c;查的时候列必须得一样才可以查&#xff0c;所以创建个临时表&#xff0c;select 123 &#xff09; 但是你无法知道对方goods表有多少列 用order …

场外期权个股怎么对冲?

今天期权懂带你了解场外期权个股怎么对冲&#xff1f;场外个股期权是一种在非交易所市场进行的期权交易&#xff0c;它允许投资者针对特定的股票获得未来买入或卖出的权利。 场外期权个股怎么对冲&#xff1f; 持有相反方向的期权&#xff1a;这是最直接的对冲方法&#xff0c…

Elasticsearch中的三种分页策略深度解析:原理、使用及对比

码到三十五 &#xff1a; 个人主页 在Elasticsearch中&#xff0c;分页是查询操作中不可或缺的一部分。随着数据量的增长&#xff0c;如何高效地分页查询数据急需需要面对的问题。Elasticsearch提供了三种主要的分页方式&#xff1a;from size、scroll和search_after。下面详细…