`
duben
  • 浏览: 51647 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

组合算法的实现

阅读更多
  由于河南的一个3.599亿彩票的奇迹,还又由于双色球2亿的派奖,前一阵子与双色球有染,期期都买,泡彩民村比泡javaeye还频繁,天天一有时间就分析出号规律,选号又杀号... ...最多也只中个5块的安慰奖... ...为了杀掉组选中开出概率极小的组合(例如三连号),我写了个组合算法.
  后来总结那摇奖机太假,出球不是自然随机的,但总体来说是公平的,因为那个头奖的产生与福彩出球系统控制密切相关,它要先统计当期销售额,并且在不掏空奖池的前提下选出当期的出球组数.虽然彩票不记名,但是它也能统计出开奖号码来至哪个地区,不让一个地区连续开出特奖,并且彩民也都不知道要开哪一注号.那么昂贵的摇球设备,一个球就1K多... ...除了设备自己的操控,其中多少人为操控又能知多少呢?算来算去最多也就中几个小奖,大奖还真是要靠天命的.所以彩票还是不要太费精力去投入,浅尝辄止最好.
  以下是组合算法的java实现(以5选3为例):
//组合算法
//本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
//代表的数被选中,为0则没选中。
//首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
//然后从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为
//"01"组合,同时将其(在本算法中具体指i的位置)左边的所有"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

import java.util.ArrayList;
import java.util.List;

/**
 * java 代码实现组合的算法
 * 从n个数里取出m个数的组合是n*(n-1)*...*(n-m+1)/m*(m-1)*...2*1 
 * @author dubensong
 *
 */
class Combination {
	/**
	 * @param a:组合数组
	 * @param m:生成组合长度
	 * @return :所有可能的组合数组列表
	 */
	private List<int[]> combination(int[] a, int m) {
		Combination c = new Combination();
		List<int[]> list = new ArrayList<int[]>();
		int n = a.length;
		boolean end = false; // 是否是最后一种组合的标记
		// 生成辅助数组。首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
		int[] tempNum = new int[n];
		for (int i = 0; i < n; i++) {
			if (i < m) {
				tempNum[i] = 1;

			} else {
				tempNum[i] = 0;
			} 
		}
		printVir(tempNum);// 打印首个辅助数组
		list.add(c.createResult(a, tempNum, m));// 打印第一种默认组合
		int k = 0;//标记位
		while(!end) {
			boolean findFirst = false;
			boolean swap = false;
			// 然后从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为"01"
			for (int i = 0; i < n; i++) {
				int l = 0;
				if(!findFirst && tempNum[i] == 1){
					k = i;
					findFirst = true;
				}
				if (tempNum[i] == 1 && tempNum[i + 1] == 0) {
					tempNum[i] = 0;
					tempNum[i + 1] = 1;
					swap = true;
					for(l = 0;l<i-k;l++){       // 同时将其左边的所有"1"全部移动到数组的最左端。
						tempNum[l] = tempNum[k + l];
					}
					for(l = i - k;l < i;l++){
						tempNum[l] = 0;
					}
					if(k == i && i + 1 == n - m){//假如第一个"1"刚刚移动到第n-m+1个位置,则终止整个寻找
						end = true;
					}
				}
				if(swap){
					break;
				}
			}
			printVir(tempNum);// 打印辅助数组
			list.add(c.createResult(a, tempNum, m));// 添加下一种默认组合
		}   
		return list;
	}

	// 根据辅助数组和原始数组生成结果数组
	public int[] createResult(int[] a, int[] temp, int m) {
		int[] result = new int[m];
		int j = 0;
		for (int i = 0; i < a.length; i++) {
			if (temp[i] == 1) {
				result[j] = a[i];
				System.out.println("result[" + j + "]:" + result[j]);
				j++;
			}
		}
		return result;
	}

	// 打印整组数组
	public void print(List<int[]> list) {
    System.out.println("具体组合结果为:");
		for (int i = 0; i < list.size(); i++) {
			int[] temp = (int[]) list.get(i);
			for (int j = 0; j < temp.length; j++) {
				java.text.DecimalFormat df = new java.text.DecimalFormat("00");//将输出格式化
				System.out.print(df.format(temp[j]) + " ");
			}
			System.out.println();
		}
	}

	// 打印辅助数组的方法
	public void printVir(int[] a) {
		System.out.println("生成的辅助数组为:");
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]);
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int[] a = {1,2,3,4,5}; // 整数数组
		int m = 3; // 待取出组合的个数
		Combination c = new Combination();
		List<int[]> list = c.combination(a, m);
		c.print(list);
		System.out.println("一共" + list.size() + "组!");
	}
}
2
0
分享到:
评论

相关推荐

    排列组合算法实现

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

    基于位图的n选m的组合算法实现(C#)

    本项目是基于C#语言实现的n选m组合算法,能够处理各种类型的数据,包括数字、字符串甚至是自定义的对象。下面我们将深入探讨这个算法的实现原理和C#中的关键概念。 首先,组合算法的核心思想是无序性,即选取的m个...

    PHP循环实现组合算法实现

    PHP循环实现组合算法实现,里面主要是一个函数。

    C#实现排列组合算法完整实例

    在实际应用中,我们可以根据需求选择合适的排列组合算法实现。例如,如果对性能有较高要求,可以考虑使用堆栈方法;而在简单示例或调试阶段,循环方法则更为直观。无论哪种实现方式,理解和掌握排列组合的基本概念...

    组合算法|C++实现

    ### 组合算法在C++中的实现 #### 知识点概述 本篇文章将深入探讨一个基于C++语言实现的组合算法案例。该算法能够从一个整数序列中选取特定数量的元素进行组合,并输出所有可能的组合结果。文章首先简要介绍了组合...

    基于c语言排列组合算法

    今天,我们将讨论基于C语言的排列组合算法实现。 一、全排列算法 全排列算法是指生成所有可能的排列的算法。常见的全排列算法有递归算法、分治算法和迭代算法等。在这里,我们将讨论基于C语言的递归算法实现。 1....

    c++ 排列组合算法,代码简单

    ### C++中的排列组合算法实现 #### 1. 排列算法(Permutation) 在C++中,排列算法通常用于生成一组元素的所有可能顺序。在给定的代码中,排列算法通过递归方式实现。其主要步骤包括: - **初始化**: 定义一个数组...

    基于Vue实现电商SKU组合算法问题

    基于Vue实现电商SKU组合算法问题涉及到多个方面,本文将重点探讨以下几个知识点: 1. Vue框架在电商中的应用 Vue是一套构建用户界面的渐进式JavaScript框架,用于构建交互式的Web界面。在电商领域,Vue能够帮助...

    java组合算法

    下面是一个递归版本的组合算法实现: ```java public class Test { public static void printCombinations(int[] nums, int start, ArrayList&lt;Integer&gt; combination) { // 打印当前组合 System.out.println...

    PHP实现多种类型的排列组合算法

    下面将详细讨论PHP如何实现排列组合算法。 首先,排列和组合是离散数学中的基本概念。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列起来,形成不同的排列方式。组合则是指从n个不同元素中不考虑...

    C++实现生成组合算法

    C++实现生成组合算法 在计算机科学和数学中,组合算法是一种常用的算法,用于生成所有可能的组合或子集。下面是 C++ 实现生成组合算法的详细介绍。 一、组合的基本概念 组合是指从一个集合中选出若干元素,按照...

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

    高效实现组合算法的一种方法是位移法,也称为滚动数组法。位移法主要利用位运算来快速生成组合序列,这种方法可以避免大量的重复计算,从而提高效率。在`Combination.java`文件中,你应该能看到这种位移法的实现,它...

    排列组合生成算法

    2. **组合算法实现**: - **组合计数**:组合的数量可以通过组合公式C(n, k) = n! / (k!(n-k)!)计算,其中“!”表示阶乘。 - **深度优先搜索**:同样可以使用递归的深度优先搜索策略来生成组合,每次选择一个元素...

    排列组合算法

    2. **组合算法实现**: - 递归方法:与排列类似,但不考虑元素的顺序,只关心哪些元素被选中。 - 迭代方法:通常使用双重循环,外层循环控制组合的数量,内层循环用于填充组合。 在VS2008环境下,你可以创建一个...

    PHP实现一维数组的组合算法

    PHP实现一维数组的组合算法,欢迎下载和评论。

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

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

    matlab 组合算法参考资料及代码

    组合算法在MATLAB中的应用广泛,它涉及到许多数学和计算机科学的基本概念,如排列、组合、穷举搜索、最优化等。本参考资料旨在提供一种深入理解及实践MATLAB中组合算法的方法。 首先,我们要理解什么是组合算法。...

    4位特定组合算法.rar

    10. **代码实现**:在易语言中实现4位特定组合算法,通常会涉及到“整型变量”、“循环结构”和“位运算”等核心概念,程序员需要编写代码来生成和处理这些4位的组合。 综上所述,4位特定组合算法涵盖了许多计算机...

Global site tag (gtag.js) - Google Analytics