데이터 구조 빠 른 회고 - 이 진 트 리 해 멱 부분 집합 문제

7377 단어 데이터 구조
역 추적 법 은 디자인 재 귀 를 디자인 하 는 데 자주 사용 되 는 방법 이다. 그의 구 해 과정 은 실질 적 으로 '상태 나무' 를 먼저 옮 겨 다 니 는 과정 이다. 다만 이 나 무 는 옮 겨 다 니 기 전에 미리 만들어 진 것 이 아니 라 옮 겨 다 니 는 과정 에 담 겨 있다.
다음 예 를 들 어 n 개의 요 소 를 포함 하 는 집합 을 구 합 니 다. 집합 A = {1, 2, 3}, {1, 2}, {1, 3}, {1}, {2, 3}, {2}, {3}, {}}; /{} 에 따 르 면 공 집합 은 집합 A 의 모든 요소 의 측면 에서 볼 때 두 가지 상태 만 있 습 니 다. 또는 멱 집합 에 속 하 는 요소 집합 또는 멱 집합 요소 집합 에 속 하지 않 으 면 멱 집합 을 구 하 는 과정 은 집합 A 중의 요 소 를 순서대로 '취', '사' 하 는 과정 으로 볼 수 있 고 이 진 트 리 로 과정 에서 멱 집합 의 변화 상 태 를 나 타 낼 수 있 습 니 다.문제 풀이 사고: 멱 집합 을 구 하 는 과정 은 집합 A 중의 요 소 를 순서대로 취하 거나 버 리 는 과정 으로 볼 수 있다.1. 적당 한 데이터 구 조 를 선택한다. 가설 은 선형 표 로 집합 을 나타 낸다.2. 나무 뿌리 결점 은 멱 집 원소 의 초기 상태 (공 집) 를 나타 내 고, 잎 결점 은 종결 상태 (멱 집의 원소) 를 나타 내 며, i 층 은 전 i - 1 원소 에 대해 취사선택 한 현재 상태 아래 코드 를 나타 낸다.
 1 #include <iostream>
 2 #include <list>
 3 
 4 using namespace std;  5 
 6 //       
 7 void printSet(list<int> p)  8 {  9     size_t num = p.size(); 10     if(!num) 11         cout<<"  
"; 12 else 13 { 14 list<int>::iterator pos = p.begin(); 15 for( ;pos!= p.end() ; pos++) 16 { 17 cout<<(*pos)<<"\t"; 18 } 19 cout<<"
"<<endl; 20 } 21 } 22 23 // n a 24 //a b a 25 // A i-1 26 // i ; i>n , 27 void GetPowerSet(int i,list<int> a,list<int> &b) 28 { 29 int n = a.size(); 30 if(i >= n) 31 printSet(b); 32 else 33 { 34 list<int>::iterator it = a.begin(); 35 int j = 0; 36 while(j++ < i) 37 it++; 38 int tmp = *it; 39 b.push_back(tmp); 40 GetPowerSet(i+1,a,b); 41 b.pop_back(); 42 GetPowerSet(i+1,a,b); 43 } 44 } 45 46 int main(int argc,char* argv[]) 47 { 48 list<int> la,lb; 49 la.push_back(10); 50 la.push_back(3); 51 52 GetPowerSet(0,la,lb); 53 return 0; 54 }

좋은 웹페이지 즐겨찾기