2010-03-29 53 views
3

我有一個A =一組字符串和一個B =分開的字符串。我要計數出現次數的數量的B在A.二進制模式的子集計數

例子:

A: 
10001 
10011 
11000 
10010 
10101 

B: 
10001 

result would be 3.(10001 is a subset of 10001,10011,10101) 

所以我需要一個功能,將一組和字符串,並返回一個int。

int myfunc(set<string> , string){ 
int result; 
// My Brain is melting 
return result ; 
} 

編輯: 00000不應成爲任何一個子集!

+1

這聽起來像一個家庭作業的問題。 – codingbear 2010-03-29 20:41:35

+0

實際上沒有,我想爲我的個人項目實現apriori算法:) – 2010-03-30 22:18:32

回答

2

如果你有在輸入控件,這些字符串真的應該代表位掩碼,那麼你可能要保持他們作爲某一類和使用的整數其他人建議的掩碼。否則,如果你堅持以字符串的形式處理它們,並且你將使用相同的一組字符串來搜索多次,那麼你最好將它們轉換爲整數位掩碼。

但是,如果一組字符串只處理一次,那麼最好只檢查一次並手動檢查一次。隨口說說的,是這樣的:

int myfunc(set<string> in, string search){ 
    assert(search.length() <= 32); 
    int result = 0; 
    for(set<string>::iterator iIn = in.begin(); iIn != in.end(); ++iIn) 
    { 
     bool isSubset = true; 
     if (iIn->length() != search.length()) // Is this guaranteed? 
      isSubset = false; 
     for (int iSearch = 0; isSubset && iSearch < search.length; ++iSearch) 
      if (search[iSearch] == '1' && (*iIn)[iSearch] == '0') 
       isSubset = false; 
     if (isSubset) 
      ++result; 
    } 
    return result; 
} 

要不然轉換到長的第一版本:

int myfunc(set<string> in, string search){ 
    int result = 0; 
    long searchInteger = strtol(search.c_str(), NULL, 2); 
    for(set<string>::iterator iIn = in.begin(); iIn != in.end(); ++iIn) 
     if ((strtol(iIn->c_str(), NULL, 2) & searchInteger) == searchInteger) 
      ++result; 
    return result; 
} 
+0

WooooW ...完美的作品!謝謝 ! – 2010-03-29 20:37:07

2

您可以將這些字符串轉換爲整數做位與對面膜:

if ((input & mask) == mask) { 
    /* matches */ 
} 
+0

這相當於if(input&1),因爲mask == mask的優先級高於input&mask。請參閱http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence。可能希望將輸入和掩碼包裹在圓括號中。 – apandit 2010-03-30 21:43:19

2

您可以使用二進制and功能:

if((pattern & listItem[i]) == pattern) 
{ 
    // match 
} 

兩個,模式和的listItem [我]必須是數字數據類型來應用and

1

我們可以假設字符串長度都一樣,只包含字符0和1嗎?

好的,是的,那麼如果你能找到一個函數來將一個二進制字符串轉換爲一個整數,那麼按照其他人所建議的使用'和'操作是一條路。

否則可能是這樣的:

int count = 0; 
for (k=0; k<sizeofA; k++) { 
    for (j=0; j<lengthOfString; j++) 
     if (('1'==B[j]) && ('1' != A[k][j])) break; 
    if (j==lengthOfString) count++; 
} 
+0

是的..這個假設可以做:) – 2010-03-29 19:54:44