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

У меня есть массив a из 10 логических значений (или, что то же самое, двоичное представление числа ‹ 1024). Я хочу сравнить этот массив с большим набором массивов 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);
}

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

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

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


person Tom    schedule 08.08.2011    source источник
comment
Есть только один способ узнать это - профилировать их!   -  person Jeremy    schedule 08.08.2011
comment
И прежде чем вы это сделаете, профилируйте все приложение, чтобы решить, действительно ли стоит тратить усилия на оптимизацию этого расчета.   -  person Stephen C    schedule 08.08.2011
comment
В Java принято называть метод compare equals, потому что compareTo используется для обозначения порядка, а не равенства. В сигнатуре метода в качестве аргументов используются логические значения, а не массивы логических значений, я думаю, это была ошибка. Я не знаю, что вы представляете массивами логических значений, но в большинстве случаев это плохо, подумайте об использовании байтов для эффективности использования пространства и, возможно, скорости сравнения. Вы можете представить массив из 10 логических значений с 2 ​​байтами и сравнить их, используя операторы & и ~ вместо десяти сравнений.   -  person Gabriel Ščerbák    schedule 08.08.2011


Ответы (5)


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

return ((a1 & ~a2) == 0)
person user883227    schedule 08.08.2011

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

person trashgod    schedule 08.08.2011

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

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

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

person Cassidy Laidlaw    schedule 08.08.2011

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

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

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

person André Puel    schedule 08.08.2011

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

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

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

Меня устраивает.

person Jimmy Ilenloa    schedule 29.05.2015