問題描述:
給定一個輸入集合,輸出所有的真子集
問題解法:
1. 一般的遞歸方法:
2. 通過取元素組合的方法:
集合的真子集不外是集合1,2,... ,n個元素的所有組合;
3. bit 運算方法:
長度爲size的給定集合的真子集的個數爲:pow(2, n) - 1:
循環檢查集合中的每個元素是否在其中出現(位操作);
代碼如下:
#ifndef _ALL_SUBSET_H_
#define _ALL_SUBSET_H_
#include <stdlib.h>
#include <math.h>
#include <iostream>
/*
* recursive print all subset
*
*/
template<class T>
void AllSubset( const T item[], size_t size, T subItem[], size_t subSize, int cur, int depth )
{
if( size == depth )
{
for( int i = 0; i < subSize; i++ )
std::cout<< subItem[i] << " ";
std::cout << std::endl;
return;
}
for( int i = cur; i < size; i++ )
{
cur = i;
for( int j = 0; j < 2; j++ )
{
if( 0 == j )
{
subItem[subSize] = item[i];
AllSubset( item, size, subItem, subSize + 1, cur + 1, depth + 1 );
}
else
{
AllSubset( item, size, subItem, subSize, cur + 1, depth + 1 );
}
}
}
}
/*
* select the combination in item set
*
*/
template<class T>
void SelectCombination( T item[], size_t size, T subItem[], int subSize, int curIdx, int depth )
{
if( subSize > 0 && subSize == depth )
{
for( int i = 0; i < subSize; i++ )
{
std::cout << subItem[i] << " ";
}
std::cout << std::endl;
return;
}
for( int i = curIdx; i < size; i++ )
{
subItem[depth] = item[i];
curIdx = i;
SelectCombination( item, size, subItem, subSize, curIdx + 1, depth + 1 );
}
}
template<class T>
void AllSubset( T item[], size_t size )
{
const int maxSize = 100;
for( int i = 1; i <= size; i++ )
{
T subItem[maxSize] = {0};
SelectCombination( item, size, subItem, i, 0, 0 );
}
}
/*
*
*
*/
template<class T>
void AllSubsetBit( T item[], size_t size )
{
int number = ::pow( (double)2, (double)size );
for( int i = 0; i < number; i++ )
{
for( int j = 0; j < size; j++ )
{
if( i & ( 1 << j) )
{
std::cout << item[j] << " ";
}
}
std::cout << std::endl;
}
}
void TestAllSubset()
{
int item[] = {1, 2, 3, 4, 5};
int subItem[5];
int size = sizeof(item)/sizeof(item[0]);
std::cout << " print all subset by bit method" << std::endl;
AllSubsetBit( item, size );
std::cout << " print all subset by recursive and combination method" << std::endl;
AllSubset( item, size );
std::cout << " print all subset by common recursive method" << std::endl;
AllSubset( item, size, subItem, 0, 0, 0 );
}
#endif