2010-03-29 60 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