2014-11-20 84 views
-1

我在写信询问是否有人知道如何去做这件事。我不需要代码,我只是喜欢这样做的逻辑。所以我有一套{A,B,C,D,E}。现在我想在集合中的值中找到和或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中实现这个

感谢,

+1

你说有'2^n-1'的可能性 - 这取决于你的元素是在一个特定的顺序。所以你的'A,B,C,D,E'更像是一组序列。 – khelwood 2014-11-20 18:04:53

+0

对于每个变量,赋值可能性的数量加倍,所以它是2 ^(2 * n-1),而不是2 * 2 ^(n-1)。 – dasblinkenlight 2014-11-20 18:06:34

+0

你想要一个[真值表](http://en.wikipedia.org/wiki/Truth_table)吗? – StackFlowed 2014-11-20 18:09:30

回答

0

我觉得你说要枚举(也许是印刷)的你所描述的所有形式的不同表现,一些集大小n。由于每一个标志都可以用一组标志表示(=位置1 ... n,和vs或位置1 ... n - 1上的= True vs = False),因此可以将每个表达式表示为整数,每个标志对应于一个(二进制)位。如果n有一个值,你可以希望明确地列举所有的可能性,那么这个整数将在Java long的范围内。对于舒适的能够列举所有可能性,这样的整数将在Java int的范围内。因此,一种进行处理的方法是编写一种方法,根据其位模式将范围内整数解码为表达式。然后,您可以遍历所有适当的整数(即0 ... (1 << (2 * n)) - 1),并将每个整数解码为相应的表达式。

0

如果你有得到5个布尔值的可能组合,你可以做一两件事 -

  1. 迭代从零到二进制值“11111”的循环。
  2. 在每次迭代中,您将获得0和1的唯一组合。
  3. 将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(); 
     } 
    } 
} 

改变变量计数:

  1. 更换1相同的计数为 “11111”。例如如果变量计数为6,则应为“111111”
  2. 相应地更改“%5s”。例如如果变量计数为6,则应该是“%6s”。
  3. 用相同的数字初始化数组“arr”。