2010-03-29 4 views
3

저는 A = 문자열 집합과 B = 분리 문자열을가집니다. 바이너리 패턴의 부분 집합을 계산하십시오.

A: 
10001 
10011 
11000 
10010 
10101 

B: 
10001 

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

그래서 난 세트와 문자열을 받아 int를 반환하는 함수가 필요합니다 : 나는 A에서 B에서

예를 발행 수의 수를 계산합니다.

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

것은 편집 : 00000 아무것도의 하위 집합해서는 안됩니다!

+1

이 숙제 문제처럼 들린다. – codingbear

+0

사실, 내 개인 프로젝트에 대해 apriori 알고리즘을 구현하고 싶었습니다. –

답변

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 ... 완벽하게 작동합니다! 감사 ! –

2

당신은 정수로 이러한 문자열을 변환하고 마스크에 대한-와 비트를 할 수있는 :

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

마스크 (mask) == 마스크가 입력 및 마스크보다 우선 순위가 높기 때문에 if (input & 1)와 같습니다. http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence를 참조하십시오. 입력 및 마스크를 괄호로 묶을 수 있습니다. – apandit

2
당신은 바이너리 and 기능을 사용할 수 있습니다

:

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

모두, 패턴되는 listItem을 [ i]는 and을 적용 할 수있는 숫자 데이터 유형이어야합니다.

1

문자열이 모두 길이가 같고 문자 만 0과 1로 구성된다고 가정 할 수 있습니까?

그래, 그렇다면, 이진 문자열을 정수로 변환하는 함수를 찾을 수 있다면, 다른 사람들은 'and'연산을 사용하는 것이 좋습니다. 당신이 입력을 제어 할 수 있고, 이러한 문자열은 정말 비트 마스크를 표현하기 위해 가정하는 경우

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

예 ..이 가정은 만들 수 있습니다 :) –

관련 문제