算法分析与设计-减治法3:生成子集的减治算法及二进制法

子集问题是指生成一个集合的全部子集(2^n个,包括空集和全集),今年实验室一个去高盛的同学在技术面中被问到了这个问题,另外记得还有一个快排的时间复杂度证明(这个更难,就算了,有时间去看看算法导论怎么证明的)



算法1:减一治策略

有了减治生成排列的经验,相信对于子集来说,用减治法来思考就更加简单了。

如果有了n-1个元素的全部子集项{ 2^(n-1) 项},那么n个元素的全部子集首先包含这已经有的n-1个元素的全部子集,另外还包括把第n个元素加到每一个子集项里面去生成的子集项{ 也是2^(n-1) 项  },所以,正好这就有了2^(n-1) + 2^(n-1)  =   2^n项,正是我们要的结果。

为什么说它比排列还简单点呢?因为你只需要把第n个元素加到之前的子集项去就行了,而排列要把它加到一个排列项的不同位置(也就是说原来一个排列项会发展出多个不同的排列项)。

复制代码
  
  
  
public static String[] getSubSet( char [] aaa){
// 从aaa生成子集,放在String数组返回
int Mi = mi2(aaa.length);
String[] result
= new String[Mi];

if (aaa.length == 1 )
{
result[
0 ] = " 空集 " ;
result[
1 ] = aaa[ 0 ] + "" ;
}
else // 减一治递归的生成子集
{
int tempMi = mi2(aaa.length - 1 );
String[] tempResult
= new String[tempMi];
char [] tempaaa = new char [aaa.length - 1 ];
for ( int i = 0 ;i < aaa.length - 1 ;i ++ )
tempaaa[i]
= aaa[i];
tempResult
= getSubSet(tempaaa); // 递归产生前n-1项的子集
char an = aaa[aaa.length - 1 ];

// 从前n-1项的子集产生第n项的子集
for ( int i = 0 ;i < tempResult.length;i ++ )
result[i]
= tempResult[i];
for ( int i = tempResult.length;i < result.length;i ++ )
{
if (tempResult[i - tempResult.length].equals( "
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值