【问题标题】:Java: How to implement subsets of a subset?Java:如何实现子集的子集?
【发布时间】:2016-11-20 10:24:09
【问题描述】:

以下实现会找到集合的子集,但谁能解释if((i&(1<<j)) > 0) 正在做什么以及出于什么原因?

评论似乎没有帮助并尝试了控制台日志记录,但仍然很难看到它到底在做什么。

//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 one
    for(int i=0; i<(1<<n); i++) {
        System.out.print("{ ");

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

            //(1<<j) is a number with jth bit 1
            //so when we 'and' them with the 
            //subset number we get which numbers
            //are present in the subset and which are not
            if((i&(1<<j)) > 0) {
                System.out.print(set[j] + " ");
            }
        }
            System.out.println("}");
    }
}

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

【问题讨论】:

  • “子集的子集”是什么意思?这会打印给定集合的所有子集(至少对于小型集合,有一次您会用完 int 中的位)。
  • @Thilo 抱歉打错了,意思是集合的子集。

标签: java algorithm set subset


【解决方案1】:

在子集中,每个元素可能存在,也可能不存在。所以每个元素只有两种可能的状态:输入或输出。 1 或 0。如果我们查看从 0 到 2^n -1 的数字的二进制表示,其中 n 是元素的数量,例如当 n=3 时,我们有:

    cba
0 = 000
1 = 001
2 = 010
3 = 011
4 = 100
5 = 101
6 = 110
7 = 111

有 8 个可能的子集,位表示元素是否在子集中。 这是程序使用的想法:

  • 外循环从02^n-1
  • 内循环从0n-1
  • 1&lt;&lt;j 向左移动了 1 j 次。

例如,当i=3 时,它对应于位011。 我们从0 循环到2,将i001010100 进行比较。 对于这些值,表达式 i &amp; (1 &lt;&lt; j) 将被计算为 分别为011 &amp; 001 = 001011 &amp; 010 = 010011 &amp; 100 = 000。 前两个大于 0,最后一个不是。 所以System.out.print(set[j] + " ") 将打印ab

【讨论】:

  • 非常感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多