高效率的全组合算法(Java版实现)

来源:互联网 发布:icem网络节点怎么设置 编辑:程序博客网 时间:2024/05/18 03:37


 

算法描述:

 

算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种。

当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法。

1表示在该位取,0表示不取。例如,对ABC三个元素进行全组合,  100表示取A,010表示取B,001表示取C,101表示取AC  110表示取AB,011表示取BC,111表示取ABC

注意到表示取法的二进制数其实就是从1到7的十进制数 

推广到对n个元素进行全排列,取法就是从1到2^n-1的所有二进制形式 

要取得2^n,只需将0xFFFFFFFF左移32-n位,再右移回来就可以了。

 

算法实现:

 

Java代码  收藏代码
  1. package com.set.test;  
  2.   
  3. public class SetTest {  
  4.   
  5.     public static void main(String[] args) {  
  6.   
  7.         String str[] = { "A""B""C""D""E" };  
  8.   
  9.         int nCnt = str.length;  
  10.   
  11.         int nBit = (0xFFFFFFFF >>> (32 - nCnt));  
  12.   
  13.         for (int i = 1; i <= nBit; i++) {  
  14.             for (int j = 0; j < nCnt; j++) {  
  15.                 if ((i << (31 - j)) >> 31 == -1) {  
  16.                     System.out.print(str[j]);  
  17.                 }  
  18.             }  
  19.             System.out.println("");  
  20.         }  
  21.   
  22.     }  
  23. }  
 

 

 

分享到:  
自我评价(搞笑) | Hash算法
  • 2010-07-17 17:11
  • 浏览 2225
  • 评论(2)
  • 分类:编程语言
  • 相关推荐
评论
2 楼 sybell 2014-01-28  
1楼的要多循环一次的,结果却一样。
1 楼 yangguo 2010-09-25  
楼主比较蛋疼,代码绕着来写。还有不要在java界搞匈牙利命名法则。

Java代码  收藏代码
  1.  String str[] = { "A""B""C""D""E" };    
  2.                 int nCnt = str.length;  
  3.   
  4. //              int nBit = (0xFFFFFFFF >>> (32 - nCnt));  
  5.   
  6.                 int nBit = 1<<nCnt;  
  7.   
  8.                 for (int i = 1; i <= nBit; i++) {  
  9.                     for (int j = 0; j < nCnt; j++) {  
  10.                         if ((1<<j & i ) != 0) {  
  11.                             System.out.print(str[j]);  
  12.                         }  
  13.                     }  
  14.                     System.out.println("");  
  15.                 }  
0 0
原创粉丝点击