Java 查找集合的所有逻辑组合
我写信是想问是否有人知道该怎么做。我不需要代码,我只需要做这件事背后的逻辑。我有一个集合{a,B,C,D,E}。现在我想在集合中的值中找到and或or运算符的所有组合 下面是一些例子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 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有一个可以显式枚举所有可能性的值,那么这样的整数将在Javalong
的范围内。为了方便地枚举所有可能性,这样的整数将在Javaint
的范围内
因此,一种方法是编写一种方法,根据位模式将范围内整数解码为表达式。然后,您可以迭代所有适当的整数(即
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”的表达式。我怀疑这是你想做的。