【C++】位图

文章目录

  • [1. 位图概念](#1. 位图概念)
  • [2. 位图的实现](#2. 位图的实现)
  • [3. 位图的应用](#3. 位图的应用)

1. 位图概念

  1. 面试题

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

    • 遍历,时间复杂度 O(N)

    • 排序 O(NlogN),利用二分查找:logN

    • 位图解决:

      数据是否在给定的整型数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在,如果二进制比特位为 1,代表存在,为 0 代表不存在。

  2. 位图概念

    所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。

2. 位图的实现

cpp 复制代码
template<size_t N>
class bitset
{
public:
	bitset()
	{
		_bits.resize(N / 32 + 1, 0);
	}

	// 把 x 映射的位标记成 1
	void set(size_t x)
	{
		assert(x <= N);

		size_t i = x / 32;
		size_t j = x % 32;

		_bits[i] |= (1 << j);
	}

	// 将 x 映射的位标记成 0
	void reset(size_t x)
	{
		assert(x <= N);

		size_t i = x / 32;
		size_t j = x % 32;

		_bits[i] &= ~(1 << j);
	}

	// 检测位图中 x 是否为 1
	bool test(size_t x)
	{
		assert(x <= N);

		size_t i = x / 32;
		size_t j = x % 32;

		return _bits[i] & (1 << j);
	}

private:
	vector<int> _bits;
};

3. 位图的应用

  1. 快速查找某个数据是否在一个集合中;
  2. 排序 + 去重;
  3. 求两个集合的交集、并集等;
  4. 操作系统中磁盘块标记;
  5. ...

END

相关推荐
三克的油11 分钟前
java-学习1
java·开发语言·学习
j7~17 分钟前
【C++微服务项目开发脚手架】(接口篇一)gflags + gtest + spdlog 接口学习笔记
c++·学习·gtest·项目开发·spdlog·gflags·c++项目微服务开发脚手架
星期八不上发条24 分钟前
智能指针是什么?使用场景,循环引用解决办法,面试回答
开发语言·c++·stl
ao-weilai29 分钟前
Linux网络编程:Socket UDP
linux·服务器·网络·c++
OKkankan33 分钟前
Python 基础进阶(三):从函数、类到 asyncio 与 FastAPI 后端开发实战
开发语言·python
泡海椒1 小时前
jquick-pdf 防止 PDF 内容分页断裂:keepTogether 属性妙用
java·开发语言·pdf
.YM.Z2 小时前
C++——【继承】的底层逻辑与【多态】实现机制
c++·多态·继承
汉克老师2 小时前
GESP2026年9月认证C++三级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
传奇开心果编程3 小时前
【Rust入门练中学】 第1课:从零开始
开发语言·学习·rust