这里就直接贴代码了
package com.lh.common.util.permutation; import java.util.ArrayList; import java.util.List; import com.rd.ifaes.common.exception.BussinessException; /** * 统计任三出现的最多的几率的组合 * * @author lh * @date 2016-8-12 */ public class Copy2OfStatisAnyThree { // 组合算法 // 本程序的思路是开一个数组,其下标表示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 static void main(String[] args) { Copy2OfStatisAnyThree s = new Copy2OfStatisAnyThree(); s.printAnyThree(); } /** * */ public void printAnyThree() { int[] num = new int[] {0, 1, 2, 3, 4, 5 };//, print(combine(num, 4)); } /** * 从n个数字中选择m个数字 * * @param a * @param m * @return */ public List combine(int[] a, int m) { int n = a.length; if (m > n) { throw new BussinessException("错误!数组a中只有" + n + "个元素。" + m + "大于" + 2 + "!!!"); } List result = new ArrayList(); int[] bs = new int[n]; for (int i = 0; i < n; i++) { bs[i] = 0; } // 初始化 for (int i = 0; i < m; i++) { bs[i] = 1; } boolean flag = true; boolean tempFlag = false; int pos = 0; int sum = 0; // 首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边 do { sum = 0; pos = 0; tempFlag = true; result.add(print(bs, a, m)); for (int i = 0; i < n - 1; i++) { if (bs[i] == 1 && bs[i + 1] == 0) { bs[i] = 0; bs[i + 1] = 1; pos = i; break; } } // 将左边的1全部移动到数组的最左边 for (int i = 0; i < pos; i++) { if (bs[i] == 1) { sum++; } } for (int i = 0; i < pos; i++) { if (i < sum) { bs[i] = 1; } else { bs[i] = 0; } } // 检查是否所有的1都移动到了最右边 for (int i = n - m; i < n; i++) { if (bs[i] == 0) { tempFlag = false; break; } } if (tempFlag == false) { flag = true; } else { flag = false; } } while (flag); result.add(print(bs, a, m)); return result; } private int[] print(int[] bs, int[] a, int m) { int[] result = new int[m]; int pos = 0; for (int i = 0; i < bs.length; i++) { if (bs[i] == 1) { result[pos] = a[i]; pos++; } } return result; } private void print(List l) { for (int i = 0; i < l.size(); i++) { int[] a = (int[]) l.get(i); for (int j = 0; j < a.length; j++) { System.out.print(a[j] + "\t"); } System.out.println(); } } }
package com.lh.common.util.permutation; import java.util.ArrayList; import java.util.List; import com.rd.ifaes.common.exception.BussinessException; /** * 排列组合工具类 * @version 3.0 * @author lh * @date 2016年8月12日 */ public class PermutationUtils { static final int [] NUM_1 = {1}; static final int [] NUM_2 = {1, 2}; static final int [] NUM_3 = {1, 2, 3}; static final int [] NUM_4 = {1, 2, 3, 4}; static final int [] NUM_5 = {1, 2, 3, 4, 5}; static final int [] NUM_6 = {1, 2, 3, 4, 5, 6}; static final int [] NUM_7 = {1, 2, 3, 4, 5, 6, 7}; static final int [] NUM_8 = {1, 2, 3, 4, 5, 6, 7, 8}; static final int [] NUM_9 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; /** * 排列组合计算 * @author lh * @date 2016年8月12日 * @param count 组合元素数量 * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static List calculate(int count){ if(count > 9){ throw new BussinessException("Currently does not support large digits"); } int [] numdefault = getNumDefault(count); int [] numarray = new int[count]; switch (count) { case 1: numarray = NUM_1; break; case 2: numarray = NUM_2; break; case 3: numarray = NUM_3; break; case 4: numarray = NUM_4; break; case 5: numarray = NUM_5; break; case 6: numarray = NUM_6; break; case 7: numarray = NUM_7; break; case 8: numarray = NUM_8; break; case 9: numarray = NUM_9; break; default: break; } Copy2OfStatisAnyThree s = new Copy2OfStatisAnyThree(); List list = new ArrayList(); list.add(numdefault); for (int i = 1; i < count; i++) { list.addAll( reset(s.combine(numarray, i), count)); } list.add(numarray); return list; } /** * 重新归位 * @author lh * @date 2016年8月12日 * @param l * @param numdefault * @param len * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) private static List reset(List l, int len) { List list = new ArrayList(); for (int i = 0; i < l.size(); i++) { int[] b = getNumDefault(len); // 填充值 int[] a = (int[]) l.get(i); for (int j : a) { b[j - 1] = j; } list.add(b); } return list; } /** * 给定数组默认值 * @author lh * @date 2016年8月12日 * @param count * @return */ public static int[] getNumDefault(int count){ int[] b = new int [count]; for (int k = 0; k < b.length; k++) { b[k] = 0; } return b; } }
测试用例如下:
package com.lh.common.util.permutation; import java.util.List; import org.junit.Test; public class PermutationUtilsTest { /** * 排列组合 * * @author LH * @date 2016年8月12日 */ @SuppressWarnings("rawtypes") @Test public void testPermutation() { int count = 4; System.out.println(Math.pow(2d, Double.valueOf(count))); List list = PermutationUtils.calculate(count); System.out.println("list.size=" + list.size()); print(list); } @SuppressWarnings("rawtypes") private static void print(List l) { for (int i = 0; i < l.size(); i++) { int[] a = (int[]) l.get(i); for (int j = 0; j < a.length; j++) { System.out.print(a[j] + "\t"); } System.out.println(); } } }
The end!
相关推荐
排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。
本资源附带文档解释了排列组合算法的实现和原理。其中排列算法是基于递归实现的,组合算法是基于高效的位移法实现的。代码是使用Java版实现的。
从n个数组中取出所有排列组合(Java实现)
6位数,共有几种排列组合的算法,java实现
Java排列组合_组合算法,利用list及set的无序性, 通过递归实现,不同于以往的排列组合 自娱自乐
排列与组合的Java递归实现.doc
主要为大家详细介绍了JAVA实现abc字符串的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
此外,文档还提供了各种排列组合算法的详细代码示例和实现细节,包括递归和迭代方法。文档还涵盖了高级主题,如如何计算有重复元素的排列组合数量,以及如何优化这些算法的性能。 无论您是Java编程的初学者还是有...
主要为大家详细介绍了Java实现多个数组间的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
无需随机数动态从n个数组中取出所有排列组合(Java实现),效率高
只需改变里面一处数据,就可以根据自己需要,执行输出n个数中取m个数的所有组合。
主要为大家详细介绍了高效的java版排列组合算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
介绍了几种用JAVA实现的排列组合算法,有需要的朋友可以参考一下
主要为大家详细介绍了java实现字符串排列组合问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
所使用的算法应该是效率最高的算法,而且这两个类都只是对需要排列组合的数组的下标进行处理,所以能对任何类型的数组进行排列组合。
主要介绍了Java实现字符数组全排列的方法,涉及Java针对字符数组的遍历及排序算法的实现技巧,需要的朋友可以参考下
{a,b,c,d} {1,2} {g} {q,w,e} 分别从每个数组中取出一个值, 然后组合.({a,1,g,q} {a,2,g,q}... ...)
我得意之作,采用递归实现。排列组合。希望对大家有用。@TTgdz
该代码实现功能为数学中的C(n,m),n为下标,m为上标。
实现了排列组合算法的类(JAVA),实现了排列组合算法的类(JAVA)