我在 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);
}
}
最佳答案
如果幂集中有三个项目,则有 2^3 种组合。
a, b, c
===
[]
[a]
[b]
[a, b]
[c]
[a, c]
[b, c]
[a, b, c]
您会注意到,这遵循二进制模式,其中每个位都与集合中的一个元素相匹配。如果位是 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/