数据结构之位图【原理与实现】

news2024/12/23 16:24:18

文章目录

  • 前言
  • 一、位图bitap是什么?
  • 二、位图的引用场景
    • 1、查询统计、定位查询,排序,去重
    • 2、取两个集合的交集,并集等
  • 三、位图C++实现


前言

bitmap意为位图,它的每一位用于存放状态,适用于大规模并且不重复的数据,判断某个数据是否存在于位图之中。bitmap在数据稠密的时候,非常节省空间,但是在数据稀疏的时候,会有极大的浪费

一、位图bitap是什么?

个int类型占4个字节,也就是32bit,我们用一个int数组来表示时 new int[32],总计占用内存大概32*32bit,如果说我们存放的海量数据,亿万级非常大,那么这些基本数据类型都不够用的,则可以用int字节码的每一位表示一个数字,比如int类型32位,可以存放0-31共32个数值,那么32个数字只需要一个int类型所占内存空间大小就够了,这样在大数据量的情况下会节省很多内存。

就是通过定义一个整形数值后,将原本只表示1个数值的情况下,扩大了可以存放几十个数及以上的结构,比如我们要存放0-63的数,共64个数,那么我们就定义一个long型变量,有8个字节,64位,二进制就是64位,那么每一位从左到右就可以表示0,1,2…,63,如果有数则可以赋值1 没有则表示0 比如保存1,那么就是第二位赋值1 ,以此类推
下面我们演示下,传递一个数值,保存到一个long[] arr数组中,简单了解下:
arr[0]存放的值: 0 - 63
arr[1]存放的值: 64 - 127
arr[2]存放的值: 128 - 191
举例num =4 存放的位置就是 arr[0] 第一个元素 因为 num /64 = 0 ,元素二进制 00…10000 第五位赋值1
在这里插入图片描述

二、位图的引用场景

所以位图bitmap的作用是:
存放海量数据,节省存储空间有明显优势在这里插入代码片

1、查询统计、定位查询,排序,去重

**查询统计:**假设有一个包含1000万个整数的数据集,我们想要知道其中有多少个整数大于等于100。我们可以使用一个位图,位图的长度为100000000(即整数范围),每个位置代表一个整数,如果对应位置的位为1,则表示该整数存在;否则,表示不存在。对于大于等于100的整数,将对应的位置设置为1,其他位置默认为0。最后,通过统计位图中值为1的位的数量,就可以得到大于等于100的整数的数量。

**定位查询:**假设有一个存储用户标签信息的位图,其中每个位置代表一个标签,如果对应位置的位为1,则表示该用户拥有该标签;否则,表示不拥有。当需要查找拥有指定标签的用户时,只需要检查位图中对应位置的位是否为1即可快速定位到拥有该标签的用户。

**去重:**假设有一个包含大量重复元素的数据集,我们需要对这些元素进行去重操作。我们可以使用一个位图,将数据集中的每个元素映射到位图的对应位置,如果对应位置的位为0,则表示该元素不存在;否则,表示已经存在。当遍历数据集时,可以根据位图来判断某个元素是否已经存在,从而实现去重操作。

2、取两个集合的交集,并集等

取两个集合的交集:
对两个位图进行按位与运算,得到新的位图,其中被设置为1的位表示两个集合都包含的元素。

取两个集合的并集:
对两个位图进行按位或运算,得到新的位图,其中被设置为1的位表示两个集合中任意一个集合包含的元素。

在这里插入图片描述

三、位图C++实现

位图实现的包含以下功能:

  • 构造函数:接受一个范围参数 range,创建一个大小适合存储范围内元素的位图。
  • 析构函数:释放位图占用的内存。
  • 初始化函数:将位图中的所有位都设置为0。
  • 增加函数:将给定的数字 num 添加到位图中。这里假设数字的范围在位图的有效范围内。
  • 删除函数:从位图中删除给定的数字 num
  • 查找函数:在位图中查找给定的数字 num,如果存在则返回 true,否则返回 false

注意事项:

  • 位图使用一个 unsigned int 数组来存储位的信息,每个 unsigned int 可以存储 32 个位。
  • 位图的大小由范围参数 range 决定,使用 range / 32 + 1 计算出所需的 unsigned int 数组的大小。
  • 数字 num 在位图中的索引位置由 num / 32 计算得到,表示在哪个 unsigned int 数组上。
  • 数字 num 在位图中的具体位索引由 num % 32 计算得到,表示在该 unsigned int 上的哪个位上。
#pragma once
 
#include <assert.h>
 
class BitMap
{
public:
    //构造函数
    BitMap(const size_t & range) {
        assert(range >= 0);
        if (bits != nullptr) {
            delete[] bits;
        }
        count = range;
        size = range / 32 + 1;
        bits = new unsigned int[size];
    }
    //析构函数
    ~BitMap() {
        delete[] bits;
    }
    //初始化数据,把所有数据置0
    void init() {
        for (int i = 0; i < size; i++)
            bits[i] = 0;
    }
    //增加数据到位图
    void add(const size_t & num) {
        assert(count > num);
        int index = num / 32;
        int bit_index = num % 32;
        bits[index] |= 1 << bit_index;
    }
    //删除数据到位图
    void remove(const size_t & num){
        assert(count > num );
        int index = num / 32;
        int bit_index = num % 32;
        bits[index] &= ~(1 << bit_index);
    }
    //查找数据到位图
    bool find(const size_t & num) {
        assert(count > num);
        int index = num / 32;
        int bit_index = num % 32;
        return (bits[index] >> bit_index) & 1;
    }
//位图相关数据
private:
    unsigned int* bits=nullptr;
    int size;
    int count;
};

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

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

相关文章

服务器数据恢复-EVA存储多块硬盘磁头和盘片损坏离线的数据恢复案例

服务器数据恢复环境&#xff1a; HP EVA某型号存储&#xff0c;存储中一共有23块磁盘&#xff0c;上层映射给一台windows server服务器上。 服务器故障&检测&分析&#xff1a; 该EVA存储上三块硬盘指示灯显示黄色&#xff0c;此时存储设备还能正常工作。运维更换显示黄…

Dell 服务器常见报错信息汇总

Dell 服务器常见报错汇总 如果有别的报错信息欢迎补充

电子烟行业常用的英文表达

1. 电子烟的各种表达 a) 电子烟 i. Electronic-cigarette, ii. Electronic smoke, iii. electronic cigarettes iv. Electric cigarette, v. E-Cigarettes vi. e-cigarette, vii. e-Cig viii. E cigar,e-cigar 电子烟雪茄 2. 电子烟特指词汇及衍生 a) VAPE i. Vapo…

计网第五章(运输层)(一)

在前面的博客中&#xff0c;总是说主机之间进行通信。但实际上通信的真正的实体是位于通信两端主机中的进程。 一、运输层基本概述 运输层的任务就是为运行在不同主机上的应用进程提供直接的通信服务&#xff0c;运输层的协议又称为端到端协议。运输层中使用不同的端口来对应…

ARM接口编程—PWM(exynos 4412平台)

PWM简介 PWM(Pulse Width Modulation)即脉冲宽度调制&#xff0c;通过对脉冲的宽度进行调制&#xff0c;来获得所需要波形 PWM参数 周期 一次高低电平所占用的时间 占空比 一个周期中高电平时间与整个周期的比例称为占空比 PWM工作原理 pwm原理图 由电路原理图可知道蜂鸣…

在Windows系统上用Nginx搭建图片服务器

1、nginx.conf中的配置&#xff1a; server { listen 8088; #server_name localhost; server_name 127.0.0.1 ; #charset koi8-r; #charset utf-8,gbk; charset utf-8; location ~ .*.(gif|jpg|jpeg|png)$ { e…

恒运资本:减肥药概念涨疯了!特斯拉一夜暴涨5800亿市值,汽车股狂飙

今天早盘&#xff0c;A股微幅震荡&#xff0c;主要股指涨跌互现&#xff0c;两市成交呈萎缩趋势。 盘面上&#xff0c;减肥药、轿车、工业大麻、鸡肉等板块涨幅居前&#xff0c;光刻机、稳妥、互联网、知识产权等板块跌幅居前。北上资金净流出1.99亿元。 减肥药概念飙涨 续昨…

动态规划总结(持续更新中……)

注意&#xff1a;我这里定义的所有dp的索引相对于实际问题都是从1开始的&#xff0c;也就是空间长度会比实际大1&#xff0c;这样的好处是在部分题目场景下不需要条件判断也不会越界。 字符串/数组类 区间 1.最长回文子串 dp定义 dp[i][j]表示第i个字符到第j个字符组成的子…

一文了解VR全景,VR全景有哪些优势?

引言&#xff1a; VR全景技术近年来崭露头角&#xff0c;已经成为宣传领域的一大亮点。不仅在娱乐&#xff0c;旅游行业广泛应用&#xff0c;还在商业和教育等领域崭露头角。 一&#xff0e;什么是VR全景&#xff1f; VR全景&#xff0c;全名Virtual Reality Panorama&#x…

Python代码扫描:新一代 Python Linter工具Ruff -极力推荐-快的原因是Rust写的?

目录 RUFF概述 特点 安装和使用 应用场景 配置 编辑器集成 PyCharm(外部工具) Ruff的规则 Ruff速度快的几个原因 最后 注意&#xff1a;后续技术分享&#xff0c;第一时间更新&#xff0c;以及更多更及时的技术资讯和学习技术资料&#xff0c;将在公众号CTO Plus发布…

多线程和并发编程(2)—CAS和Atomic实现的非阻塞同步

在并发编程中实现原子操作可以使用锁&#xff0c;锁机制满足基本的需求是没有问题的了&#xff0c;但是有的时候我们的需求并非这么简单&#xff0c;我们需要更有效&#xff0c;更加灵活的机制&#xff0c;synchronized关键字是基于阻塞的锁机制&#xff0c;也就是说当一个线程…

零代码编程:用ChatGPT来批量删除特定文件

一个文件夹中有很多个文件重复了&#xff0c;重复的文件中都含有“&#xff08;1&#xff09;”这样的字符&#xff0c;需要把所有这些文件批量删除掉。 在ChatGPT中输入如下提示词&#xff1a; 你是一个Python编程专家&#xff0c;写一段代码完成批量删除文件的任务&#xff…

【java】【SSM框架系列】【四】SpringBoot

目录 一、SpringBoot简介 1.1 入门案例 1.1.1 案例 1.1.2 Spring程序与SpringBoot区别 1.1.3 SpringBoot项目快速启动 1.2 SpringBoot概述 二、基础配置 2.1 配置文件格式 2.1.1 配置文件格式&#xff08;3种&#xff09; 2.1.2 配置文件间的加载优先级&#xff08;了解…

电视机顶盒哪个牌子好?拆机达人盘点网络电视机顶盒排名

电视机顶盒哪个牌子好&#xff1f;在挑选电视机顶盒的时候&#xff0c;我们要注意的是盒子的芯片、内存以及系统和操作等等方面全都要衡量&#xff0c;根据我多年拆机经验来说&#xff0c;有些产品存在虚标配置、偷工减料等情况&#xff0c;在选购时不懂行可以参考以下网络电视…

【mysql】—— 函数的基本介绍

前言&#xff1a; MySQL是一种常用的关系型数据库管理系统&#xff0c;它提供了许多内置的函数来进行数据操作和处理。本期&#xff0c;我将给大家介绍的就是关于 “函数” 的相关知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;日期函数 &#…

调整Pycharm中代码的字体的大小

注意&#xff1a;是代码的字体大小&#xff0c;不是Pycharm标题栏、状态栏啥的字体的大小。 1、第一步 2、第二步&#xff0c;勾选“用ctrl滚轮”调整字体大小 3、在代码框中&#xff0c;ctrl鼠标滚轮就能调节代码字体大小了。

《程序员职场工具库》认识 OGSM 模型

最近简单学习了一下 OGSM 模型&#xff0c;把一些学习感想给大家分享一下。可能我们用不到这个模型&#xff0c;但是也算是一个小知识点&#xff0c;留个印象也不错。 OGSM 模型是企业战略管理的理论工具。它主要是以下 4 个部分&#xff1a; O&#xff08;Objective&#xf…

ChromeDriver最新版(116.x及最新)下载途径分享

首先查看version&#xff1a;在地址栏输入chrome://version/ 最新版 官方地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/ 选择合适的下载即可 Old 官网&#xff1a;https://chromedriver.chromium.org/downloads 国内镜像 ps:国内镜像没有…

基于C#的图书管理系统数据库设计报告

第一章 问题描述 1.1 图书管理系统简介 本系统利用.NET处理数据库的功能&#xff0c;实现对图书馆信息的管理。主要功能为管理有关读者、出版社、书籍、借阅和管理者的信息等。 本系统的结构分为读者信息管理模块、出版社信息管理模块、书籍信息管理模块、借阅信息管理模块、…

腾讯云轻量应用服务器详细介绍_轻量值得买吗?

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽95元一年、2核2G4M优惠价112元一年&#xff0c;396元三年、2核4G5M带宽168元一年&#xff0c;628元3年、4核8G12M带宽446元一年&#xff0c;…