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

前言

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等领域的问题时,状态压缩技术经常能发挥关键作用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿啄debugIT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值