Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找集合的所有逻辑组合_Java_Algorithm_Logic_Combinations_Permutation - Fatal编程技术网

Java 查找集合的所有逻辑组合

Java 查找集合的所有逻辑组合,java,algorithm,logic,combinations,permutation,Java,Algorithm,Logic,Combinations,Permutation,我写信是想问是否有人知道该怎么做。我不需要代码,我只需要做这件事背后的逻辑。我有一个集合{a,B,C,D,E}。现在我想在集合中的值中找到and或or运算符的所有组合 下面是一些例子 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可以是真的,也

我写信是想问是否有人知道该怎么做。我不需要代码,我只需要做这件事背后的逻辑。我有一个集合{a,B,C,D,E}。现在我想在集合中的值中找到and或or运算符的所有组合

下面是一些例子

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中实现这一点


谢谢,

我想你是说你想列举(也许是打印)你所描述的表单的所有不同的表达式,用于一些设置大小的
n
。由于每个表达式都可以用一组标志(=位置1…
n
处的True vs=False,以及位置1…
n-1
)表示,因此可以将每个表达式表示为一个整数,每个标志对应一个(二进制)位。如果n有一个可以显式枚举所有可能性的值,那么这样的整数将在Java
long
的范围内。为了方便地枚举所有可能性,这样的整数将在Java
int
的范围内


因此,一种方法是编写一种方法,根据位模式将范围内整数解码为表达式。然后,您可以迭代所有适当的整数(即
0
(1),如果您必须获得五个布尔值的可能组合,您可以做一件事-

  • 迭代从零到二进制值“11111”的循环
  • 在每次迭代中,您将得到0和1的唯一组合
  • 将1转换为true,将0转换为false
  • 我希望下面的代码会有所帮助:

    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();
            }
        }
    }
    
    import java.util.ArrayList;
    公开课考试{
    公共静态void main(字符串[]args)
    {
    ArrayList结果=新建ArrayList();
    int max_num=Integer.parseInt(“11111”,2);
    对于(int i=max_num;i>=0;i--)
    {
    String val=String.format(“%5s”,Integer.toBinaryString(i)).replace(“”,'0');
    布尔值[]arr=新布尔值[5];
    char[]charArray=val.toCharArray();
    
    对于(int j=0;j)你说有
    2^n-1
    可能性-这取决于元素的特定顺序。因此你的
    A,B,C,D,E
    更像是一个序列而不是一个集合。每个变量的赋值可能性数量加倍,因此它是2^(2*n-1),而不是2*2^(n-1)另一种方法是用Kel伍德说的:如果你只考虑2个(N-1)(不是2 ^ N-1,BTW)组合,可以通过写“和”或“或”两个变量来形成,那么你就不能形成任何涉及“A或C”的表达式。我怀疑这是你想做的。