public static Vector getPowers( Vector a ) {
Vector ret = new Vector() ;
String one = "" ; if ( a.length() == 0 ) return ret ;
//求全集 [a] [b] [c] [d] 返回 [abcd]
for ( int i = 0 ; i < a.length() ; i ++ ) {
string s = (string) a.get( i ) ;
one += s ;
}
ret.add( one ) ; //减少一个元素调用getPowers重新在求全集
for ( int i = 0 ; i < a.length() ; i ++ ) {
Vector b = a.clone() ;
b.remove( i ) ;
Vector last = getPower( b ) ;
ret.addAll( last ) ;
} return ret ;
}
Vector ret = new Vector() ;
String one = "" ; if ( a.length() == 0 ) return ret ;
//求全集 [a] [b] [c] [d] 返回 [abcd]
for ( int i = 0 ; i < a.length() ; i ++ ) {
string s = (string) a.get( i ) ;
one += s ;
}
ret.add( one ) ; //减少一个元素调用getPowers重新在求全集
for ( int i = 0 ; i < a.length() ; i ++ ) {
Vector b = a.clone() ;
b.remove( i ) ;
Vector last = getPower( b ) ;
ret.addAll( last ) ;
} return ret ;
}
这样的输出有很多元素的
而且就单单求幂集的结果就不对的
不过还是十分感谢为我思考
public static void main(String[] args) {
Vector v= new Vector();
v.add("a");v.add("b");v.add("c");v.add("d");
Object[] o = ff(v);
for(int i=0;i<o.length;i++){
ArrayList a = (ArrayList)o[i];
if(a.size()>0)System.out.println(a);
}
}
public static Object[] ff(Vector v){
ArrayList set = new ArrayList(),
result = new ArrayList();
ff1(1,v,set,result);
Object o[] = result.toArray();
Arrays.sort(o,new Comparator(){
public int compare(Object o1,Object o2){
int a = ((ArrayList)o1).size(),
b = ((ArrayList)o2).size();
return a-b;
}
});
return o;
}
private static void ff1(int i,Vector v,ArrayList set,ArrayList result){
if(i>v.size())result.add(set.clone());
else{
Object o = v.elementAt(i-1);
int count = set.size();
set.add(o);
ff1(i+1,v,set,result);
set.remove(set.size()-1);
ff1(i+1,v,set,result);
}
}
}
public static Vector getPowers( Vector a ) {
Vector ret = new Vector() ;
String one = "" ; if ( a.size() == 0 ) return ret ;
for ( int cnt = 1 ; cnt <= a.size() ; cnt ++ ) {
ret.addAll( getPowers( a , cnt) ) ;
} return ret ;
}
private static Vector getPowers ( Vector a , int cnt ) {
Vector ret = new Vector() ;
int pos[] = new int[cnt] ;
for ( int i = 0 ; i < pos.length ; i ++ ) {
pos[i] = i ;
}
int posMoved = cnt - 1 ;
while ( true ) {
if ( posMoved == -1 )
break ;
ret.add( getItem( a , pos ) ) ;
pos[posMoved] ++ ;
//进位
if ( pos[posMoved] == ( a.size() - ( cnt - posMoved ) + 1 ) ) {
for ( ; posMoved >= 0 ; posMoved -- ) {
if ( pos[posMoved] < ( a.size() - ( cnt - posMoved ) ) ) {
break ;
}
}
if ( posMoved >= 0 ) {
pos[posMoved] ++ ;
for ( int j = 1 ; j < cnt - posMoved ; j ++ ) {
pos[posMoved + j] = pos[posMoved] + j ;
}
posMoved = cnt - 1 ;
}
}
}
return ret ;
}
private static String getItem( Vector a , int[] pos ) {
String ret = "" ;
for ( int i = 0 ; i < pos.length ; i ++ ) {
ret = ret + (String) a.get( pos[i] ) ;
}
return ret ;
}
public static void main( String[] args ) {
Vector b = new Vector() ;
b.add( "A") ;
b.add( "B") ;
b.add( "C") ;
b.add( "D") ;
b.add( "E") ;
b.add( "F") ;
Vector ret = getPowers( b ) ;
System.out.println( "hello every one") ;
Iterator iter = ret.iterator() ;
while( iter.hasNext() ) {
System.out.println( "item="+ iter.next() ) ;
}
}
tyrone98(林林)
我试过了
很对
谢谢你了
for(int i=0;i<15;i++){
System.out.println(i);
Vector v= new Vector();
for(int j=0;j<i;j++)
v.add(String.valueOf(j));
long l1=System.currentTimeMillis();
Object[] o = ff(v);
long l2=System.currentTimeMillis();
System.out.println("ntzls used:"+(l2-l1));
l1=System.currentTimeMillis();
Vector ret = getPowers(v) ;
l2=System.currentTimeMillis();
System.out.println("tyrone98 used:"+(l2-l1));
System.out.println("----------------------------------------------");
}
参考数据:
0
ntzls used:0
tyrone98 used:0
----------------------------------------------
1
ntzls used:0
tyrone98 used:0
----------------------------------------------
2
ntzls used:0
tyrone98 used:0
----------------------------------------------
3
ntzls used:0
tyrone98 used:0
----------------------------------------------
4
ntzls used:0
tyrone98 used:0
----------------------------------------------
5
ntzls used:0
tyrone98 used:0
----------------------------------------------
6
ntzls used:0
tyrone98 used:0
----------------------------------------------
7
ntzls used:0
tyrone98 used:10
----------------------------------------------
8
ntzls used:10
tyrone98 used:10
----------------------------------------------
9
ntzls used:10
tyrone98 used:10
----------------------------------------------
10
ntzls used:10
tyrone98 used:10
----------------------------------------------
11
ntzls used:0
tyrone98 used:20
----------------------------------------------
12
ntzls used:10
tyrone98 used:50
----------------------------------------------
13
ntzls used:30
tyrone98 used:130
----------------------------------------------
14
ntzls used:101
tyrone98 used:330
----------------------------------------------非递归算法应能胜过递归算法的,呵呵
private static String getItem( Vector a , int[] pos ) {
String ret = "" ;
for ( int i = 0 ; i < pos.length ; i ++ ) {
ret = ret + (String) a.get( pos[i] ) ;
}
return ret ;
}
把字符串粘起来的原由吧,而且ArrayList应当比Vector效率要高吧。改完为我们的差别是
0
ntzls used:0
tyrone98 used:0
----------------------------------------------
1
ntzls used:0
tyrone98 used:0
----------------------------------------------
2
ntzls used:0
tyrone98 used:0
----------------------------------------------
3
ntzls used:0
tyrone98 used:0
----------------------------------------------
4
ntzls used:0
tyrone98 used:0
----------------------------------------------
5
ntzls used:0
tyrone98 used:0
----------------------------------------------
6
ntzls used:0
tyrone98 used:0
----------------------------------------------
7
ntzls used:10
tyrone98 used:0
----------------------------------------------
8
ntzls used:0
tyrone98 used:0
----------------------------------------------
9
ntzls used:10
tyrone98 used:0
----------------------------------------------
10
ntzls used:0
tyrone98 used:0
----------------------------------------------
11
ntzls used:0
tyrone98 used:0
----------------------------------------------
12
ntzls used:10
tyrone98 used:10
----------------------------------------------
13
ntzls used:20
tyrone98 used:10
----------------------------------------------
14
ntzls used:70
tyrone98 used:50
----------------------------------------------
15
ntzls used:130
tyrone98 used:100
----------------------------------------------
16
ntzls used:281
tyrone98 used:180
----------------------------------------------
呵呵,好象我的计算机比你快
public static ArrayList getPowers( Vector a ) {
ArrayList ret = new ArrayList() ;
if ( a.size() == 0 ) return ret ;
for ( int cnt = 1 ; cnt <= a.size() ; cnt ++ ) {
getPowers( a , cnt , ret) ;
} return ret ;
}
private static void getPowers ( Vector a , int cnt , ArrayList ret ) {
int pos[] = new int[cnt] ;
for ( int i = 0 ; i < pos.length ; i ++ ) {
pos[i] = i ;
}
int posMoved = cnt - 1 ;
while ( true ) {
ret.add( getItem( a , pos , cnt ) ) ;
pos[posMoved] ++ ;
//进位
if ( pos[posMoved] == ( a.size() - ( cnt - posMoved ) + 1 ) ) {
for ( ; posMoved >= 0 ; posMoved -- ) {
if ( pos[posMoved] < ( a.size() - ( cnt - posMoved ) ) ) {
break ;
}
}
if ( posMoved >= 0 ) {
pos[posMoved] ++ ;
for ( int j = 1 ; j < cnt - posMoved ; j ++ ) {
pos[posMoved + j] = pos[posMoved] + j ;
}
posMoved = cnt - 1 ;
}
if ( posMoved == -1 )
break ;
}
}
}
private static String[] getItem( Vector a , int[] pos , int cnt ) {
String[] ret = new String[cnt] ;
for ( int i = 0 ; i < pos.length ; i ++ ) {
ret[i] = (String)a.get(i) ;
}
return ret ;
}