我在geeksforgeeks上发现了此功能,以查找给定集合的所有子集。我只是不确定嵌套的for循环中的if语句正在检查什么。我知道它使用按位AND运算符,但是我对它如何帮助知道在任何迭代期间要包含或不包含哪些元素感到困惑。

import java.io.IOException;

public class Main
{
    // Print all subsets of given set[]
    static void printSubsets(char set[])
    {
        int n = set.length;

        // Run a loop for printing all 2^n
        // subsets one by obe
        for (int i = 0; i < (1<<n); i++)
        {
            System.out.print("{ ");

            // Print current subset
            for (int j = 0; j < n; j++)

               //???what is this checking?????
                if ((i & (1 << j)) > 0)
                    System.out.print(set[j] + " ");

            System.out.println("}");
        }
    }

    // Driver code
    public static void main(String[] args)
    {
        char set[] = {'a', 'b', 'c'};
        printSubsets(set);
    }
}

最佳答案

如果Powerset中有三个项目,则有2 ^ 3个组合。

a, b, c
===
[]
[a]
[b]
[a, b]
[c]
[a, c]
[b, c]
[a, b, c]

您会注意到,这遵循二进制模式,其中每个位都与集合中的一个元素匹配。如果bit是0,则将元素从结果中删除。
a, b, c
===
[0, 0, 0] -> [0*a, 0*b, 0*c] = []
[1, 0, 0] -> [1*a, 0*b, 0*c] = [a]
[0, 1, 0] -> [0*a, 1*b, 0*c] = [b]
[1, 1, 0] -> [1*a, 1*b, 0*c] = [a, b]
[0, 0, 1] -> [0*a, 0*b, 1*c] = [c]
[1, 0, 1] -> [1*a, 0*b, 1*c] = [a, c]
[0, 1, 1] -> [0*a, 1*b, 1*c] = [b, c]
[1, 1, 1] -> [1*a, 1*b, 1*c] = [a, b, c]
if ((i & (1 << j)) > 0)行用于检查该位以过滤结果。

关于java - 对此代码如何计算功率集感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54701673/

10-10 13:23