【【哈希应用】位图/布隆过滤器】

位图/布隆过滤器

  • 位图
    • 位图概念
    • 位图的使用
    • 位图模拟实现
  • 布隆过滤器
    • 布隆过滤器概念
    • 布隆过滤器的使用
    • 布隆过滤器模拟实现
  • 位图/布隆过滤器应用:海量数据处理
    • 哈希切分

位图

位图概念

计算机中通常以位bit为数据最小存储单位,只有0、1两种二进制状态,这决定了位可以用来保存某一项条件yes/no的信息,且这种方式是占用系统内存最小的方式。因此,C++中标准库提供bitset类,以位bit为最小单位,存储数据,主要用于提供位级别的操作。

位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。

位图的使用

初始化bitset,初始化同时给定bit的个数n在这里插入图片描述

bitset<16> foo;
bitset<16> bar(0xfa2);
bitset<16> baz("0101111001"); //从右往左读取,如果字符串长度小于n位数,补0
foo: 0000000000000000
bar: 0000111110100010
baz: 0000000101111001

bitset操作汇总
在这里插入图片描述

位图模拟实现

template<size_t N>
class bitset {bitset(){_bt.resize(N / 8 + 1,0);}//将x位设位1void set(size_t x){size_t i = x / 8;size_t j = x % 8;_bt[i] |= (1 << j);}//将x位设位0void reset(size_t x){size_t i = x / 8;size_t j = x % 8;_bt[i] &= ~(1 << j);}//查询x在不在bool test(size_t x){size_t i = x / 8;size_t j = x % 8;return _bt[i] & (1 << j);}
private:vector<char> _bt;
};
//海量数据处理时
void BitSetTest()
{// 开出42亿9千万个比特位bitset<-1> bs1;	bitset<0xffffffff> bs2;
}

布隆过滤器

布隆过滤器概念

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

与位图的区别:
布隆过滤器:布隆过滤器主要用于快速地判断一个元素是否可能存在于数据集合中。可能存在一定的误判率
位图:位图主要用于精确地判断一个整数是否存在于集合中。它可以不会出现误判

在这里插入图片描述

布隆过滤器的使用

初始化
布隆过滤器使用一个长度为m的位图,并初始化所有位为0。同时,需要选择k个不同的哈希函数。

插入
当要将一个元素加入到布隆过滤器时,对该元素进行k次哈希计算,得到k个哈希值(通常是整数)。然后将位数组中对应的k个位置设置为1。
在这里插入图片描述

查询
布隆过滤器进行k次哈希计算,得到k个哈希值。
若其中有任何一个位置为0,则可以确定该元素一定不存在于布隆过滤器中;否则,可能存在(这里存在着一定的误判率,因不同的元素可能存在相同的哈希值,导致位图中相同位置表示了不同的元素存在情况)
在这里插入图片描述
删除
布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素。
优化:将布隆过滤器中的每个bit位扩展成一个小的计数器,插入元素时,哈希函数计算后为k个位置,给该位置的计数器+1,删除元素时,元素相应位置计数器-1,通过多占用几倍存储空间的代价来增加删除操作。

注意事项:

哈希函数的选择:哈希函数应该能够均匀地分布哈希值,以最大程度减少冲突的可能性。
位数组的大小:位数组的长度m和哈希函数的个数k会直接影响布隆过滤器的误判率。通常情况下,m的大小与预期存储元素数量和容忍的误判率有关。
误判率:布隆过滤器存在一定的误判率,即可能判断某个元素存在于布隆过滤器中,但实际上并不存在。这是由于不同元素在位数组上可能发生冲突的原因。

布隆过滤器模拟实现

template<size_t N,size_t X = 5,class K = string,
class HashFunc1 = BKDRHash,
class HashFunc2 = APHash,
class HashFunc3 = DJBHash>
class BloomFilter
{
public:void Set(const K& key){size_t len = X*N;size_t index1 = HashFunc1()(key) % len;size_t index2 = HashFunc2()(key) % len;size_t index3 = HashFunc3()(key) % len;_bs.set(index1);_bs.set(index2);_bs.set(index3);}bool Test(const K& key){size_t len = X*N;size_t index1 = HashFunc1()(key) % len;if (_bs.test(index1) == false)return false; //准确的size_t index2 = HashFunc2()(key) % len;if (_bs.test(index2) == false)return false;  //准确的size_t index3 = HashFunc3()(key) % len;if (_bs.test(index3) == false)return false;  //准确的return true;  // 存在误判的}// 不支持删除,删除可能会影响其他值。void Reset(const K& key);
-private:bitset<X*N> _bs;

位图/布隆过滤器应用:海量数据处理

位图的应用

快速查找某个数据是否在一个集合中

1.给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】
解答:
1G=2^30=10亿bytes
40亿个int=160亿bytes=16G
数据量非常大,占用内存空间高,用位图可以减少占用内存空间
数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:

在这里插入图片描述

2.给定100亿个整数,设计算法找到只出现一次的整数?
用两个位图表示,可以表示的组合有:

组合出现次数
000
011
102
113次以上

统计位图中存的是01的数即为所求

求两个集合的交集、并集

3.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
初始思路:一个文件所有值映射,读取另一个文件,判断在不在
问题:文件中可能存在多个相同的元素,得出的交集需要去重,耗费时间。
优化:两个文件两个位图,对应位置&运算,结果为1的该位置代表的元素是交集

操作系统中磁盘块标记

布隆过滤器应用
在这里插入图片描述
给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?给出精确算法
精确算法:
假设每个query占30个字节,则上面每个文件有3000亿字节==300G,文件很大,我们可以先将它们分成若干小文件,每个小文件之间找交集。
我们使用哈希切割来分割文件。
在这里插入图片描述
这样,相同的query一定进入标号相同的小文件。我们只需分别求两个标号相同小文件的交集。接下来,用set找交集,读出Ai,放到set,读Bi看在不在set,不在则删去。

哈希切分

哈希切分在数据库和分布式系统中经常被使用。以下是一些常见的情况,可以考虑使用哈希切分:

1.数据库分片:当数据库数据量巨大而单个数据库服务器无法承载时,可以将数据划分成多个分片,并使用哈希函数将数据分配到不同的分片中。这样可以提高数据库的可扩展性和性能。

2.负载均衡:在分布式系统中,使用哈希切分可以实现负载均衡。根据请求的特定属性(如客户ID、请求URL等),通过哈希函数计算得到一个标识符,然后利用该标识符选择相应的服务器来处理请求,从而使负载分布更加均匀。

3.分布式缓存:在分布式缓存系统中,使用哈希切分可以将数据分散存储到多个缓存节点中,从而提高缓存容量和读取性能。通过哈希函数计算数据的键值,然后将数据存储到相应的节点上。

需要注意的是,在使用哈希切分时,要确保哈希函数具有良好的均匀性和随机性,以避免数据倾斜和热点问题。此外,由于哈希切分可能引入数据迁移和一致性问题,需要谨慎设计和实施。

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

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

相关文章

通过requests库使用HTTP编写的爬虫程序

使用Python的requests库可以方便地编写HTTP爬虫程序。以下是一个使用requests库的示例&#xff1a; import requests# 发送HTTP GET请求 response requests.get("http://example.com")# 检查响应状态码 if response.status_code 200:# 获取响应内容html response.…

JDBC-Java程序连接关系型数据库的技术,ORM编程思想

一、JDBC介绍&#xff1a; 1.操作数据库的方式 1.通过命令行的方式操作mysql服务&#xff0c;cmd通过命令操作 2.通过图形化界面操作mysql服务&#xff0c;例如navicat软件 3.通过java程序连接操作mysql数据库&#xff0c;使用jdbc技术 2.什么是JDBC JDBC(Java Data Base Con…

ICC2: 如何在显示GUI操作产生的命令

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ICC2&#xff1a;自定义快捷键和菜单 VIEW -> Perference -> Global Settings 把display commands in logging console 下面几个都勾上即可。

PicoDiagnostics (NVH设备软件)-Mongoose识别不了VIN码

如果Mongoose J2534诊断线识别不到车辆的VIN码&#xff0c;通常在PD软件中会像下图那样提示。 遇到这种情况&#xff0c;首先确保你的电脑是否已经安装J2534驱动&#xff1a;打开【设备管理器】&#xff0c;如果你将示波器和Mongoose J2534诊断线连接到电脑&#xff0c;【设备管…

C语言数组首地址学习1

C语言数组名也是数组首地址&#xff1b;数组首地址&#xff0c;也就是数组首元素地址&#xff1b; 数组首地址也可以用第0个元素加&表示&#xff0c;数值a的首地址是&a[0]&#xff1b; #include <stdio.h> int main(){int nums[5];int i;//从控制台读取用户输…

云服务器 centos 部署 code-server 并配置 c/c++ 环境

将你的云服务器改为 centos 8 为什么要将云服务器的操作系统改成 centos 8 呢&#xff1f;原因就是 centos 7 里面的配置满足不了 code-server 的需求。如果你使用的是 centos 7 那么就需要你升级一些东西&#xff0c;这个过程比较麻烦。我在 centos 7 上面运行 code-server 的…

NSGA-II 遗传多目标算法(python示例)

一、前言 最近在准备毕业论文&#xff0c;研究了一下主流的多目标算法&#xff0c;对于NSGA-II&#xff0c;网上大部分代码是全部是面向过程来实现的&#xff0c;本人更喜欢采用面向对象的方式&#xff0c;故采用python面向对象实现了一个示例&#xff0c;实现了对于二元多目标…

iOS iGameGuardian修改器检测方案

一直以来&#xff0c;iOS 系统的安全性、稳定性都是其与安卓竞争的主力卖点。这要归功于 iOS 系统独特的闭源生态&#xff0c;应用软件上架会经过严格审核与测试。所以&#xff0c;iOS端的作弊手段&#xff0c;总是在尝试绕过 App Store 的审查。 常见的 iOS 游戏作弊&#xf…

jenkins工具系列 —— 删除Jenkins JOB后清理workspace

文章目录 问题现象分析解决思路脚本实现问题现象分析 Jenkins使用过程中,占用空间最大的两个位置: 1 、workspace: 工作空间,可以随便删除,删除后再次构建时间可能会比较长,因为要重新获取一些资源。 2 、job: 存放的是项目的配置、构建结果、日志等。不建议手动删除,…

深度学习_2 数据操作

数据操作 机器学习包括的核心组件有&#xff1a; 可以用来学习的数据&#xff08;data&#xff09;&#xff1b;如何转换数据的模型&#xff08;model&#xff09;&#xff1b;一个目标函数&#xff08;objective function&#xff09;&#xff0c;用来量化模型的有效性&…

如何在Instagram和kol展开合作

网红营销已经演变成一个由品牌、MCN机构、红人和消费者组成的复杂生态系统&#xff0c;并在某种程度上重新定义了当今社交媒体时代营销和广告的本质。在这个情况下&#xff0c;品牌找红人进行营销推广已经成为大势&#xff0c;而最能体现网红营销发展的莫过于Instagram这个平台…

黑豹程序员-架构师学习路线图-百科:jMeter并发测试计划

我们开发一个软件系统&#xff0c;为了保证代码的正确&#xff0c;我们需要测试。测试日常包括&#xff1a;单元测试、功能测试、集成测试、压力测试、回归测试。 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。 JMeter 最初被…

抖音上怎么挂小程序?制作小程序挂载抖音视频

公司企业商家现在已经把抖音作为营销的渠道之一&#xff0c;目前抖音支持短视频挂载小程序&#xff0c;可方便做营销。以下给大家分享这一操作流程。 一、申请自主挂载能力 首先需要在抖音开放平台官网注册一个抖音小程序账号&#xff0c;然后申请短视频自主挂载能力。 二、搭…

【ROS教程demo】用C++创建一个ROS节点,发布指令使得小海龟做圆周运动

ROS创建节点发布命令使得小海龟做圆周运动 1.任务需求2.任务分析2.1发布方topic和msg2.2接收方topic和msg2.3目标明确!3.创建ROS节点3.1创建发布方节点pub_pose3.2创建订阅方节点sub_pose1.任务需求 创建一个节点,在其中实现一个订阅者和一个发布者,完成以下功能: 发布者:…

2.预备知识-2简化版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 数据操作数据预处理一、N维数组样例二、创建数组三、访问元素四、数据操作D2L注意点五、数据预处理六、D2L注意点七、QA No.2 线性代数一、标量二、向量1、基本操作2、空间表示3、乘法 三、矩阵1、基本操作2、乘法3、空…

一百九十七、Java——IDEA项目中把多层文件夹拆开显示

一、目的 由于IDEA项目中&#xff0c;默认的是把文件夹连在一起显示&#xff0c;于是为了方便需要把这些连在一起的文件夹拆开&#xff0c;分层显示 如文件夹cn.kgc 二、解决措施 解决方法很简单 &#xff08;一&#xff09;找到IDEA项目上的小齿轮 &#xff08;二&#xf…

springboot的spring.jackson.date-format失效解决

看起来数据库的格式非常完美,但是数据库字段look_date 是 datetime类型,java里没有datetime类型,这样一来如果你不在后端做处理,那么模型属性Date来接收一定会出问题.我通过实验证明最后拿到的是一个时间戳. 第一 解决时间格式问题 1.可以通过application.propertis配置文件中…

Ubuntu 内核降级到指定版本

reference https://www.cnblogs.com/leebri/p/16786685.html 前往此网站&#xff0c;找到所需的内核 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 查看系统架构 dpkg --print-architecture 二、下载安装包 注意&#xff1a;下载除lowlatency以外的deb包 三、安装内核 3…

python excel接口自动化测试框架

前言 前些天写了pytestyamlallure接口自动化测试框架这篇文章。 今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方法&#xff0c…

吴恩达《机器学习》1-3:监督学习

一、监督学习 例如房屋价格的数据集。在监督学习中&#xff0c;我们将已知的房价作为"正确答案"&#xff0c;并将这些价格与房屋的特征数据一起提供给学习算法。学习算法使用这些已知答案的数据来学习模式和关系&#xff0c;以便在未知情况下预测其他房屋的价格。这就…