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

位图(c++)

文章目录

    • 1.位图概念
    • 2.位图的实现
    • 3.应用(解决整形存在或次数问题)
      • 3.1存在问题
      • 3.2次数问题
    • 5.搜索的方法对比:

1.位图概念

和哈希一样,都是一个表来记录某个元素的个数或者存在与否;不同的是哈希使用的计算机定义的完整空间向数组的int类型;而位图则是时使用一个或者多个(不会太多)bit位来表示表示一个数字的个数或者存在与否。

2.位图的实现

第一步定义空间.
位图由于是使用bit位来记录的,但是单个bit位无法开出来,所以我们先可以使用int定义出来空间(即定义一个可以下位图的空间);
在这里插入图片描述
第二步定义类中的接口
构造函数:
在这里插入图片描述
输入函数:
在这里插入图片描述
删除函数:
在这里插入图片描述

查找函数:
在这里插入图片描述
解释i和j:
这里删除函数和输入函数的i表示的是:数x在数组的第几个数;
这里删除函数和输入函数的j表示的是:数x在数组的第i个数的第几个bit位;

代码

	//位图template<size_t N>class bitset{public:bitset(){//_bits.resize(N/32+1,0);_bits.resize((N >> 5) + 1, 0);}void set(size_t x){size_t i = x / 32;size_t j = x % 32;_bits[i] |= (1 << j);}void reset(size_t x){size_t i = x / 32;size_t j = x % 32;_bits[i] &= ~(1 << j);}bool test(size_t x){size_t i = x / 32;size_t j = x % 32;return _bits[i] & (1 << j);}private:vector<int> _bits;};

3.应用(解决整形存在或次数问题)

3.1存在问题

在【42,39】中是否存在39,40,41,42;
头文件和上面的一样

template<size_t N>class bitset{public:bitset(){//_bits.resize(N/32+1,0);_bits.resize((N >> 5) + 1, 0);}void set(size_t x){size_t i = x / 32;size_t j = x % 32;_bits[i] |= (1 << j);}void reset(size_t x){size_t i = x / 32;size_t j = x % 32;_bits[i] &= ~(1 << j);}bool test(size_t x){size_t i = x / 32;size_t j = x % 32;return _bits[i] & (1 << j);}private:vector<int> _bits;};

源文件:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include"bitset.h"
int main()
{bit::bitset<100> bs;bs.set(40);bs.set(39);cout << bs.test(38) << endl;cout << bs.test(39) << endl;cout << bs.test(40) << endl;cout << bs.test(41) << endl;cout << bs.test(42) << endl << endl;return 0;
}

在这里插入图片描述

3.2次数问题

题目:查找【1,4,7,9,44,88,1,4,88,99,78,5,7 ,7,7,7 】中出现一次和两次的数字
对比存在问题需将插入函数和输出函数修改即可修改在下:
头文件:

 template<size_t N>class twobitset{public:void set(size_t x){//00->01//01->10//10->11//11->不变if (_bs1.test(x) == false && _bs2.test(x) == false){_bs2.set(x);}else if (_bs1.test(x) == false && _bs2.test(x) == true){_bs1.set(x);_bs2.reset(x);}else if (_bs1.test(x) == true && _bs2.test(x) == false){_bs1.set(x);_bs2.set(x);}}void Print(){for (size_t i = 0; i < N; i++){if (_bs1.test(i) == false && _bs2.test(i) == true){cout << "1->" << i << endl;}else if (_bs1.test(i) == true && _bs2.test(i) == false){cout << "2->" << i << endl;}}cout << endl;}private:bitset<N> _bs1;bitset<N> _bs2;};

源文件:

int main()
{int a[] = { 1,4,7,9,44,88,1,4,88,99,78,5,7 ,7,7,7 };bit::twobitset<100> bs;for (auto e : a){bs.set(e);}bs.Print();return 0;
}

在这里插入图片描述

5.搜索的方法对比:

在这里插入图片描述

http://www.lryc.cn/news/348922.html

相关文章:

  • 音源分离 | Hybrid Spectrogram and Waveform Source Separation
  • 动态el-form表单以及动态禁用
  • 【Web后端】web后端开发简介_Servlet简介
  • Taylor Francis科技期刊数据库文献去哪里获取
  • C#学习笔记12:Winform网页操作-CefSharp内嵌浏览器
  • NSSCTF | [SWPUCTF 2021 新生赛]babyrce
  • 环保不只是口号,绿葆自助取袋机助力1000多家医院环保行动!
  • DELL服务器配置ILO(idrac)地址、修改管理员密码
  • 如何打造个人IP?
  • 【PostgreSQL支持中文的全文检索插件(zhparser)】
  • SHAP分析交互作用的功能,如果你用的模型是xgboost
  • 瑞友科技质量改进服务事业部总经理张力受邀为第十三届中国PMO大会演讲嘉宾
  • CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷
  • 字符串函数(二):strlen(求长度),strstr(查找子串),strtok(分割),strerror(打印错误信息)
  • EUCR-30S电机保护器施耐德EOCR
  • 人工神经网络(科普)
  • 宇宙(科普)
  • 安防视频/视频汇聚系统EasyCVR视频融合云平台助力智能化酒店安防体系的搭建
  • SpringCloudAlibaba:5.1Sentinel的基本使用
  • SHELL-双重循环习题练习
  • 2024年为什么很多电商商家,都想涌入视频号,究竟是什么原因?
  • Google Gemma 2B 微调实战(IT科技新闻标题生成)
  • RabbitMQ:深入理解高性能消息队列
  • 【北京迅为】《iTOP-3588开发板源码编译手册》-第4章 Android12/Linux设备树简介
  • C++ C# 贝塞尔曲线
  • 勒索软件漏洞?在不支付赎金的情况下解密文件
  • 实时“秒回”,像真人一样语音聊天,GPT-4o模型强到恐怖
  • Properties配置文件和源码
  • redis原生命令及项目使用
  • 使用VSCode生成代码、查询数据表