2011-08-08 23 views
2

私は10ブール値のaの配列を持っています(またはそれに相当する数値は< 1024です)。この配列を、次のように同じサイズのブール値の配列b[i]と比較したいと思います。 配列aの要素が決してtrueの要素である場合、関数compare(a,b[i])trueを返します。 b[i]falseです。 Javaのブール値の2つの配列を比較する最も効率的な方法は何ですか?

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

でexempleよう

は、この機能の優れた実装がありますか?一つは整数A1(及びA2)の素数分解の係数であることに対応する2進数を考慮した場合、同等の機能は、例えば持つ

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

これを知る方法は1つだけです。 – Jeremy

+1

これを実行する前に、アプリケーション全体をプロファイルして、この計算を最適化するための努力を実際に費やす価値があるかどうかを判断します。 –

+1

Javaでは、compareToメソッドがequalityよりもむしろ順序付けの概念に使用されるため、compareメソッドをequalsと呼びます。メソッドのシグネチャにはブール値の配列ではなくブール値がありますが、これは間違いでした。私はブール値の配列で何を表現しているのか分かりませんが、そのほとんどは悪いです。空間効率とおそらく比較速度のためにバイトを使うことを検討してください。 2バイトの10個のブール値の配列を表現し、10個の比較の代わりに '&'と '〜'演算子を使って比較することができます。 –

答えて

6

あなたは、配列の代わりに、なぜだけではなく整数を使用できる場合:

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

私は確信していませんBitSetがより効率的ですが、プロファイルの実装の短いリストにあるはずです。

2

あなたの代わりに整数として、これらのブール配列を持つことができれば、あなたはビット演算を使用することができます。

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

は、私はそれが動作するはずだと思う...

2

を使用すると、データのint型の表現を持っている場合は、あなたは¬bのいずれかのocurrenceは、[i]は^ [i]はが発生した場合、Cを

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

:ビット演算子を使用することができますはゼロになりません。