A={a,b,c},集合A中,产生所有A的子集{},{a},{b},{c},{a,b},{b,c},{a,c}{a,b,c}。
子集产生算法比较直观的有递归算法。
这里介绍另一种算法。
思路是,N个元素的集合S的子集个数为 2 n, 直观上看,就是N个固定位置(socket 0,socket 1.....socket N-1),对应S[0],S[1]...S[N-1];
每个socket里面有两种状态(1: Full/ 0: Null),如此便有2 n种可能组合;
按照此思路并结合编程语言的位操作,便能产生简洁的算法程序。通过移位操作,得到所有的位置组合Pattern
0000..0 to 1111..1, 在通过与(&) 操作,分析每个组合pattern中的"1"的情况,并打印出此"1",对应的元素S[i].
/**
* Author:Dragondwy
* Date:2006/05/26
*/
package dragondwy.dataStructure;
public class SubSet {
public SubSet(){};
public void displaySubSet(char setN[])
{
int length = setN.length;
int i;
for( i=0;i<(1<<length);i++){
System.out.print("{");
for(int j=0;j<length;j++){
if((i&(1<<j))!=0){
System.out.print(setN[j]);
}
}
System.out.print("} ");
}
System.out.println();
System.out.println("Total: "+ i + " Sub sets");
}
/**
* @param args
*/
public static void main(String[] args) {
SubSet ss = new SubSet();
char setN[] = {'a','b','c','d'};
//Assert Result is "{} {a} {b} {ab} {c} {ac} {bc} {abc} {d} {ad} {bd} {abd} {cd} {acd} {bcd} {abcd} "
ss.displaySubSet(setN);
}
}
Output Result:
补充:
集合要求元素不能相同。所以这里使用char[] 数组并不严禁。只是为了示例方便才使用。
正常情况应该使用java的Set类,保证元素没有重复。
子集产生算法比较直观的有递归算法。
这里介绍另一种算法。
思路是,N个元素的集合S的子集个数为 2 n, 直观上看,就是N个固定位置(socket 0,socket 1.....socket N-1),对应S[0],S[1]...S[N-1];
每个socket里面有两种状态(1: Full/ 0: Null),如此便有2 n种可能组合;
按照此思路并结合编程语言的位操作,便能产生简洁的算法程序。通过移位操作,得到所有的位置组合Pattern
0000..0 to 1111..1, 在通过与(&) 操作,分析每个组合pattern中的"1"的情况,并打印出此"1",对应的元素S[i].
/**
* Author:Dragondwy
* Date:2006/05/26
*/
package dragondwy.dataStructure;
public class SubSet {
public SubSet(){};
public void displaySubSet(char setN[])
{
int length = setN.length;
int i;
for( i=0;i<(1<<length);i++){
System.out.print("{");
for(int j=0;j<length;j++){
if((i&(1<<j))!=0){
System.out.print(setN[j]);
}
}
System.out.print("} ");
}
System.out.println();
System.out.println("Total: "+ i + " Sub sets");
}
/**
* @param args
*/
public static void main(String[] args) {
SubSet ss = new SubSet();
char setN[] = {'a','b','c','d'};
//Assert Result is "{} {a} {b} {ab} {c} {ac} {bc} {abc} {d} {ad} {bd} {abd} {cd} {acd} {bcd} {abcd} "
ss.displaySubSet(setN);
}
}
Output Result:
{} {a} {b} {ab} {c} {ac} {bc} {abc} {d} {ad} {bd} {abd} {cd} {acd} {bcd} {abcd} Total: 16Sub sets |
补充:
集合要求元素不能相同。所以这里使用char[] 数组并不严禁。只是为了示例方便才使用。
正常情况应该使用java的Set类,保证元素没有重复。