2011-08-08 43 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]發生,ç不會爲零。

相關問題