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

一.利用二进制状态法求排列组合,此种方法比较容易懂,但是运行效率不高,小数据排列组合可以使用

复制代码 代码如下:

import java.util.Arrays;

//利用二进制算法进行全排列
//count1:170187
//count2:291656

public class test {
public static void main(String[] args) {
long start=System.currentTimeMillis();
count2();
long end=System.currentTimeMillis();
System.out.println(end-start);
}
private static void count2(){
int[] num=new int []{1,2,3,4,5,6,7,8,9};
for(int i=1;i<Math.pow(9, 9);i++){
String str=Integer.toString(i,9);
int sz=str.length();
for(int j=0;j<9-sz;j++){
str="0"+str;
}
char[] temp=str.toCharArray();
Arrays.sort(temp);
String gl=new String(temp);
if(!gl.equals("012345678")){
continue;
}
String result="";
for(int m=0;m<str.length();m++){
result+=num[Integer.parseInt(str.charAt(m)+"")];
}
System.out.println(result);
}
}
public static void count1(){
int[] num=new int []{1,2,3,4,5,6,7,8,9};
int[] ss=new int []{0,1,2,3,4,5,6,7,8};
int[] temp=new int[9];
while(temp[0]<9){
temp[temp.length-1]++;
for(int i=temp.length-1;i>0;i--){
if(temp[i]==9){
temp[i]=0;
temp[i-1]++;
}
}
int []tt=temp.clone();
Arrays.sort(tt);
if(!Arrays.equals(tt,ss)){
continue;
}
String result="";
for(int i=0;i<num.length;i++){
result+=num[temp[i]];
}
System.out.println(result);

}
}
}

二.用递归的思想来求排列跟组合,代码量比较大

复制代码 代码如下:

package practice;

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

public class Test1 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Object[] tmp={1,2,3,4,5,6};
// ArrayList<Object[]> rs=RandomC(tmp);
ArrayList<Object[]> rs=cmn(tmp,3);
for(int i=0;i<rs.size();i++)
{
// System.out.print(i+"=");
for(int j=0;j<rs.get(i).length;j++)
{
System.out.print(rs.get(i)[j]+",");
}
System.out.println();

}
}

// 求一个数组的任意组合
static ArrayList<Object[]> RandomC(Object[] source)
{
ArrayList<Object[]> result=new ArrayList<Object[]>();
if(source.length==1)
{
result.add(source);
}
else
{
Object[] psource=new Object[source.length-1];
for(int i=0;i<psource.length;i++)
{
psource[i]=source[i];
}
result=RandomC(psource);
int len=result.size();//fn组合的长度
result.add((new Object[]{source[source.length-1]}));
for(int i=0;i<len;i++)
{
Object[] tmp=new Object[result.get(i).length+1];
for(int j=0;j<tmp.length-1;j++)
{
tmp[j]=result.get(i)[j];
}
tmp[tmp.length-1]=source[source.length-1];
result.add(tmp);
}

}
return result;
}

static ArrayList<Object[]> cmn(Object[] source,int n)
{
ArrayList<Object[]> result=new ArrayList<Object[]>();
if(n==1)
{
for(int i=0;i<source.length;i++)
{
result.add(new Object[]{source[i]});

}
}
else if(source.length==n)
{
result.add(source);
}
else
{
Object[] psource=new Object[source.length-1];
for(int i=0;i<psource.length;i++)
{
psource[i]=source[i];
}
result=cmn(psource,n);
ArrayList<Object[]> tmp=cmn(psource,n-1);
for(int i=0;i<tmp.size();i++)
{
Object[] rs=new Object[n];
for(int j=0;j<n-1;j++)
{
rs[j]=tmp.get(i)[j];
}
rs[n-1]=source[source.length-1];
result.add(rs);
}
}
return result;
}

}

三.利用动态规划的思想求排列和组合

复制代码 代码如下:

package Acm;
//强大的求组合数
public class MainApp {
public static void main(String[] args) {
int[] num=new int[]{1,2,3,4,5};
String str="";
//求3个数的组合个数
// count(0,str,num,3);
// 求1-n个数的组合个数
count1(0,str,num);
}

private static void count1(int i, String str, int[] num) {
if(i==num.length){
System.out.println(str);
return;
}
count1(i+1,str,num);
count1(i+1,str+num[i]+",",num);
}

private static void count(int i, String str, int[] num,int n) {
if(n==0){
System.out.println(str);
return;
}
if(i==num.length){
return;
}
count(i+1,str+num[i]+",",num,n-1);
count(i+1,str,num,n);
}
}

下面是求排列

复制代码 代码如下:

package Acm;
//求排列,求各种排列或组合后排列
import java.util.Arrays;
import java.util.Scanner; public class Demo19 {
private static boolean f[];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int sz=sc.nextInt();
for(int i=0;i<sz;i++){
int sum=sc.nextInt();
f=new boolean[sum];
Arrays.fill(f, true);
int[] num=new int[sum];
for(int j=0;j<sum;j++){
num[j]=j+1;
}
int nn=sc.nextInt();
String str="";
count(num,str,nn);
}
}
/**
*
* @param num 表示要排列的数组
* @param str 以排列好的字符串
* @param nn 剩下需要排列的个数,如果需要全排列,则nn为数组长度
*/
private static void count(int[] num, String str, int nn) {
if(nn==0){
System.out.println(str);
return;
}
for(int i=0;i<num.length;i++){
if(!f[i]){
continue;
}
f[i]=false;
count(num,str+num[i],nn-1);
f[i]=true;
}
}
}

时间: 2025-01-20 08:54:46

关于各种排列组合java算法实现方法的相关文章

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

一.利用二进制状态法求排列组合,此种方法比较容易懂,但是运行效率不高,小数据排列组合可以使用 复制代码 代码如下: import java.util.Arrays; //利用二进制算法进行全排列//count1:170187//count2:291656 public class test {    public static void main(String[] args) {        long start=System.currentTimeMillis();        count

浅析实现排列组合查询算法

所谓的排列组合查询就相当于GOOGLE高级查询中"包含以下全部的字词"查询,也就是说查询中必须包含所有查询关键词,而且他们的顺序可以是任意.以下程序段实现了这一功能.比如输入查询关键字:tom tina则最一般的情况是在程序中使用类似于"select sex from student where name like '%tom%tina%' or name like '%tina%tom%' ordered by age" 的查询语句实现以上的查询,因此如何得到'%

数组-想找到一个排列组合的算法

问题描述 想找到一个排列组合的算法 比如数组里有1-500的非连续数值, 当传入345这样一个数值进来时, 可以从数组里拿出N个数值相加得到345这个值的方案, 且要求相加数值个数最少,或最接近的组合优先获取出来 解决方案 2009年1月15日 沈阳 晴?? 为解决1月7日遇到的排列组合的难题,进行了以下题目的研究,并用C#实现了一个非递归的算法.有一个List,List中存有N个对象,要求做出这N个对象所有无序组.?数学公式:组合数=C(n1) + C(n2) + ...... + C(nn)

list里的数据排列组合求算法

问题描述 list里的数据排列组合求算法 求算法,(不要for嵌套和递归) 问题:现有几个list集合每个集合的大小不确定有可能size为0(集合个数与size大小都不确定,要考虑size为0没有数据的情况),现想得到把每个集合里的数据进行排列组合. 即 list1 [A,B,C] list2 [D,E,F] list3 [G,H,I] 现在得到 ADG ADH ADI AEG AEH AEI ...... 解决方案 http://bbs.csdn.net/topics/390544278

排列组合-【算法】求大神证明此猜想?如不能证明求反例

问题描述 [算法]求大神证明此猜想?如不能证明求反例 由偶数个a和偶数个b构成一个字符串.设其中有2*m个a,2*n个b.不论这个字符串怎样排列,总能找到它有一个子串恰有m个a和n个b

字符 生成-简单的字符生成器-排列组合

问题描述 简单的字符生成器-排列组合 想要实现以下图片上的功能,上方选中我需要用的字母.数字,输入我需要生成的位数,最终列出所有的排列组合数据.求人帮忙,万分感谢. 解决方案 关键就是算法http://bbs.bccn.net/thread-347026-1-1.htmlhttp://outofmemory.cn/code-snippet/4237/c-pailie-zuhe-suanfa 解决方案二: 楼上说的对,关键就是排列组合的算法.最近做了有关排列组合的东西,代码是JAVA的,你是用什么

java-JAVA 生成 用0到9这十个数字 所有的排列组合(0不能再第一个)

问题描述 JAVA 生成 用0到9这十个数字 所有的排列组合(0不能再第一个) 用 0到9 生成 十位数的所有排列组合,数字0不能在第一个,这个生成的十位数, 不能有重复的数字. 解决方案 public static void main(String[] args) { String str[] = { "0", "1", "2", "3", "4", "5", "6"

利用java算法排列组合父节点下的子节点

问题描述 利用java算法排列组合父节点下的子节点 一个item下有多个父节点,一个父节点下面有多个子节点,通过遍历父节点把每个父节点的子节点遍历出来,然后对子节点进行组合,求大神帮我补全代码 List parents = mrItemDimCombMybatisDao.getAllParentByItem(itemId); for (MrItemDim parent : parents) { List sons = mrItemDimCombMybatisDao.getAllSonByPare

C语言实现的排列组合问题的通用算法、解决方法_C 语言

尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手.由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅对组合问题的实现进行详细讨论.以在n个数中选取m(0<m<=n)个数为例,问题可分解为: 1. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止. 2. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m. 很明显,上述方法是一个递归的过程,也