2011-08-08 42 views
2

我有一个阵列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); 
} 

但我认为这不是更有效率(但我可能是错的)。

有没有人有想法?欢迎所有建议!

编辑:我会回来一些分析以后...感谢您的所有建议!

+1

只有一种方法可以知道 - 描述它们! – Jeremy

+1

在你做这件事之前,请分析整个应用程序,以确定是否真的值得花费精力优化此计算。 –

+1

在Java中调用compare方法equals是常规的,因为compareTo用于排序而不是相等的概念。该方法的签名有布尔值,而不是布尔数组作为参数,我想这是一个错误。我不知道你用布尔阵列表示什么,但大多数情况下这些都不好,考虑使用字节来提高空间效率和可能的比较速度。你可以用2个字节表示10个布尔值的数组,并用'&'和'〜'运算符来比较它们,而不是10个比较。 –

回答

6

如果你可以用整数代替阵列,为什么不干脆:

return ((a1 & ~a2) == 0) 
8

我不确定BitSet更有效,但它应该放在简要的实现的简短列表中。

2

如果你能有这些布尔数组为整数,而不是,你可以使用按位运算:

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

我认为应该工作...

2

如果你有数据的INT表示,你可以使用按位运算符:

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

如果¬b的任何ocurrence [I]^A [1]发生,ç不会为零。

相关问题