Leetcode2166-设计位集

在处理大规模布尔数组时,我们经常面临空间和时间效率的双重挑战。

如果用普通的 boolean 数组,每个元素至少占用 1 字节,当数据量达到百万级别时,内存开销会非常可观。

而位集合(Bitset)通过将每个布尔值压缩为一个比特位,可以将空间占用降低到原来的 1/32。

以下是一个支持延迟翻转优化的高效 Bitset 实现。

代码

java 复制代码
	class Bitset{

		private int[] set;//整形数组,用于存储位信息
		private final int size;//位集合的逻辑大小(用户视角的位数)
		private int zeros;//统计当前值为0的位的数量
		private int ones;//统计当前值为1的位的数量
		private boolean reverse;//反转标志

		//构造函数
		public Bitset(int n){
			set = new int[(n+31)/32];
			size = n;
			zeros = n;
			ones = 0;
			reverse = false;
		}

		public void fix(int i){
			int index = i/32;
			int bit = i%32;
			if(!reverse){
				//正常模式reverse=false,将0改为1
				if((set[index]&(1<<bit))==0){
					zeros--;
					ones++;
					set[index]|=(1<<bit);
				}
			}else{
				//反转模式reverse=true,将1改为0
				if((set[index]&(1<<bit))!=0){
					zeros--;
					ones++;
					set[index]^=(1<<bit);
				}
			}
		}

		public void unfix(int i){
			int index = i/32;
			int bit = i%32;
			if(!reverse){
				//正常模式reverse=false,将1改为0
				if((set[index]&(1<<bit))!=0){
					ones--;
					zeros++;
					set[index]^=(1<<bit);
				}
			}else{
				//反转模式reverse=true,将0改为1
				if((set[index]&(1<<bit))==0){
					ones--;
					zeros++;
					set[index]|=(1<<bit);
				}
			}
		}

		//翻转所有位(0变1,1变0)
		public void flip(){
			reverse = !reverse;
			int tmp = zeros;
			zeros=ones;
			ones = tmp;
		}

		//检查是否全为1
		public boolean all(){
			return ones == size;
		}

		//检查是否至少有一个1
		public boolean one(){
			return ones>0;
		}

		//返回1的数量
		public int count(){
			return ones;
		}

		//将位集合转换为字符串表示
		public String toString(){
			StringBuilder builder = new StringBuilder();
			for(int i=0,k=0,number,status;i<size;k++){
				number = set[k];
				for(int j=0;j<32&&i<size;j++,i++){
					status = (number>>j)&1;
					status ^= reverse?1:0;
					builder.append(status);
				}
			}
			return builder.toString();
		}

	}
相关推荐
罗西的思考19 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营21 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia1 天前
Mybatis的日志输入
java
亦暖筑序1 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户298698530141 天前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao1 天前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿1 天前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试