【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

相关推荐
大黄说说几秒前
C++20 协程从入门到网络服务
开发语言
你是个什么橙2 分钟前
Python入门学习2:Python 基础语法全解析——从代码结构到输入输出
开发语言·python·学习
小白学大数据4 分钟前
Python + 大模型行业资讯自动化摘要流水线完整工程实现方案
开发语言·python·自动化
何以解忧,唯有..12 分钟前
Go语言中的const:常量声明与iota枚举详解
java·开发语言·golang
沪飘大军19 分钟前
goldRush-专门分析黄金的投资理财agent
java·开发语言·elasticsearch
beethobe28 分钟前
PythonQt 学习之旅(一):从零构建 C++ 与 Python 的桥梁
c++·python·学习
鹏易灵32 分钟前
C++——2.常量与 const、constexpr 初识详解
java·开发语言·c++
神仙别闹1 小时前
基于C++ 实现 BP 神经网络
开发语言·c++·神经网络
郝学胜-神的一滴1 小时前
CMake 019:程序生成与清理全解析
开发语言·c++·qt·程序人生·软件构建·cmake
疯狂成瘾者1 小时前
Java 集合 LinkedList 详解:链表结构、常用方法和队列使用
java·开发语言·链表