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;

}

}

}

这是数组不规则组合的算法:

时间: 2024-08-26 00:09:59

java中关于排列和组合的有关算法的相关文章

java中的排列组合

? 1 使用之前需要声明一个Combine的对象,调用startCombile方法,可返回想要的组合数或者个数,参数介绍很重要 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <br> public class Combine {     p

菜鸟译文(一)——Java中的继承和组合

阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和组合的概念.首先举一个继承的例子,然后展示一下如何用组合来改善继承的设计.最后概括一下如何在它们之间做出选择. 1. 继承 假设我们有一个Insect类.这个类包含两个方法:一个是move(),一个是attack(). class Insect { private int size; private

&lt;Java中的继承和组合之间的联系和区别&gt;

1 //Java中的继承和组合之间的联系和区别 2 //本例是继承 3 4 class Animal 5 { 6 private void beat() 7 { 8 System.out.println("心胀跳动..."); 9 } 10 public void breath() 11 { 12 beat(); 13 System.out.println("吸一口气,吐一口气,呼吸中..."); 14 } 15 } 16 //继承Animal,直接复用父类的bre

Java中的继承与组合

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到底应该选择继承还是组合. 1.继承 假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(): 2)攻击attack(). 代码如下: class Insect { private int size; private String color; public Insect

Java中的继承与组合(转载)

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到底应该选择继承还是组合. 1.继承 假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(): 2)攻击attack().代码如下: class Insect { private int size; private String color; public Insect(

java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 LinkedList

List 只要有两个实现类(ArrayList 和linkedList ),ArryList是基于数组实现,LinkedList是基于链表实现,下面是小弟对LinkedList的一点理解: LinkedList :基于链表实现的集合        双链接列表实现{ @code  List}和{ @code   Deque} 接口.实现了所有可选列表操作,和许可元素(including{ @code  null}). 首先对实现的接口分析一下: Deque  (双端队列): 这种队列允许在队列头和

JAVA中的聚集和组合的区别和联系

选自<JAVA语言程序设计-基础篇(原书第8版)> 定义:一个对象可以包含另一个对象.这两个对象之间的关系称为组合(composition). 组合实际上是聚集关系的一种特殊形式.聚集模拟了具有(has-a)关系,表示两个对象之间的归属关系.归属关系中的所有者对象称为聚集对象(aggregation object),而它的类称为聚集类(aggregating class).归属关系中的从属对象称为被聚集类(aggregated object),而它的类被称为被聚集类(aggregated cl

C#与java中的AES加解密互解算法

一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string val) { if (string.IsNullOrEmpty(val)) return null; #if CSP using (AesCryptoServiceProvider des = new AesCryptoServiceProvider()) #else using (AesManaged

java中的12种锁

java中很多地方会涉及到锁,比如java代码并发场景,DB中的并发场景,分布式中的锁....你知道几种呢?下面来看看常见的11种锁 1. 乐观锁/悲观锁 这两个概念是人们对java中各种锁总结提出的模型,不是特指某种类型的锁. 乐观锁预期数据的并发操作不会发生修改而不需要进行加锁的操作,悲观锁则相反.在java中的乐观锁一般采用CAS算法或者版本控制,典型的应用如原子类操作.悲观锁则应用的比较广泛如Synchronized等等. 综上: 乐观锁适用于读操作比较多的场景, 悲观锁适用于写操作比较