輸出給定集合的所有真子集的三種方法之比較

問題描述:

給定一個輸入集合,輸出所有的真子集

問題解法:

   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




                            




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章