查找集合的所有逻辑组合

时间:2014-11-20 18:02:24

标签: java algorithm logic combinations permutation

我写信是否有人知道如何解决这个问题。我不需要代码,我只是喜欢这背后的逻辑。所以我有一套{A,B,C,D,E}。现在我想在集合中的值中找到和或运算符的所有组合。

下面的一些例子。

A and B and C and D and E 
A and B and C and D or E
A and B and C or D and E

据我所知,在上述情况下有2 ^ n-1种可能性。因此,在上面的具体示例中,我们将有8种组合。

除了以上之外,集合中的值可以有两种可能性。为简单起见,可以说A可以是真或假。同样地,B,C,D和E.所以我们可能具有以下内容:

A=True and B=True and C=True and D=True and E=True
A=True and B=True and C=True and D=True and E=False
A=True and B=True and C=True and D=True or E=True 

等等。因此,考虑到这一点,我们将有2 ^(2 * n-1)种组合。所以在我们上面的具体例子中,我们将有一组4的16种组合。

是否有算法已经执行此操作?如果不是,任何人都有一些逻辑在Java中实现它

谢谢,

2 个答案:

答案 0 :(得分:0)

我认为你想要枚举(可能是打印)所描述的表单的所有不同表达式,对于某些集合大小n。由于每一个都可以通过一组标志来表征(= 1号位置的真实vs =假... n,以及位置1 ...和n - 1的和vs或者),你可以代表每一个表达式为整数,每个标志对应一个(二进制)位。如果n具有您希望显式枚举所有可能性的值,则此类整数将完全在Java long的范围内。为了舒适地能够枚举所有可能性,这样的整数将在Java int的范围内。

因此,一种方法是编写一种方法,根据位模式将范围内整数解码为表达式。然后,您可以迭代所有适当的整数(即0 ... (1 << (2 * n)) - 1),并将每个整数解码为相应的表达式。

答案 1 :(得分:0)

如果你必须得到五个布尔值的组合,你可以做一件事 -

  1. 迭代从零到二进制值的循环&#34; 11111&#34;。
  2. 在每次迭代中,您将获得0和1的唯一组合。
  3. 将1转换为true,将0转换为false。
  4. 我希望下面的代码会有所帮助:

    import java.util.ArrayList;
    
    public class Test{
    
        public static void main (String[] args)
        {
            ArrayList<boolean[]> result = new ArrayList<boolean[]>();
            int max_num = Integer.parseInt("11111", 2);
            for(int i=max_num; i>=0; i--)
            {
                String val = String.format("%5s", Integer.toBinaryString(i)).replace(' ', '0');
                boolean[] arr = new boolean[5];
                char[] charArray = val.toCharArray();
                for(int j=0; j<charArray.length;j++)
                {
                    if(charArray[j]=='1')
                    {
                        arr[j]=true;
                    }
                    else
                    {
                        arr[j]=false;
                    }
                }
                result.add(arr);
                arr=null;
                val=null;
            }
    
            for(int i=0;i<result.size();i++)
            {
                for(boolean b: result.get(i))
                {
                    System.out.print(b+" ");
                }
                System.out.println();
            }
        }
    }
    

    要更改变量计数:

    1. 用&#34; 11111&#34;替换相同的计数1。例如如果变量计数为6,则应为&#34; 111111&#34;
    2. 更改&#34;%5s&#34;因此。例如如果变量计数为6,则应为&#34;%6s&#34;。
    3. 初始化数组&#34; arr&#34;同样的数。