求一个集合的所有子集

今天同学去面试,回来说其中有一道题是输出一个集合的所有子集,一时兴起,在网上上查找了一番,最后自己总结了一下:

两种方法:


1)递归实现

我们假设对于一个集合生成所有子集的函数为F。那么F(1,2,3,4,5)将由两种可能组成:(1)对除1之外的元素组成的集合施加F;(2)对必然包含1在内的所有元素组成的集合施加F。注意:这两种情况是互斥的,所以不可能有情况重复!然后继续递归下去,就能生成最后结果。


具体代码有时间再实现。。。


2)利用二进制

一个集合的子集的个数就等于其所有组合之和,即任选1个元素的集合个数+任选2个元素的集合个数+任选3个元素的集合个数+......+任选N个元素的集合个数,最后结果呢是2的N次方个。既然是2的N次方,我们就可以用二进制位表示,如果某位为1,则表示这个集合中含有这一位所代表的元素。例如一个集合是{1,2,3,4,5},则二进制10011就表示这个集合为{1,4,5}

#include <iostream>
using namespace std;
void subSet(int arr[], const size_t& size)
{
	size_t count = 0;
	for(size_t num = 1 << size; num; --num)
	{
		size_t i = num;
		size_t j = size;
		cout << "{  ";
		while(j > 0)
		{
			if(i & 1)
				cout << arr[size - j] << ", ";
			i = i >> 1;
			--j;
		}
		++ count;
		cout << "\b\b" << "  }" << endl;
	}
	cout << count << endl;
}
int main()
{
	int arr[] = {1,2,3,4,5};
	subSet(arr, sizeof(arr)/sizeof(arr[0]));
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值