自我算法总结(二)

幂集算法

算法问题:

如果S是有n个元素的集合,s的幂集(powerset)是s的所有可能的子集的集合。例如,如果s=(a,b,c),那么powerset(s)={(),(a),(b),©,(a,b),(a,c),(b,c),(a,b,c)}。写一个算法递归实现powerset(s)。

问题分析:

对于这个问题,对于初学算法的我来说真的想了很久,这个这个递归算法一直在脑子里面循环,一直在想,想他的递归过程,最初我想用矩阵来解决它,使他每次都乘以他的本身的后一位,在只有一个数据的时候,例如a乘以b,c。变成两位的a,b和a,c。然后b乘以c,变成b,c。然后输出三位数的时候,在依次看最后一位,比如a,b。就看b这一位,它后面的是c,所以变成a,b,c。这样就输出了除了空值以外的所有数据项,想法确实很不错,但是我能力有限,并写不出这个过程,在多次的思考下,我选择换一个想法去解决它。之后我发现当你输入的变量值为n时,总会有2^n个输出结果。所以我想到了在写第一个算法的时候用到的递归公式,也是,当你输入的变量值为n时,总会有2 ^n个输出结果。这些输出结果都相同,类似于全是A,然后根据这个算法改动形成新的算法。我们只需要将原有的算法进行筛选,选出我们想要得到的数值。

算法:


import java.util.*;
public class powerSet {
	void TF(int s,int l,String []a,String []b) {
		if(s==l) {
			for(int i=0;i<l;i++) {
				System.out.println(a[i]);
			}
			System.out.println("--------------");
			return;
		}
		a[s]=b[s];
		TF(s+1,l,a,b);       // 第一次调用
		a[s]=" ";
		TF(s+1,l,a,b);      //第二次调用
	}
	public static void main(String []args) {
		// TODO Auto-generated constructor stub
		Scanner sc=new Scanner(System.in);
		int s=0;
		int l=sc.nextInt();
		String []a=new String[l];
		String []b= {"a","b","c","d"};
		powerSet p=new powerSet();
		p.TF(s,l,a,b);
	}

}

算法分析:

这个算法和前面前一个T&&F的算法非常的相似,只是有几个赋值改变了一下,算法过程和前面一样,a[s]=b[s];这个赋值过程完成了类似于a,b,c,d的多变量输出过程。下面的赋值语句a[s]=" ";体现了我们将已经赋值了的a[s]改变成空,使输出时我们我们能够得到单一的a,单一的b,等等。这个递归算法在本函数体里面又连续的调用两次本身的函数体,使得我们能够输出类似于2^n个结果。算法进入第一次调用时输出a,b,c这样的第一组数据,然后在进入第二次调用时,将原本的c赋值为空,这样便使得我们的下次输出变成a,b,空,这时再次第二次的调用,我们将b的值赋值为空,然后将原本在三位置为空的值赋值成c,这样我们便输出了a,空,c。然后再次进入,再次赋值,依次我们便会输出{(a,b,c),(a,b),(a,c),(a),(b,c),(b),(c),()},这个便是输入三个数的运行结果。

                                                               -------------------lonrover
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值