Java 实现m个数全排列组合以及从M中选取N个数(有序)

(1)全排列组合的递归规律:

集合s的全排列组合 all(s)=n+all(s-n);其中n为已经取出的集合

以集合 s={1,2,3}为例,则s的全排列组合为all(s)={1}+all({2,3});其中n={1},s-n={2,3}

通过以上例子,我们可以知道上述算法可以用递归来解决。

我们取极端情况,如果集合s为空,那么说明不需要再进行递归。

全排列组合,如果集合有4个元素,则全排列组合的个数为 A(4,4)=4*3*2*1=24种,代码如下:

package dataStructer;import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;public class FullPermutation {//全排列组合private int n;public FullPermutation (){this.n=0;}public  void listAll(List candidate,String prefix){if(candidate.isEmpty()){System.out.println(prefix);this.n++;}for(int i=0;i

(2)m个数据集合中选出n个数据(有序)

m个数据集合中选出n个数据规律为:get({m},n)=t+get(集合{m-t},m-t的大小)

考虑极端的情况,如果集合m里只取一个元素,那么直接把这个元素取出来即可。

如何集合有4个元素,取出其中的两个有序元素个数为A(4,2)=4*3=12

 

package dataStructer;import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;public class mAn {private int all;public mAn(){this.all=0;}public int getAll() {return all;}public void setAll(int all) {this.all = all;}public static void main(String[] args) {String[] n ={"1","2","3","4"};mAn m=new mAn();List lst = Arrays.asList(n);m.take("",2,lst);System.out.println(m.getAll());}public  void take(String s, int total, List lst) {for (int i = 0; i < lst.size(); i++) {//System.out.println("i="+i);List templst=new LinkedList(lst);String n =  (String) templst.remove(i);// 取出来的数字String str = s + n;if (total == 1) {System.out.println(str);//以最极端 n个里面只取一个,直接把取出来的结果输出即可//total=all;all++;} else {int temp=total-1;//在同一层中total总量不能减,不能再原有变量的基础上take(str, temp, templst);// 这里的temp以及templst都是全新的变量和集合}}}}



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部