【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

相关推荐
2502_921286078 分钟前
【企业网络管理】DHCP 与 SAMBA:从协议原理到企业级实战配置全解析
开发语言·php
矮小的方盒10 分钟前
关于大型网站技术演进的思考(一)--存储的瓶颈(1)
开发语言
Maiko Star13 分钟前
Python核心语法——函数
开发语言·python
瓶中怪1 小时前
ROS2 机器人软件系统
linux·c++·python·ubuntu·vmware·ros2·机器人软件开发
大气的小蜜蜂1 小时前
基于Python+Django的健身房管理系统实现:核心亮点全流程解析
开发语言·python·django
天空'之城1 小时前
Linux 系统编程 04:进程基础
linux·开发语言·进程基础
从零开始的代码生活_1 小时前
NAT、代理服务与内网穿透详解
linux·服务器·网络·c++·http·智能路由器
2zcode1 小时前
免费开源项目文档:基于MATLAB图像处理的药片检测与计数系统设计与实现
开发语言·图像处理·matlab
charlie1145141912 小时前
Cinux: 加载第一个内核:从 bootloader 跳进 C++
linux·开发语言·c++·嵌入式
. . . . .2 小时前
Egg框架深入
java·开发语言