2014-11-20 3 views
-1

Я пишу, чтобы спросить, знает ли кто, как это сделать. Мне не нужен код, я бы просто хотел, чтобы логика делала это. Поэтому у меня есть набор {A, B, C, D, E}. Теперь я хочу найти все комбинации операторов or или 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 может быть True или False. Точно так же 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

Спасибо,

+1

Вы говорите, что существуют возможности «2^n-1», которые зависят от того, что ваши элементы находятся в определенном порядке. Таким образом, ваши 'A, B, C, D, E' больше последовательности, чем набор. – khelwood

+0

Число возможностей с присваиваниями удваивается для каждой переменной, поэтому оно равно 2^(2 * n-1), а не 2 * 2^(n-1). – dasblinkenlight

+0

Вы хотите [таблицу истинности] (http://en.wikipedia.org/wiki/Truth_table)? – StackFlowed

ответ

0

Я думаю, что вы хотите сказать, что вы хотите перечислить (возможно распечатать) все различные выражения формы вы описали, для некоторого набора размер n. Поскольку каждый из них можно охарактеризовать набором флагов (= True vs = False в позициях 1 ... n, а And vs Or в позициях 1 ... n - 1), вы можете представлять каждое выражение как целое число с каждым флагом соответствующий одному бинарному биту. Если n имеет значение, для которого можно было бы явно перечислять все возможности, такое целое число будет хорошо соответствовать диапазону Java long. Для удобно возможность перечислять все возможности, такое целое число будет находиться в диапазоне Java int.

Одним из способов продолжения, следовательно, было бы написать способ декодирования целочисленных чисел в выражениях в соответствии с их битовыми шаблонами. Затем вы можете перебирать все соответствующие целые числа (то есть 0 ... (1 << (2 * n)) - 1) и декодировать каждый из них в соответствующее выражение.

0

Если у вас есть, чтобы получить возможную комбинацию из пяти логических значений, вы можете сделать одну вещь -

  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» с тем же счетом.
Смежные вопросы