【问题标题】:Finding all Logical Combinations of a Set查找集合的所有逻辑组合
【发布时间】:2014-11-20 18:02:24
【问题描述】:

我写信是想问是否有人知道该怎么做。我不需要代码,我只想要这样做背后的逻辑。所以我有一个集合 {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) 个组合。因此,在我们上面的具体示例中,我们将有 16 种组合,一组 4 种。

有没有一种算法已经可以做到这一点?如果没有,任何人都会有一些逻辑在 Java 中实现这一点

谢谢,

【问题讨论】:

  • 您说有2^n-1 的可能性-这取决于您的元素处于一个特定的顺序。所以你的A,B,C,D,E 更像是一个序列而不是一个集合。
  • 每个变量赋值的可能性加倍,所以它是 2^(2*n-1),而不是 2*2^(n-1)。
  • 你想要truth table 吗?
  • 另一种表达khelwood所说的方式:如果您只考虑可以通过编写“AND”或“ OR" 两个变量之间,那么你不能形成任何涉及例如的表达式“A 或 C”。我怀疑这是你想要做的。

标签: java algorithm logic combinations permutation


【解决方案1】:

我想你是说你想枚举(也许打印)你所描述的表单的所有不同表达式,对于一些集合大小n。由于每个都可以用一组标志来表征(在位置 1 ...n 处 =True vs =False,在位置 1 ...n - 1 处 And vs Or),您可以将每个表达式表示为整数,每个标志对应一个(二进制)位。如果 n 有一个您希望显式枚举所有可能性的值,那么这样的整数将在 Java long 的范围内。为了舒适地能够枚举所有可能性,这样的整数将在 Java int 的范围内。

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

【讨论】:

    【解决方案2】:

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

    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”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多