【数据结构 10】位图

一、位图

在海量数据的标记的时候,比如数十亿上百亿上千亿的数据,我们要统计数据是否出现,直接存储数据的话对内存的消耗太大了,这时我们可以通过位图来标记出现过的数据,位图可以标记0~42亿之间的整型数据,我们也可通过复用多个位图实现统计数据出现的次数。

二、布隆过滤器

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

布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特
位一定为1。所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位置存储的是否为
零,只要有一个为零,代表该元素一定不在哈希表中,否则可能在哈希表中。

三、代码

#define _CRT_SECURE_NO_WARNINGS 1#pragma once
#include <iostream>
#include <vector>template<size_t N>
class BitSet
{
public:BitSet(){// 每个元素为char类型,占8个bit位_bitSet.resize((N >> 3) + 1, 0);}// 将位图某一位置1void Set(size_t x){size_t i = x >> 3;size_t j = x % 8;_bitSet[i] |= (1 << j);}// 将位图某一位置0void Reset(size_t x){size_t i = x >> 3;size_t j = x % 8;_bitSet[i] &= (~(1 << j));}// 检查位图中某一位是否为1	bool Test(size_t x){size_t i = x >> 3;size_t j = x % 8;return _bitSet[i] & (1 << j);}private:std::vector<char> _bitSet;
};

四、测试

#define _CRT_SECURE_NO_WARNINGS 1#include "BitSet.h"
using namespace std;void TestBitSet()
{// 开辟42亿9千万个bit位,512M空间;BitSet<-1> bs;// BitSet<0xffffffff> bs;bs.Set(9);bs.Set(19);bs.Set(29);bs.Set(39);cout << bs.Test(9) << endl;cout << bs.Test(19) << endl;cout << bs.Test(29) << endl;cout << bs.Test(39) << endl;cout << bs.Test(49) << endl;bs.Reset(19);bs.Reset(29);cout << endl;cout << bs.Test(9) << endl;cout << bs.Test(19) << endl;cout << bs.Test(29) << endl;cout << bs.Test(39) << endl;cout << bs.Test(49) << endl;
}int main()
{TestBitSet();return 0;
}

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

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

相关文章

SpringBoot 过滤器Filter 拦截请求 生命周期

介绍 当用户请求接口时&#xff0c;请求会先到过滤器&#xff0c;在到处理逻辑的接口&#xff0c;在过滤器中可以可以判断用户权限&#xff0c;如&#xff1a;是否登录&#xff0c;或请求前的一些操作&#xff0c;完成一下比较通用的操作&#xff0c;如&#xff1a;前端的AXIO…

threejs之常用贴图

在三维图形和游戏开发中&#xff0c;高光贴图、凹凸贴图、法线贴图和环境光遮蔽贴图是常用的技术&#xff0c;用于增加虚拟物体表面的细节和真实感&#xff0c;而无需增加更多的几何体。这些技术可以帮助开发者和艺术家创造出既详细又性能高效的场景。 高光贴图&#xff08;Sp…

console.log导致内存泄露 打包时自动去掉console.log方法

webpack通过工具&#xff1a;terser 使用前需要先安装一下 vue.config.js const { defineConfig } require(vue/cli-servise); module.exports defineConfig({transpileDependencies:true,terser:{terserOptions:{compress:{drop_console:true,drop_debugger:true,},},},}…

vue3中ts的基本用法

定义类型&#xff08;src/types/index.ts&#xff09; &#xff1f;代表可有可无 export interface Persons {id: number,name: string,age?: number }定义Person子组件&#xff08;src/components/Person.vue&#xff09; <template><ul><li v-for"item …

js中原始类型和对象引用

在 JavaScript 中&#xff0c;除了原始类型&#xff08;例如字符串、数字、布尔值、null 和 undefined&#xff09;外&#xff0c;其他所有值都是对象。当我们在 Set 中添加一个元素时&#xff0c;该元素可以是原始类型或对象引用。 对象引用是指变量中存储的指向对象内存地址…

vue项目文件夹介绍

目录 Vue项目目录结构 项目介绍: node_modules 文件及子目录 src目录 assets 文件夹 components 文件夹 实例:简单的注册并使用组件 Vue项目目录结构 项目介绍: node_modules 文件及子目录 这个文件夹里面全部都是node的一些基础的依赖包&#xff0c;当我们拓展的安…

[Python图像处理] 使用OpenCV创建色调图

使用OpenCV创建色调图 色调映射和高动态范围成像应用色调映射相关链接 色调映射和高动态范围成像 高动态范围 (High Dynamic Range, HDR) 技术用于摄影成像&#xff0c;以再现比标准数字成像或摄影技术更大的动态范围的亮度。标准成像技术仅允许在一定范围内区分亮度&#xff…

SAP SHDB VLPOD 录屏带序列号的

考虑到交货单有多种情况 1个行项目 多个数量,需要对应多个序列号 多个行项目,多个数量,需要多个序列号 最终形成的FM如下 FUNCTION ZIF_BDC_VLPOD_RE_S. *"---------------------------------------------------------------------- *"*"本地接口: *…

洛谷p6771太空电梯

完全背包变形&#xff0c;外加排序&#xff0c;要学会变通&#xff0c;本题特殊之处&#xff1a;背包容量就是背包价值&#xff0c;要求的就是最大的背包容量&#xff0c;这需要我们找到真正的限制条件—物品数量和物品放置的限高 题目链接 AC code #include<bits/stdc.h&…

C++病毒【永久性】

我最近发现&#xff0c;我2024年后就再也没有更新过 C#沙雕程序了。 今天我想通了&#xff0c;我要再更几期关于C#沙雕程序的文章。 开始做&#xff01; 这一次就直接上代码蚌&#xff01; 不用任何特定头文件。 #include <bits/stdc.h> #include <iostream> #…

JAVA基础整理(11)swagger

添加依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId&…

探索设计模式的魅力:精准解读桥接模式-用桥接模式构建可扩展的软件系统

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 目录 一、了解桥接模式&#xff1a;探索抽象和实现的分离 1.1 开-闭原则 1.2 组合/聚合复用原则 1.3 定义 1.4 用意 1.5 基本思想 1.6 组成部分 1.7 桥梁模式的示意性系统的结构图 二、桥接模式的优势&#xff1a…

SQL布尔盲注、延迟注入和堆叠注入

什么是盲注 盲注的本质是猜解(所谓“盲”就是在你看不到返回数据的情况下能通过 “感觉” 来判断)&#xff0c;那能感觉到什么?答案是 : 差异(包括运行时间的差异和页面返回结果的差异 ) 原理 在页面中&#xff0c;如果正确执行了SQL语句&#xff0c;则返回一种页面&#x…

Linux防火墙相关命令(开启防火墙、关闭防火墙、添加ip白名单等)

查看防火状态systemctl status firewalld service iptables status暂时关闭防火墙systemctl stop firewalld service iptables stop永久关闭防火墙systemctl disable firewalld chkconfig iptables off启动防火墙systemctl start firewalld重启防火墙systemctl enable firewa…

前端开发中不同语言【react-i18next】

目录 查看并设置语言 单页面&#xff1a;html lang ​编辑 浏览器 自定义翻译&#xff1a;react-i18next 设置 模块&#xff1a;staticData.ts 散(重复利用)&#xff1a;命名空间.json 应用 准备 html标签 查看并设置语言 单页面&#xff1a;html lang 英语: <…

自然人和法人区别

自然人是指在自然状态下出生的人&#xff0c;具有自然生物属性&#xff0c;是民法上的民事主体。自然人在民事法律关系中具有权利主体资格&#xff0c;享有民事权利并承担民事义务。每一个自然人都有自己的民事主体资格&#xff0c;具有独立的人格和民事权利能力&#xff0c;能…

k8s 部署 nocas 同时部署mysql

使用 ygqygq2 的 helm 模板部署 官方地址&#xff1a;https://artifacthub.io/packages/helm/ygqygq2/nacos 添加 helm 仓库 helm repo add ygqygq2 https://ygqygq2.github.io/charts/下载 helm 安装文件 helm pull ygqygq2/nacos解压 tar -zxvf nacos-2.1.6.tgz执行 hel…

移动端基础-vw适配

什么是vw 相对单位 相对视口的尺寸 vw:viewport width 换算 1vw1/100视口宽度 vw不需要向rem一样检查视口宽度 若视口宽为375px 1vw3.75px vw与vmin的区别 vmin更照顾横竖屏问题 1vw是视口宽度的100%&#xff0c;而vmin是找宽度和高度中最小的那个&#xff0c;这样横屏…

RFID快递物流包装仓储管理与追踪解决方案

RFID技术在快递物流、包装和仓储管理领域有着广泛的应用&#xff0c;通过为每个货物、托盘、周转箱、围板箱等物品添加RFID标签&#xff0c;为它们赋予独特的身份识别码&#xff0c;并通过RFID读写器在各个仓储业务节点进行管理和追踪&#xff0c;RFID技术具有远距离快速识别的…

CSS 闪电按钮效果

<template><view class="const"><div class="voltage-button"><button>闪电按钮</button><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox=&q…