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

可碧教你C++——位图


本章节是哈希的延申

可碧教你C++——哈希icon-default.png?t=N7T8http://t.csdnimg.cn/3R8TU

一文详解C++——哈希


位图

 位图是基于哈希表的原理产生的一种新的container——bitset

基于哈希映射的原理,我们在查找的时候,可以直接去定址到元素的具体位置,然后直接访问该元素。但是如果没有哈希冲突,我们甚至完全不需要检查哈希映射对应的元素是否为我们需要查找的元素,直接判断这个位置有没有元素,便可以知道该元素在不在哈希表里。 

而判断某一个位置有没有元素,只需要0和1便可以完成,也就是无论被存储数据的大小,每个数据只需要1个比特位的存储空间,这无疑极大压缩了内存空间。而通过这种方式实现的数据结构,便被称为——位图。

位图的结构

一般来说,我们只有在内存空间不足以解决既有的问题下,才会去考虑缩小数据空间的问题。同样,内存的使用场景一般是在有着海量数据下,我们要对某个数据进行查重,才会使用位图。位图的原理是哈希表,其构成当然离不开数组,实际上位图和普通的哈希表构成几乎相同, 只不过将数组的单元格变成了一个个的比特位。 

但是,C++中并无法将单个比特位作为单元格,我们只能通过某种方法间接去访问比特位

例如:我们将每个单元格设为整型int,然后每个整型int具有4字节32个比特位,我们便可以通过相除的方式寻找具体的单元格,再用除余的方式寻找比特位.

 这便是位图的最基本的结构:

class bitset
{private:vector<int> _table;//可以是任何模板参数,只需要该参数所占有的比特位//但是最好不要用指针,因为在不同位的电脑上指针的比特位不同
}

位图的访问

位图的访问实际上是对比特位的访问。但是我们很难专门去访问某一个比特位,我们只能采取异或的方法,将其他位全置为0,从而间接访问具体的一位的值。

通过以上两个式子,我们很快就能找到解决方案:

只要构建出一个辅助量,其他位都为0,只有被查找的那一位为1,然后取&,最终得到的结果便只与需要查找的值有关了。如果该值为1,则整个值非0,返回true;如果该值为0,则整个值为0,返回false。

下一个问题便是,如何构建这一个辅助量?这便需要用到移位运算符。 

 也就是说,我们想访问哪一位,就只需要移位多少位,便可以达成条件。

//查找元素,约等于find
bool test(int key)
{size_t plane = key / 32;//第几辆飞机size_t seat = key % 32;//第几个座位return _table[plane] & (1 << seat);//构建辅助量并&
}

位图的插入和删除

位图的插入和删除,实际上也是考虑如何在不影响其他比特位的情况下,对某一具体比特位的操作。

插入,就是将该位便为1;删除,就是将该位便为0,这里又需要我们使用异或的性质:

于是很容易想到

  • 插入的时候,我们使用|,辅助量为其他位全为0,修改位为1
  • 删除的时候,我们使用&,辅助量其他位全为1,修改位为0 

位图的实现

位图不支持扩容。我们在使用位图的时候,就必须传入位图需要的空间大小

class bitset
{
public:bitset(int n){_table.resize(n);}//将元素设为1,约等于insertvoid set(int key){size_t plane = key / 32;size_t seat = key % 32;_table[plane] |= (1 << seat);}//将元素设为0,约等于erasevoid reset(int key){size_t plane = key / 32;size_t seat = key % 32;_table[plane] &= ~(1 << seat);}//查找元素,约等于findbool test(int key){size_t plane = key / 32;size_t seat = key % 32;return _table[plane] & (1 << seat);}
private:vector<int> _table;
};

布隆过滤器

上面所述的位图都是在不考虑哈希冲突的情况下所实现,但是实际上,哈希冲突是不可能被避免的。 难道必须要在规定没有哈希冲突的情况下,位图才有意义吗?当然不是。我们不妨直面哈希冲突,看看在有哈希冲突的情况下,位图会产生什么影响

哈希冲突会导致其他与其具有相同哈希映射值的元素,也被视作为存在于哈希表中。 

  • 如果数据存在,无论该位是否存在冲突,则该位一定为1
  • 如果数据不存在,则该为可能为0,也可能会因其他数据的冲突导致该位为1;

而反过来通过表中的状态判断数据是否存在于表中

  • 如果表中存在,无法判断该数据是否存在,因为可能是其他的值产生的1
  • 如果表中不存在,则该哈希映射值对应的所有元素一定都不存在

是不是就像大家平时上课签到一样 

 也就是说,我们可以采用他的准确性——判断数据是否不在表中

最常见的应用场景便是取名查重。我们可以接受一个未被取的名字被视为已经占用,但是不能接收重名,此时采用这种过滤方式,可以在满足条件的情况下尽可能节省空间。 

多重过滤

尽管我们可以接受误判,但是我们还是不想有太多类似于科比布莱恩特24这样因误判而导致可取名变少带来的产物,那还有没有其他办法去尽量避免呢?

既然一重过滤会导致误判,那多重过滤,是不是误判就减少了

  •  只有三个毕业证都存在,才表示学历是真真正正存在的。
  •  而如果其中任何一个毕业证不存在,则表示其学历是伪造的。

我们创建三个位图,每个位图使用不同的哈希映射,当一个数据插入到布隆过滤器时,会映射到三个不同的位置上,每个位图都会产生相应的插入结果。也就是说,只有当三个位图都存在该数据,才表示布隆过滤器存在该数据。 相应的,如果任何一个位图中不存在某个数据,则表示其他位图中该数据的存在时哈希冲突产生的。而因为采用了多种哈希映射,三个位图的哈希冲突完全相同的可能性几乎为0,也就避免了哈希冲突的存在。

class bloom_filter
{private:bitset _hash1;bitset _hash2;bitset _hash3;
}

布隆过滤器的问题

虽然布隆过滤器可以避免插入的哈希冲突,但是还是有这样一个巨大的问题——删除。

我们想删除一个数据,当然是将三个位图中所有对应的数据都删除。但是删除以后,哈希冲突导致的其他数据也被删除了。这种改变是不可逆的,因为我们并不知道到底有多少数据在该位上哈希冲突了。等到判断的时候,因为该数据在某一个表中被误删,导致就算该数据在其他两个表中仍存在,也会被误判为不存在。

所以,布隆过滤器一般是不允许删除的,当然也有解决方法,便是在每个位置上进行引用计数,但是这便舍弃了布隆过滤器节省空间的初衷和优点。


哈希切割

哈希切割不是一个具体的container。哈希切割是利用哈希的思想,对某些问题处理的方法。

假如某个数据库存有海量的数据,一个服务器并没有办法很好处理这些数据,要将这些数据分开到几个不同的服务器进行处理,往往会面临几个需求

  • 相同或类似的数据放在同一个服务器中
  • 每一个服务器的数据量尽量平均
  • 尽量不要浪费空间以减少服务器的数量 

此时红黑树等容器便没有办法满足了。尽管一些有序容器可以处理数据的特征,但是因为服务器的分离,红黑树很难去跨设备访问其他数据,所以这里大部分container都会罢工。

在这里,我们就必须采取哈希的思想,通过数据的除余,将除余相同的数据放在同一个服务器中。这样,重复的数据自然因除余相同被归类到了一个服务器里,而类似的数据同样可以通过一些算法分割到相同的服务器中。 


 

相关文章:

可碧教你C++——位图

本章节是哈希的延申 可碧教你C——哈希http://t.csdnimg.cn/3R8TU 一文详解C——哈希 位图 位图是基于哈希表的原理产生的一种新的container——bitset 基于哈希映射的原理&#xff0c;我们在查找的时候&#xff0c;可以直接去定址到元素的具体位置&#xff0c;然后直接访问该…...

2024年虚拟DOM技术将何去何从?

从诞生之初谈起&#xff0c;从命令式到声明式&#xff0c;Web开发的演变之路 Web开发的起源与jQuery的统治 在Web开发的早期阶段&#xff0c;操作DOM元素主要依赖命令式编程。当时&#xff0c;jQuery因其易用性而广受欢迎。使用jQuery&#xff0c;开发者通过具体的命令操作DOM&…...

基于51单片机的恒温淋浴器控制电路设计

标题&#xff1a;基于51单片机的智能恒温淋浴器控制系统设计与实现 摘要&#xff1a; 本论文主要探讨了一种基于STC89C51单片机为核心控制器的恒温淋浴器控制系统的详细设计与实现。系统通过集成温度传感器实时监测水温&#xff0c;结合PID算法精确控制加热元件工作状态&#…...

【redis】redis的bind配置

在配置文件redis.conf中&#xff0c;默认的bind 接口是127.0.0.1&#xff0c;也就是本地回环地址。这样的话&#xff0c;访问redis服务只能通过本机的客户端连接&#xff0c;而无法通过远程连接&#xff0c; 这样可以避免将redis服务暴露于危险的网络环境中&#xff0c;防止一些…...

C++ 继承

目录 一、继承的概念及定义 1、继承的概念 2、继承定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 1、菱形继承 2、虚拟继承 3、例题 八、继承的总结和反思…...

了解ASP.NET Core 中的文件提供程序

写在前面 ASP.NET Core 通过文件提供程序来抽象化文件系统访问。分为物理文件提供程序(PhysicalFileProvider)和清单嵌入的文件提供程序(ManifestEmbeddedFileProvider)还有复合文件提供程序(CompositeFileProvider )&#xff1b;其中PhysicalFileProvider 提供对物理文件系统…...

竞赛保研 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…...

JavaScript音视频,JavaScript简单获取电脑摄像头画面并播放

前言 本章实现JavaScript简单获取电脑摄像头画面并播放的功能 兼容性(不支持Node.js) 需要注意的是,由于涉及到用户的隐私和安全,获取用户媒体设备需要用户的明确同意,并且可能需要在用户的浏览器中启用相关的权限。在某些浏览器中,可能需要用户手动开启摄像头权限。 …...

《JVM由浅入深学习【五】 2024-01-08》JVM由简入深学习提升分享

目录 JVM何时会发生堆内存溢出&#xff1f;1. 堆内存溢出的定义2. 内存泄漏的原因3. 堆内存溢出的常见场景4. JVM参数调优5. 实际案例分析 JVM如何判断对象可以回收1.可达性分析的基本思路2.实际案例3.可以被回收的对象4.拓展&#xff0c; 谈谈 Java 中不同的引用类型? 结语感…...

FastDFS之快速入门、上手

知识概念 分布式文件系统 通过计算机网络将各个物理存储资源连接起来。通过分布式文件系统&#xff0c;将网络上任意资源以逻辑上的树形结构展现&#xff0c;让用户访问网络上的共享文件更见简便。 文件存储的变迁&#xff1a; 直连存储&#xff1a;直接连接与存储&#xf…...

Vue 中的 ref 与 reactive:让你的应用更具响应性(中)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

【数据库基础】Mysql与Redis的区别

看到一篇不错的关于“Mysql与Redis的区别”的文章&#xff0c;转过来记录下~ 文章目录 一、数据库类型二、运行机制三、什么是缓存数据库呢&#xff1f;四、优缺点比较五、区别总结六、数据可以全部直接用Redis储存吗&#xff1f;参考资料 一、数据库类型 Redis&#xff1a;NOS…...

JVM工作原理与实战(六):类的生命周期-连接阶段

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载&#xff08;Loading&#xff09; 2.连接&#xff08;Linking&#xff09; 3.初始化&#xff08;Initialization&#xff09; 4.使用&#xff08;Using&…...

【OCR】 - Tesseract OCR在Windows系统中安装

Tesseract OCR 在Windows环境下安装Tesseract OCR&#xff08;Optical Character Recognition&#xff09;通常包括以下几个步骤&#xff1a; 下载Tesseract 访问Tesseract的GitHub发布页面&#xff1a;https://github.com/tesseract-ocr/tesseract/releases找到适合你操作系…...

YOLOv8改进 | 损失函数篇 | SlideLoss、FocalLoss分类损失函数助力细节涨点(全网最全)

一、本文介绍 本文给大家带来的是分类损失 SlideLoss、VFLoss、FocalLoss损失函数,我们之前看那的那些IoU都是边界框回归损失,和本文的修改内容并不冲突,所以大家可以知道损失函数分为两种一种是分类损失另一种是边界框回归损失,上一篇文章里面我们总结了过去百分之九十的…...

计算机网络试题——填空题(附答案)

在OSI模型中&#xff0c;第一层是____________层。 答案&#xff1a;物理&#xff08;Physical&#xff09; TCP协议是一种_____________连接的协议。 答案&#xff1a;面向连接&#xff08;Connection-oriented&#xff09; IPv6地址的位数是____________。 答案&#xff1a;1…...

第二证券:股票私募仓位指数创近八周新高

1月8日&#xff0c;A股几大首要指数全线收跌&#xff0c;上证指数收于日内最低点2887.54点&#xff0c;间隔上一年5月份的阶段高点3418.95点现已跌去了15.54%。 不过&#xff0c;虽然商场仍未清晰止跌&#xff0c;私募基金们却现已进场“抄底”。私募排排网最新发布的私募仓位…...

35-javascript基础,引入方式;变量命名规范

html分为三部分&#xff1b;结构html&#xff0c;表现css&#xff0c;行为js&#xff1b;js就是javascript js包含三部分&#xff1a; ECMAScript&#xff1a;简称ES&#xff0c;ES5&#xff0c;ES6核心语法 DOM&#xff1a;获取和操作html元素的标准方法&#xff1b;BOM&am…...

笔试案例2

文章目录 1、笔试案例22、思维导图 1、笔试案例2 09&#xff09;查询学过「张三」老师授课的同学的信息 selects.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids…...

【嵌入式-网络编程】vmware中使用UDP广播失败问题

问题描述&#xff1a; 自己在vmware中搭建了2台虚拟机&#xff0c;虚拟机A向虚拟机A和虚拟机B发送广播信息&#xff0c;接收端在虚拟机A和虚拟机B&#xff0c;这个时候&#xff0c;由于没配置sin.sin_addr.s_addr htonl(INADDR_ANY);&#xff0c;而是配置的inet_pton(AF_INET,…...

2020年认证杯SPSSPRO杯数学建模D题(第二阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…...

vue3 修饰符大全(近万字长文)

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、事件修饰符&#xff08;Event Modifiers&#xff09;1、.stop&#xff08;阻止事件冒泡&#xff09;2、.prevent&#xff08;阻止事件的默认行为&#xff09;3、.capture&#xff08;使用事件捕获模式…...

HarmonyOS@State装饰器:组件内状态

State装饰器&#xff1a;组件内状态 State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&…...

如何让GPT支持中文

上一篇已经讲解了如何构建自己的私人GPT&#xff0c;这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型&#xff0c;GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品&#xff0c;llama.cpp 不再…...

使用开源通义千问模型(Qwen)搭建自己的大模型服务

目标 1、使用开源的大模型服务搭建属于自己的模型服务&#xff1b; 2、调优自己的大模型&#xff1b; 选型 采用通义千问模型&#xff0c;https://github.com/QwenLM/Qwen 步骤 1、下载模型文件 开源模型库&#xff1a;https://www.modelscope.cn/models mkdir -p /data/…...

Java工程师面试题解析与深度探讨

Java工程师面试题解析与深度探讨 第一部分&#xff1a;引言 Java作为一门广泛应用的编程语言&#xff0c;拥有庞大的生态系统&#xff0c;Java工程师因此成为众多企业追逐的目标。而在Java工程师的招聘中&#xff0c;面试是了解候选人技能和经验的核心环节。本文将深入探讨一…...

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…...

【PostgreSQL】表管理-表继承

PostgreSQL 表继承 PostgreSQL 实现了表继承&#xff0c;这对于数据库设计人员来说是一个有用的工具。&#xff08;SQL&#xff1a;1999 及更高版本定义了类型继承功能&#xff0c;该功能在许多方面与此处描述的功能不同。 让我们从一个例子开始&#xff1a;假设我们正在尝试…...

Dijkstra算法——邻接矩阵实现+路径记录

本文是在下面这篇文章的基础上做了一些补充&#xff0c;增加了路径记录的功能。具体Dijkstra的实现过程可以参考下面的这篇文章。 [jarvan&#xff1a;Dijkstra算法详解 通俗易懂](Dijkstra算法详解 通俗易懂 - jarvan的文章 - 知乎 https://zhuanlan.zhihu.com/p/338414118) …...

Vim基础操作

参考B站UP&#xff1a;正月点灯笼 vim入门教程&#xff08;共3讲&#xff09; 以下总结&#xff0c;部分搬运自评论区&#xff0c;楼主&#xff1a;-不是飞鱼QAQ&#xff0c;修改部分内容。 vim分为 命令 和 编辑 模式 i进入编辑模式&#xff08; - - INSERT - - &#xff09;…...

网站建设加推广需要多少钱/最新国际新闻 大事件

自动化机器学习工具供应商Auger.AI正在为多个基于云的AutoML服务开发Python API和工具&#xff0c;从而允许数据科学家针对多个AutoML模型训练数据集&#xff0c;以产生最佳可能的预测模型。 称为A2ML&#xff0c;对于Automate AutoML&#xff0c;该开放源代码项目由一个API和…...

有哪些平台网站是做废钢的/沈阳网站建设制作公司

Hyper-V提供广泛的操作系统支持(包括32/64位OS&#xff0c;例如Windows、Linux等操作系统)、虚拟VLAN的支持(对虚拟化环境中的虚拟机划分VLAN&#xff0c;以保证虚拟机间信息的相互隔离)、包含了全新的虚拟交换功能&#xff08;运行Windows网络负载均衡服务&#xff0c;以对不同…...

苏州高端建站公司/自助建站系统平台

http://www.cplusplus.com/reference/queue/转载于:https://www.cnblogs.com/icmzn/p/8386049.html...

成品源码网站永久地址入口进入/深圳优化怎么做搜索

上次的博文深入浅出MongoDB&#xff08;一&#xff09;NoSQL中我们已经简单介绍了一下NoSQL的基本概念&#xff0c;这次我们来了解一下MongoDB相关概念。 1、简介 MongoDB是一款由C编写的高性能、开源、无模式的常用非关系型数据库产品&#xff0c;是非关系数据库当中功能最丰富…...

山东济南网站建设公司/安徽网络建站

插入排序冒泡排序归并排序快速排序堆排序桶排序和基数排序外部排序一&#xff0e; 插入排序插入排序的时间复杂度是O(n^2)。插入排序重复地将新元素插入到一个排好序的子线性表中&#xff0c;直到整个线性表排好序。算法描述如下&#xff1a;for(int i0;i将list[i]插入&#xf…...

手机投注网站建设/网站优化推广哪家好

https://stackoverflow.com/questions/29311875/three-js-pointerlockcontrols-shooting-along-y-axis 如果您正在使用PointerLockControls并且想要添加一个保留在相机前面的对象&#xff0c;您可以使用以下模式&#xff1a; var mesh new THREE.Mesh( new THREE.SphereGeom…...