Каков наиболее эффективный способ сравнения двух массивов логических значений? - PullRequest
2 голосов
/ 08 августа 2011

У меня есть массив a из 10 логических значений (или, что эквивалентно, двоичное представление числа <1024).Я хочу сравнить этот массив с большим набором массивов <code>b[i] логических значений одинакового размера следующим образом: функция compare(a,b[i]) должна вернуть true, если элементы массива a никогда не равны trueкогда элемент в той же позиции в b[i] равен false.

Как пример в java

boolean compare(boolean a1, boolean a2){
for (int j = 0; j<10; j++) 
   if (a1[j] && !a2[j]) 
      return false;
return true;
}

Есть ли лучшая реализация этой функции?Если рассматривать соответствующее двоичное число как коэффициенты простого разложения целого числа A1 (и A2), эквивалентная функция будет иметь вид

boolean compare (int A1, int A2){
if (gcd(A1,A2)==A1) 
   return true;
else
   return false;
}

с, например, (http://www.java -tips.org/java-se-tips/java.lang/finding-greatest-common-divisor-recursively.html)

int gcd(int a, int b) {
if (b==0) 
   return a;
else
   return gcd(b, a % b);
}

но я не думаю, что это более эффективно (но я могу ошибаться).

У кого-нибудь есть идея?Все предложения приветствуются!

РЕДАКТИРОВАТЬ: я вернусь с некоторым профилированием позже ... Спасибо за все ваши предложения!

Ответы [ 5 ]

8 голосов
/ 08 августа 2011

Я не уверен, BitSet более эффективен, но он должен быть в кратком списке реализаций для профиля.

6 голосов
/ 08 августа 2011

Если вы можете использовать целые числа вместо массивов, почему бы просто:

return ((a1 & ~a2) == 0)
2 голосов
/ 08 августа 2011

Если у вас есть int представление данных, вы можете использовать побитовые операторы:

boolean compare(int a, int b) {
    int c = ~b ^ a;
    return c == 0;
}

Если произойдет какое-либо вхождение ¬b [i] ^ a [i] , с не будет нулем.

2 голосов
/ 08 августа 2011

Если бы вы могли использовать вместо этих целых логических массивов целые числа, вы могли бы использовать побитовые операции:

boolean compare(int a1, int a2) {
  return (a1 | a2) == a2;
}

Я думаю, что это должно работать ...

1 голос
/ 29 мая 2015

Я мог бы звучать как-то не по теме. Тем не менее, кажется, есть встроенный Java-способ сделать это.

java.util.Arrays.equals(blnArray1,blnArray2)

Ссылка: http://www.java -examples.com / compare-two-java-boolean-arrays-example

У меня это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...