C++: 位图和布隆过滤器

目录

一、位图

1.1 概念

1.2 应用

1.3 模拟实现

1.31 把比特位上的值设置为1

1.32 把比特位上的值设置为0

1.33 检测比特位上的值是否是1

1.34 代码

二、布隆过滤器

2.1 概念

2.2 优点

2.3 缺点

2.4模拟实现


一、位图

1.1 概念

运用哈希的思想,将整型映射到比特位上,比特位上的值为0就是不存在,1就是存在。这样就能达到检测一组不重复的数据是否出现在已有的数据中了。

重点:数据不能重复

1.2 应用

用于门禁,指纹密码等。

1.3 模拟实现

1.31 把比特位上的值设置为1

a为0或者1,当1 | a=1,通过按位或的特性,把比特位上的值设置为1.

下图是1先左移pos位,才能和pos对齐,再进行按位或运算。

1.32 把比特位上的值设置为0

a为0或1,0&a=0,1&a=a;所以在需要设置的位&0,其他位&1,就能保证只有这个需要改变的bit位设置为0,不造成对其他数据的影响。这种数怎么得到呢?

通过对1左移pos位,再按位取反,就能得到想要的值了。

1.33 检测比特位上的值是否是1

先找到数据所在的比特位和下标

把bit位所在的下标的int值取出,然后再右移pos位,&1。如果是1就说明存在,0就是不存在。

1.34 代码

#pragma once
#include <iostream>
using namespace std;
#include <vector>class bitset{public:bitset(size_t bitCount): _bit((bitCount >> 5) + 1), _bitCount(bitCount){}// 将which比特位置1void set(size_t which){if (which > _bitCount){return;}size_t index = which >> 5;//一次处理,得到vector的下标size_t pos = which % 32; //二次处理,取得具体的bit位_bit[index] |= (1 << pos);}// 将which比特位置0void reset(size_t which){if (which > _bitCount){return;}size_t index = which >> 5;size_t pos = which % 32;_bit[index] &= ~(1 << pos);}// 检测位图中which是否为1bool test(size_t which){if (which > _bitCount){return false;}size_t index = which >> 5;size_t pos = which % 32;return (_bit[index] >> pos) & 1;}size_t size()const { return _bitCount; }private:vector<int> _bit;size_t _bitCount;};

二、布隆过滤器

2.1 概念

高效地插入和查询,可以告诉你,某种东西一定不存在或者可能存在,用多个哈希函数,将一个数据映射到位图中,不仅可以提升查询效率,而且很大节省空间。

a.用于处理string类的数据,结合位图,一个string对应多个哈希函数

b.存在的值,不会判定为不存在,如果判定不存在,则一定不存在。不存在的值,可能会发生哈希冲突,判定为存在。

下图为一个string用5个哈希函数的值映射的比特位来确定。设置这5个比特位都为1,检测时需要5个比特位都为1才表示存在。

2.2 优点

1.不存储元素本身

2.承受一定误判时,比其他数据结构有更大空间优势

3.数据量很大时,可以表示全集

4.可以进行交、并、差运算

2.3 缺点

1.不能准确判断元素是否在集合中,有误判率

2.不能获取元素本身

3.一般情况下不能从布隆过滤器中删除元素,会影响其他元素的存在状态

2.4模拟实现

5个哈希函数就没放上来了。

template<class K=string, class KToInt1 = KeyToInt1, class KToInt2 = KeyToInt2,class KToInt3 = KeyToInt3, class KToInt4 = KeyToInt4,class KToInt5 = KeyToInt5>
class BloomFilter
{
public:BloomFilter(size_t size)  // 布隆过滤器中元素个数: _bmp(5 * size), _size(0){}// 插入数据bool Insert(const K& key){size_t len = _bmp.size();size_t index1 = KToInt1()(key)%len;size_t index2 = KToInt2()(key)%len;size_t index3 = KToInt3()(key)%len;size_t index4 = KToInt4()(key)%len;size_t index5 = KToInt5()(key)%len;_bmp.set(index1);_bmp.set(index2);_bmp.set(index3);_bmp.set(index4);_bmp.set(index5);_size++;return true;}// 检测在不在bool IsInBloomFilter(const K& key){int len = _bmp.size();int index1 = KToInt1()(key) % len;if (_bmp.test(index1) == false){return false;}int index2 = KToInt2()(key) % len;if (_bmp.test(index2) == false){return false;}int index3 = KToInt3()(key) % len;if (_bmp.test(index3) == false){return false;}int index4 = KToInt4()(key) % len;if (_bmp.test(index4) == false){return false;}int index5 = KToInt5()(key) % len;if (_bmp.test(index5) == false){return false;}return true;}
private:bitset<100> _bmp;size_t _size;   // 实际元素的个数
};

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

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

相关文章

快速上手 Yarn:详解安装、配置、基本用法及其在 JavaScript 包管理中的作用

Yarn 是一个快速、可靠、安全的 JavaScript 包管理工具&#xff0c;专为解决 npm 的一些性能问题而设计。本文将详细介绍如何安装、配置和基本使用 Yarn。 安装 Yarn 使用 npm 安装 如果您已经安装了 npm&#xff0c;可以使用以下命令全局安装 Yarn&#xff1a; npm instal…

创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,且鼠标变成手型

1.概要 创建一个矩形&#xff0c;当鼠标进入这个矩形的时候&#xff0c;这个矩形边线变色&#xff0c;且鼠标变成手型 2.代码 #include <QApplication> #include "customRectWidget.h" /** qt 6.7版&#xff0c; 创建一个矩形&#xff0c;当鼠标进入这个矩形…

【前端数据层高可用架构】

前端数据层高可用架构 前后端架构模式如下图 在这个架构下,客端数据可用率计算方式: 因此整体数据可用性分析表如下: 只有在客端和 BFF 都正常的情况下数据才能可用,而这种情况占比不是很高,因此整体的用户体验就不是很好。 本次建设目标 本文的设计方案就是要解决…

【设计模式之美】【建造型】建造者模式:处理复杂成员变量以及它们之间的关系

文章目录 一. 使用场景二. 具体实现三. 小结1. 结合场景使用2. 与工厂模式的区别 建造者模式本身不难&#xff0c;重点是掌握好它的适用场景。 一. 使用场景 如果一个类中有很多属性&#xff0c;为了避免构造函数的参数列表过长&#xff0c;影响代码的可读性和易用性&#xf…

Python Linux环境(Centos8)安装minicoda3+jupyterlab

文章目录 安装miniconda安装python环境启动 最近服务器检查&#xff0c;我下面的服务器有漏洞&#xff0c;不得已重装了&#xff0c;正好记录下怎么从零到python写代码。 安装miniconda miniconda是anconda的精简版&#xff0c;就是管理python环境的得力助手。 # 创建一个名…

C语言 do while循环语句练习 下

猜数字游戏实现 //猜数字游戏 //电脑产生 一个随机数&#xff08;1-100) //猜数字 //猜大了 //猜小了 //直到猜对了&#xff0c;结束 #include <stdlib.h> #include <time.h> void menu() {printf("********************************\n");printf("…

【Redis7】高阶篇

1 Redis单线程 VS 多线程(入门篇) 1.1 面试题 redis到底是单线程还是多线程&#xff1f; IO多路复用听说过吗&#xff1f; redis为什么快&#xff1f; 1.2 Redis为什么选择单线程&#xff1f; 1.2.1 是什么 这种问法其实并不严谨&#xff0c;为啥这么说呢? Redis的版本…

怎么将图片插入excel单元格中

首先选中单元格选择插入 在图片位置选择插入图片的位置 然后就插入成功了&#xff0c;一开始会觉得图片是附在表格上面的&#xff0c;并不在单元格里面&#xff0c;但是右边有一个小图片的图标&#xff0c;点击它可以缩小到单元格里面&#xff0c;再点击就是放大&#xff1b;

【无人值守】对数据中心电力分配系统发展的影响

数据中心在现代信息发展中承载着巨量数据的计算、存储、挖掘、分析和应用等多个方面的功能&#xff0c;是国计民生各行业的多样化的信息化的资产。对稳定的运行与安全运维是基本需求也是重要的保障。 数据中心属于高能耗产业&#xff0c;对用电负荷大且要求极度稳定。除了对电力…

ROS、pix4、gazebo、qgc仿真ubuntu20.04

一、ubuntu、ros安装教程比较多&#xff0c;此文章不做详细讲解。该文章基于ubuntu20.04系统。 pix4参考地址&#xff1a;https://docs.px4.io/main/zh/index.html 二、安装pix4 1. git clone https://github.com/PX4/PX4-Autopilot.git --recursive 2. bash ./PX4-Autopilot…

华为od 100问 持续分享4-目标院校及分数线

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2024年5月份开始&#xff0c;考的都是OD统一考试&#xff08;D卷&#xff09;&#xff0c;题库已经整…

TikTok账号矩阵运营怎么做?

这几年&#xff0c;聊到出海避不过海外抖音&#xff0c;也就是TikTok&#xff0c;聊到TikTok电商直播就离不开账号矩阵&#xff1b; 在TikTok上&#xff0c;矩阵养号已经成为了出海电商人的流行策略&#xff0c;归根结底还是因为矩阵养号可以用最小的力&#xff0c;获得更大的…

图片转换为张量

将一张图片转换为张量可以通过使用 Python 的图像处理库&#xff08;如 PIL 或 OpenCV&#xff09;结合 PyTorch 的工具函数来实现。下面我将分别展示如何使用 PIL 和 OpenCV 来加载和转换图片为 PyTorch 张量。 使用 PIL 加载和转换图片为张量 首先&#xff0c;使用 PIL 库加…

RTI DDS大数据碎片

有两种类型的碎片&#xff1a;IP级碎片和DDS级碎片。 当传输层&#xff08;通常是UDP或TCP&#xff09;提供的有效载荷超过适合链路帧的最大有效载荷大小&#xff08;也称为链路最大传输单元或链路MTU&#xff09;时&#xff0c;就会发生IP级碎片。如果网络是以太网&#xff0…

Java中使用代理IP的詳細教程

在Java中&#xff0c;如何使用代理IP呢&#xff1f;本文將從原理和實現方法&#xff0c;詳細介紹Java中使用代理IP的技巧。 代理IP的原理 代理IP可以分為多種類型&#xff0c;包括HTTP代理、HTTPS代理和Socks代理等。每種代理都有不同的應用場景和優缺點。 HTTP代理&#xf…

【大模型】FAISS向量数据库记录:从基础搭建到实战操作

文章目录 文章简介Embedding模型BGE-M3 模型亮点 FAISS是什么FAISS实战安装faiss加载Embedding模型创建FAISS数据库搜索FAISS数据删除FAISS数据保存、加载FAISS索引 总结 本人数据分析领域的从业者&#xff0c;拥有专业背景和能力&#xff0c;可以为您的数据采集、数据挖掘和数…

测试技术相关

介绍一下cookie&#xff0c;session和toke的区别 session存储于服务器&#xff0c;可以理解为一个状态列表&#xff0c;拥有一个唯一识别符号se5sionld&#xff0c;通常存放于cookie中。 服务器收到cookie后解析出sessionld&#xff0c;再去session列表中查找&#xff0c;才能找…

X86架构和ARM架构的区别

X86架构和ARM架构是两种常见的微处理器架构&#xff0c;主要用于个人电脑、服务器和移动设备等。 历史和起源&#xff1a;X86起源于Intel的8086/8088芯片&#xff0c;广泛应用于IBM PC系列&#xff1b;而ARM由Advanced RISC Machines&#xff08;ARM公司&#xff09;设计&…

通用图形处理器设计GPGPU基础与架构(二)

一、前言 本系列旨在介绍通用图形处理器设计GPGPU的基础与架构&#xff0c;因此在介绍GPGPU具体架构之前&#xff0c;需要了解GPGPU的编程模型&#xff0c;了解软件层面是怎么做到并行的&#xff0c;硬件层面又要怎么配合软件&#xff0c;乃至定出合适的架构来实现软硬件协同。…

url拼接,本人自用

/*** Description: 用来处理水务专题-辅料管理接口中&#xff0c;url的拼接* Description: 拼接String类型的数据* Date: 2024/06/21* return: java.lang.String* param: [url, parameterName, parameterValue]**/ public String appendParameterToURL(String url, String para…