数据结构:位图

概念:位图本质上是个数组,用来存放数组,数组中的元素用来判断某个元素是否存在于这个位图集合中,当元素存在时,对应位的值为1;当元素不存在时,对应位的值为0

我们先判断一下下面的例子:

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

解决方法:

1.遍历

2.先排序,然后二分查找

3.位图解决

我们使用比特位来表示某个数是否存在,一个字节包含包含8个比特位,无符号整数的范围是0到-1,所以需要/8个字节,相比于其他方法非常节省空间

实现主要有三个接口:set、reset、test

复制代码
 template<size_t N>
	class bitset
	{
	public:
		bitset()
		{
			_bs.resize(N / 32 + 1);//一个整形是32个比特位
		}
		void set(size_t x)
		{
			int i = x / 32;//第几位
			int j = x % 32;//对应位的比特位
			_bs[i] = _bs[i] | (1 << j);
		}
		void reset(size_t x)
		{
			int i = x / 32;
			int j = x % 32;
			_bs[i] = _bs[i] & ~(1 << j);
		}
		//x映射位为1返回假,
		//为0返回假
		bool test(size_t x)
		{
			int i = x / 32;
			int j = x % 32;
			return _bs[i] & (1 << j);
		}
	private:
		vector<int> _bs;
	};

那如果给100亿个整数呢,设计算法找出只出现一次的数字,100亿个数字,肯定会有重复出现的数字,所以我们需要稍微修改一下位图,加一位来表示出现次数

这时候再添加一个位图即可,00表示0次,01表示1次,10表示2次及以上

代码如下:

复制代码
	template<size_t N>
	class twobitset
	{
	public:
		void set(size_t x)
		{
			if (!_bs1.test(x) && !_bs2.test(x))
			{
				_bs1.set(x);
			}
			else if (_bs1.test(x) && !_bs2.test(x))
			{
				_bs1.reset(x);
				_bs2.set(x);
			}
			else if (_bs2.test(x) && !_bs1.test(x))
			{
				_bs1.set(x);
			}
		}
		int get_count(size_t x)
		{
			if (!_bs1.test(x) && !_bs2.test(x))
			{
				return 0;
			}
			else if (_bs1.test(x) && !_bs2.test(x))
			{
				return 1;
			}
			else if (_bs2.test(x) && !_bs1.test(x))
			{
				return 2;
			}
			else
			{
				return 3;
			}
		}
	private:
		bitset<N> _bs1;
		bitset<N> _bs2;
	};
相关推荐
蒙奇D索大10 分钟前
【数据结构】图解图论:度、路径、连通性,五大概念一网打尽
数据结构·考研·算法·图论·改行学it
姜行运2 小时前
数据结构【链表】
c语言·开发语言·数据结构·链表
egoist20234 小时前
【C++指南】一文总结C++二叉搜索树
开发语言·数据结构·c++·c++11·二叉搜索树
lidashent4 小时前
数据结构和算法——汉诺塔问题
数据结构·算法
ん贤6 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯
我的sun&shine13 小时前
高级数据结构03RB树
数据结构·b树
_GR16 小时前
2022年蓝桥杯第十三届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯·动态规划
快来卷java16 小时前
常见集合篇(二)数组、ArrayList与链表:原理、源码及业务场景深度解析
java·数据结构·链表·maven
Stardep16 小时前
算法学习11——滑动窗口——最大连续1的个数
数据结构·c++·学习·算法·leetcode·动态规划·牛客网
rigidwill66617 小时前
LeetCode hot 100—二叉搜索树中第K小的元素
数据结构·c++·算法·leetcode·职场和发展