还有比这java状态压缩更通俗易懂的解释?

news2024/12/29 10:29:59

前言

Java中的状态压缩,或者说位运算状态压缩,是一种利用位操作(如位与&、位或|、位异或^、位非~、左移<<、右移>>等)来高效地存储和处理状态信息的技术。这种技术特别适用于那些状态空间不是很大,但直接枚举状态会导致算法复杂度过高的情况。

通过状态压缩,我们可以将多个状态(通常是布尔值,即开/关、真/假、存在/不存在等)压缩到一个整数(如int或long类型)中,从而大大节省存储空间,并且可以利用位运算来快速地进行状态转移和判断。

6eeee0a5a6af4ed0b982930e538d0807.jpg

 通俗解释

想象一下,你有一堆开关,每个开关只有两种状态:开或关。

如果你直接用一个变量来记录每个开关的状态,那么当开关数量很多时,你会需要很多变量。

但是,如果你用一个整数(比如一个int类型,它有32位)来记录这些开关的状态,那么每一位就可以代表一个开关的状态了。

0 表示该位对应的开关是“关”的。

1 表示该位对应的开关是“开”的。

这样,原本可能需要很多变量来记录的状态,现在只需要一个整数就可以了。

而且,通过位运算,你可以很容易地改变某个开关的状态(比如将第n个开关打开或关闭),或者检查某个开关的状态(比如查看第n个开关是开还是关)。

示例

2212 射箭比赛的最大得分

class Solution {
    public int[] maximumBobPoints(int numArrows, int[] aliceArrows) {
        int len = 12;
        int[] ans = new int[0];
        int maxScore = -1;
        for (int i = 1; i < 1 << len; i++) {
            int curScore = 0;
            int curArrowsTotal = 0;
            int[] curArrowsBob = new int[len];
            for (int j = 1; j < len; j++) {
                if ((i >> j & 1) == 1) {
                    curArrowsTotal += aliceArrows[j] + 1;
                    curArrowsBob[j] = aliceArrows[j] + 1;
                    curScore += j;
                }
            }
            if (curArrowsTotal > numArrows) {
                continue;
            }
            if (curScore > maxScore) {
                maxScore = curScore;
                ans = curArrowsBob;
                curArrowsBob[0] = numArrows - curArrowsTotal;
            }
        }
        return ans;
    }
}

假设有三个开关,我们可以用一个int类型的变量来表示它们的状态。比如:

000 表示三个开关都是关的。

001 表示第一个和第二个开关是关的,第三个开关是开的。

110 表示第一个和第二个开关是开的,第三个开关是关的。

1. 检查状态

要检查第三个开关是否打开,我们可以使用位与操作:

int state = 0b011; // 二进制表示,相当于十进制的3

boolean isThirdOn = (state & 0b001) != 0; // 检查第三位是否为1

2. 改变状态

要将第三个开关关闭,我们可以使用位与和位取反操作:

int newState = state & ~0b001; // 将第三位变为0

或者,如果要将第三个开关打开(如果它之前是关的):

int newState = state | 0b001; // 确保第三位为1

3. 遍历所有状态

对于小数量的开关(比如小于等于int的位数),我们还可以遍历所有可能的状态。

这在解决某些算法问题时非常有用,比如回溯算法中枚举所有可能的情况。

总结

状态压缩是一种非常强大的技术,它允许我们在有限的空间内高效地表示和操作大量的状态信息。

在解决诸如图论中的状态压缩动态规划、棋盘问题、游戏AI等领域的问题时,状态压缩技术经常能发挥关键作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务:网关路由和登录校验

续上篇&#xff1a;微服务&#xff1a;服务的注册与调用和OpenFiegn-CSDN博客 参考&#xff1a;黑马程序员之微服务 &#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、网关路由 1. 网关…

苹果注册海外账户|注册海外Apple ID|下载海外App

注册海外apple ID 背景 先前的一直使用的Apple ID注册地区是国内。 但是一些app因地区限制需要海外账户才能下载&#xff0c;因此需要使用海外apple ID。 因此需要注册海外apple ID&#xff08;如美国&#xff09;。 前言 绑定手机号 手机号可以和国内Apple ID一样没关系…

记一次SATA硬盘上电不转问题排查(最终查到和供电线有关)

一、背景 今年把旧的台式机换成了新的台式机&#xff0c;把硬盘挪到新电脑了。 二、问题 把硬盘挪到新电脑后&#xff0c;SSD可以正常使用&#xff0c;但是有个氦气机械盘始终不能用。 三、排查过程 对比实验 做了一些实验&#xff1a; 把硬盘接回旧电脑会正常转&#x…

【轨物洞见】找到技术创新的“真问题”

技术创新是用技术解决真问题&#xff0c;创造真价值。问题是需求&#xff0c;技术是供应&#xff0c;将需求与供应有效连接的能力&#xff0c;是创新力。技术创新的第一步在于找到“真问题”。在找问题之前&#xff0c;我们先了解一下问题是如何产生的。 问题就是期望值与现状之…

eNSP 华为交换机链路聚合

华为交换机链路聚合 链路聚合好处&#xff1a; 1、提高带宽 2、链路冗余 SW_2&#xff1a; <Huawei>sys [Huawei]sys SW_2 [SW_2]vlan batch 10 20 [SW_2]int g0/0/4 [SW_2-GigabitEthernet0/0/4]port link-type access [SW_2-GigabitEthernet0/0/4]port default vl…

ECCV2024|商汤发布3D面部动画系统UniTalker:通过统一模型扩展音频驱动的 3D 面部动画

商汤研究院最新发布了一个先进的3D面部动画系统UniTalker&#xff0c;可以从不同的音频领域生成逼真的面部动作&#xff0c;包括各种语言的清晰和嘈杂的声音、文本到语音生成的音频&#xff0c;甚至伴有背景音乐的嘈杂歌曲。 UniTalker 可以输出多个注释。对于具有新注释的数据…

理解线程id和简单封装原生线程库

一、理解线程id 首先我们要知道给用户提供的线程id不是内核里面LWP&#xff08;轻量级进程id&#xff09;&#xff0c;而是pthread库自己维护的一个唯一值。 我们理解为什么线程id不是内核里面LWP&#xff0c;因为用户没有权限使用内核里面的字段&#xff0c;那是专门给OS管理…

DOM破坏案例

目录 DOM破坏 编码问题 简单闭合""号使用onclick onclick函数 焦点事件 标签使用 限制数字字母 js匿名函数绕过 覆盖 DOM破坏 编码问题 urlcode可以被识别 %16进制 <textarea> 可以解码不能执行 <script>&#59</script> 没有实体编码…

基于asp.net的在线考试系统、基于c#的在线考试管理系统

摘 要 伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;管理系统这一名词已不陌生&#xff0c;越来越多的学校、公司等机构都会定制一款属于自己个…

SpingBoot自动装配原理

一&#xff0c;什么是SpringBoot自动装配 springboot自动装配&#xff1a;一个springboot项目通过扫描类路径下存在的类和各种配置信息自动装配&#xff0c;生成对应的B哦按对象&#xff0c;然后将他们交给spring容器管理。 二、SpringBoot自动装配原理 2.1启动类注解SpringB…

在MAVEN中版本依赖有冲突改怎么处理

1.为什么会出现版本依赖的冲突 如果存在版本冲突&#xff0c;通常可能会引发的报错是ClassNotFoundException、NoSuchMethodError等错误。Maven依赖版本冲突通常是由于间接依赖导致同一个jar包存在多个不同版本。例如&#xff0c;如果B依赖了A的1.0版本&#xff0c;而C依赖了A…

Nginx--防盗链问题

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、什么是盗链 盗链是一种网络行为&#xff0c;指的是一个网站未经授权&#xff0c;直接使用另一个网站资源&#xff08;如图片、视频、音乐、文件等…

人人可以做的RAG检索增强生成实战

AI大模型持续火爆&#xff0c;我作为IT人员从业者也想参与一下&#xff0c;但是奈何大模型的参数太大&#xff0c;动辄上亿的参数需要很大的算力&#xff0c;GPU卡必不可少&#xff0c;对于手头羞涩的小白&#xff0c;不想投几千大洋只为了满足自己的好奇心。这真是个难题。 现…

【车载开发系列】单片机烧写的文件

【车载开发系列】单片机烧写的文件 【车载开发系列】单片机烧写的文件 【车载开发系列】单片机烧写的文件一. 什么是bin二. 什么是Hex三. 什么是Motorola S-record&#xff08;S19&#xff09;四. ELF格式五. Bin与Hex文件的比对六. 单片机烧写文件的本质 一. 什么是bin bin是…

回顾 | 瑞云科技亮相ICIC2024,虚拟仿真实训云平台引关注

2024年8月7日&#xff0c;天津市虚拟仿真学会主办的第二十届智能计算国际会议&#xff08;ICIC2024&#xff09;——虚拟仿真技术交流平行会议暨天津市虚拟仿真学会2024年暑期技术交流会在天津盛大召开。本次大会汇聚来自全国的顶尖专家、学者和行业领袖&#xff0c;共同探讨虚…

Notepad--文本编辑工具 for Mac教程【苹果电脑-简单轻松上手-免费Mac软件推荐】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其拖入应用程序中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试解决“软件已损坏&#xff0c;无法打开”问题&#xff0c;若没有该问题&#xff0c;可…

TI DSP TMS320F280025 Note1:工程模板Template创建

TMS320F280025工程模板Template创建 文章目录 TMS320F280025工程模板Template创建新建一个ccs工程为需要添加的一些文件新建文件夹从c2000中拷贝官方基础文件到工程中cmd链接文件common头文件和源文件headers头文件和源文件库函数文件添加driverlib.lib文件 添加文件的路径文件…

【微信小程序】生命周期

1. 什么是生命周期 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 小程序的应用生命周期函数需要在app.js中进行声明&#xff0c;示例代码如下&#xff1a; 6. 页面的生命周期函数 小程序的页面生命周期函数需要在页面的 .js 文件…

将 hugo 博客搬迁到服务器

1. 说明 在 Ubuntu 22.04 上使用 root 账号&#xff0c;创建普通账号&#xff0c;并赋予 root 权限。 演示站点&#xff1a;https://woniu336.github.io/ 魔改hugo主题: https://github.com/woniu336/hugo-magic 2. 服务器配置 建立 git 用户 adduser git安装 git sudo apt …

蓝图中结构体改变后,要重新创建widget

发现了一个怪现象&#xff0c;在更改结构体后&#xff0c;界面上出不来相应的信息了&#xff0c;断掉传递到界面上的线后&#xff0c;再重新连接&#xff0c;发现错误“只有完全匹配的结构才是兼容的”&#xff0c;删除后&#xff0c;重新创建widget&#xff0c;正常。 如下图…