`
hbxflihua
  • 浏览: 678884 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java实现排列组合

    博客分类:
  • java
阅读更多

这里就直接贴代码了

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排列组合算法分析和代码实现

    总之,这个资源包提供了一个很好的平台,让你能够深入理解并实践Java中的排列组合算法。通过学习和理解这些代码,你不仅可以增强算法设计能力,还能提高解决实际编程问题的能力。记得动手实践,结合文档和代码,将...

    从n个数组中取出所有排列组合(Java实现)

    总结来说,从n个数组中取出所有排列组合的Java实现涉及到递归算法、回溯法以及数据结构的操作。理解这些概念并能够熟练运用是成为一名优秀程序员的关键。通过这个例子,我们可以看到如何利用Java的灵活性和表达力来...

    java排列组合算法

    在Java中实现排列组合算法可以帮助我们解决很多实际问题,比如数据排序、数据筛选等。下面将详细介绍排列和组合的基本概念以及在Java中的实现方法。 **排列** 是指从n个不同元素中取出m(m≤n)个元素,按照一定的...

    Java排列组合_组合算法

    本文将深入探讨如何在Java中实现排列组合,特别是基于描述中提到的"利用list及set的无序性"的方法。 首先,让我们理解排列和组合的基本概念。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列...

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

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

    组合排列组合排列组合排列组合排列

    Java中实现排列可以使用回溯法或者迭代法。回溯法是一种试探性的解决问题的方法,当发现某条路径无法达到目标时,就回溯到上一步,尝试其他可能的路径。而迭代法则通常基于索引交换实现,通过遍历所有可能的起始元素...

    Java排列组合算法

    本文将深入探讨Java中实现排列组合算法的方法,帮助开发者更好地理解和运用这些概念。 排列是有序的选择,而组合是无序的选择。在Java中,我们可以使用递归、回溯法或者迭代的方式来实现这两种算法。下面我们将详细...

    Java实现多个数组间的排列组合

    在Java中,实现多个数组间的排列组合可以使用递归算法,通过循环和数组索引来实现排列组合。下面是 Java 实现多个数组间的排列组合的示例代码: ```java public void doExchange(List arrayLists){ int len=...

    排列与组合的Java递归实现.doc

    排列与组合的Java递归实现.doc

    Java排列组合字符串的方法

    下面我们将使用 Java 语言实现排列组合字符串的方法。首先,我们定义一个测试类 `test2`,其中包含一个测试方法 `test3`: ```java import org.junit.Test; import java.util.ArrayList; import java.util.HashSet; ...

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

    在JAVA中实现排列组合,通常会涉及到递归或回溯法。递归是一种解决问题的方法,它将问题分解为更小的子问题,直到子问题足够简单可以直接解决。回溯法则是在遇到困难时退回一步,尝试其他路径,直到找到解决方案。这...

    java m取n 重复 不重复 排列组合 for循环嵌套递归

    根据给定文件的信息,我们可以总结出以下关于Java中m取n排列组合的实现方式,包括重复与不重复的情况,以及如何使用for循环嵌套和递归来实现这些算法。 ### Java中m取n排列组合实现 #### 一、背景介绍 在计算机...

    Java实现abc字符串排列组合

    "Java实现abc字符串排列组合" 本文将详细介绍Java实现abc字符串的排列组合,主要包括可重复排列、全排列和组合三个部分。 可重复排列 在Java中,可以使用递归来实现abc字符串的可重复排列。可重复排列是指从abc三...

    java数组排列组合问题汇总

    在java数组排列组合问题的应用中,我们可以将其应用于面试或笔试中,多次遇到以下四个关于排列组合的手撕算法,可以用统一的模板实现,如下所示: * 无重复元素的数组,求组合 * 有重复元素的数组,求组合 * 无重复...

    算法 排列组合生成器 后端

    2. **业务逻辑层**:实现排列组合的生成算法,可能包括回溯法、动态规划或者Bitmask等高效策略。 3. **数据访问层**:通过Spring Data JPA或JdbcTemplate与H2数据库交互,存储和检索排列组合数据。 4. **筛选功能**...

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

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

    高效的java版排列组合算法

    下面将详细介绍高效的Java版排列组合算法的实现。 一、排列组合算法的概念 排列组合算法是指从n个元素中选择m个元素的所有可能的组合。例如,从5个元素中选择3个元素的排列组合有10种可能的组合:{1,2,3}、{1,2,4}...

    排列组合的算法作业 java

    【排列组合的算法作业 Java】 在编程领域,排列和组合是经典的算法问题,它们属于组合数学的一部分,常常出现在数据结构与算法课程的作业中。排列指的是从给定的元素集合中选择并按特定顺序排列所有可能的组合,而...

    java实现字符串排列组合问题

    Java 实现字符串排列组合问题 Java 是一门广泛应用于软件开发的编程语言,字符串操作是其最基本也是最重要的功能之一。在实际开发中,字符串排列组合问题是非常常见的,例如输入一个字符串,要求输出该字符串中...

Global site tag (gtag.js) - Google Analytics