幂集算法
算法问题:
如果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