`
xiems
  • 浏览: 9678 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

组合算法 java实现方式

阅读更多

 

import java.util.ArrayList;

import java.util.List;

/**

组合算法(来自互联网,java implement by xiems)

  本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标   

  代表的数被选中,为0则没选中。     

  首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。     

  然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为   

  “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。     

  当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得   

  到了最后一个组合。     

  例如求5中选3的组合:     

  1   1   1   0   0   //1,2,3     

  1   1   0   1   0   //1,2,4     

  1   0   1   1   0   //1,3,4     

  0   1   1   1   0   //2,3,4     

  1   1   0   0   1   //1,2,5     

  1   0   1   0   1   //1,3,5     

  0   1   1   0   1   //2,3,5     

  1   0   0   1   1   //1,4,5     

  0   1   0   1   1   //2,4,5     

  0   0   1   1   1   //3,4,5  

 *

 */

public class CombinationUtil {

public static void main(String[] args) {

//combinate(2, 2);

combinateAll(5);

}

 

/**

* n个数的全组合

* @param n

* @return

*/

public static List<List<Integer>> combinateAll(int n){

List<List<Integer>> resultList = new ArrayList<List<Integer>>();

for (int i = 1; i <= n; i++) {

resultList.addAll(combinate(n, i));

}

return resultList;

}

 

/**

* 从n个数中取m个数的组合

* @param n

* @param m

* @return

*/

public static List<List<Integer>> combinate(int n, int m) {

// 构造初始化字符串,前m位为1,后n-m位为0

String str = "";

for (int i = 0; i < n; i++) {

str += i < m ? "1" : "0";

}

// 最终字符串为后m位为1,前面n-m位为0

String lastStr = str.substring(m) + str.substring(0, m);

// System.out.println(lastStr);

 

List<List<Integer>> resultList = new ArrayList<List<Integer>>();

resultList.add(getIndex(str));

//System.out.println(getIndex(str));

while (!str.equals(lastStr)) {

// 取到第一个10

int index = str.indexOf("10");

// 转换10为01

String suff = "01" + str.substring(index + 2);

// 取10前的字符串

String pre = str.substring(0, index);

// 统计1的个数,用于重新构造前字符串

int count = 0;

for (int i = 0; i < pre.length(); i++) {

if (pre.charAt(i) == '1') {

count++;

}

}

// 重新构造前字符串

String newPre = "";

for (int i = 0; i < pre.length(); i++) {

newPre += i < count ? "1" : "0";

}

str = newPre + suff;

resultList.add(getIndex(str));

}

return resultList;

}

 

/**

* 显示下标组合

* @param str

* @return

*/

private static List<Integer> getIndex(String str) {

List<Integer> indexList = new ArrayList<Integer>();

for (int i = 0; i < str.length(); i++) {

if (str.charAt(i) == '1') {

indexList.add(i);

}

}

System.out.println(indexList);

return indexList;

}

}

 

0
0
分享到:
评论

相关推荐

    6位数,共有几种排列组合的算法java实现

    6位数,共有几种排列组合的算法,java实现

    Java排列组合算法分析和代码实现

    本资源附带文档解释了排列组合算法的实现和原理。其中排列算法是基于递归实现的,组合算法是基于高效的位移法实现的。代码是使用Java版实现的。

    排列组合算法实现

    排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。

    Java排列组合_组合算法

    Java排列组合_组合算法,利用list及set的无序性, 通过递归实现,不同于以往的排列组合 自娱自乐

    Pairwise Testing算法的java实现

    一个已经关闭的googlecode项目,基于正交法对Pairwise Testing算法进行的java实现,具体说明见内部文档

    实现了排列组合算法的类(JAVA).rar

    所使用的算法应该是效率最高的算法,而且这两个类都只是对需要排列组合的数组的下标进行处理,所以能对任何类型的数组进行排列组合。

    [Java算法设计] - 排列组合.java

    此外,文档还提供了各种排列组合算法的详细代码示例和实现细节,包括递归和迭代方法。文档还涵盖了高级主题,如如何计算有重复元素的排列组合数量,以及如何优化这些算法的性能。 无论您是Java编程的初学者还是有...

    关于各种排列组合java算法实现方法

    介绍了几种用JAVA实现的排列组合算法,有需要的朋友可以参考一下

    组合算法JSP程序

    组合算法JSP程序,以java算法为基础,描述组合算法的运行机制和实现

    基于java国密SM系列加解密算法

    基于java的国密SM系列加解密算法,包含SM1、SM2、SM3、SM4的加解密java实现

    用java实现的大数据分析 ID3算法

    不同的天气因素组合会产生两种后果,也就是分成2类:能进行活动或不能。我们用P表示该活动可以进行,N表示该活动无法进行。 下表描述样本集合是不同天气因素对该活动的影响。 Attribute class outlook ...

    经典java组合算法源码--TryCombination(算法源码)

    System.out.println("对整数数组进行组合:C(n,n)"); int[] intArray=new int[4]; for(int i=0;i;i++){ intArray[i]=i+1; } System.out.println("对整数数组进行组合:C(4,4)"); Combination ...

    全组合的递归实现JAVA

    全排列的非递归实现。输入1,2,3 得到 [1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]六种组合

    [Java算法-排序练习]有序数组合并.java

    文档中涵盖了有序数组合并的基本概念,包括如何将两个有序数组合并为一个,以及如何在Java中实现合并有序数组。此外,文档还包括一个逐步指南,介绍了如何在Java中实现合并有序数组,包括详细的代码示例和实现细节。...

    数据挖掘18大算法实现以及其他相关经典DM算法

    CART算法的全称是分类回归树算法,他是一个二元分类,采用的是类似于熵的基尼指数作为分类决策,形成决策树后之后还要进行剪枝,我自己在实现整个算法的时候采用的是代价复杂度算法,详细介绍链接 KNN K最近邻算法...

    java 实现有数量不限的面值为100,50,20,10,5,1元的纸币,问要组成N(N<=10^6)共有多少种组合方式

    java 实现有数量不限的面值为100,50,20,10,5,1元的纸币,问要组成N(N^6)共有多少种组合方式;其中包括了爆搜的方法和动态规划的方法

    Java实现字符数组全排列的方法

    主要介绍了Java实现字符数组全排列的方法,涉及Java针对字符数组的遍历及排序算法的实现技巧,需要的朋友可以参考下

    Java词频统计算法(使用单词树)

    用Java实现的词频统计,代码。为了统计词汇出现频率,最简单直接的做法是另外建一个Map:key是单词,value是次数。将文章从头读到尾,读到一个单词就到Map里查一下,如果查到了则次数加一,没查到则往Map里一扔。...

    java 24点小游戏算法

    网上找了些java实现24点小游戏的算法,看了一下,头都晕了! 自己写了一个类,各位可以看一下思路,如果需要的话,只要实例化PointGame类并在构造方法里传递参与计算的四个数字和需要的结果就好了,然后调用get...

    Java实现归并排序算法(源代码)

    在Java实现中,归并排序通过递归调用mergeSortHelper方法将数组划分为更小的子数组,并在最后使用merge方法将有序子数组合并成一个完整的数组。归并排序虽然需要额外的空间来存储临时数组,但其稳定的性能和可并行化...

Global site tag (gtag.js) - Google Analytics