您的位置:首页 > 其它

排列和组合的实现

2016-12-14 19:19 176 查看
一、排列问题:

排列问题很容易想到递归算法: 例如针对一个数组str的排列,我们可以看成是 str[i]∪per( str - str[i] ) 

例如abc  首先取i=0 , 即为a  ∪ per(bc) , per(bc) = bc、cb; 结果为abc acd

                        再取i=1,  即为b  ∪ per(ac) , per(ac) = ac、ca; 结果为bac, bca

再取i=2,  即为c  ∪ per(ab) , per(ab) = ab、ba;
结果为cab, cba

      为此我们需要一个swap和函数和per的递归函数。

package T12;

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

/**
* @author 作者 : xcy
* @version 创建时间:2016年12月14日 下午6:11:09
* 类说明
*/
public class Per {

static List<List<Integer>> re = new ArrayList<List<Integer>>();

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums = { 1, 2, 3, 4 };
per(nums, 0, nums.length);
System.out.println("end" + re.size());
}

public static void swap(int[] nums, int p, int q) {
int tmp = nums[p];
nums[p] = nums[q];
nums[q] = tmp;
}

public static void per(int[] nums, int str, int len) {
if (str == len - 1) {
List<Integer> tmp = new ArrayList<Integer>();
for (int i = 0; i < len; i++) {
tmp.add(nums[i]);
}
re.add(tmp);
} else {
for (int i = str; i < len; i++) {
swap(nums, str, i);
per(nums, str + 1, len);
swap(nums, str, i);
}
}
}

}


二、组合问题:

我们知道对于集合{a,b,c}它的组合有2^3-1 = 7个: a,b,c,ab,ac,bc,abc.

如果把abc 看为是 位数,7个组合分别是 100, 101, 001, 110, 101, 011, 111. (1表示取,2表示不取)

那么我们只需要把1-2^n 的数字转化为二进制再根据1-0判断是否取值就可以了。

package T12;

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

/**
* @author 作者 : xcy
* @version 创建时间:2016年12月14日 下午7:04:42
* 类说明
*/
public class Combination {

public static void main(String[] args) {
// TODO Auto-generated method stub
char[] str = { 'a', 'b', 'c' };
List<String> re = com(str);
for (String p : re) {
System.out.println(p);
}
System.out.println(re.size());

}

public static String change(int n, int bit) {
String re = "";
while (n > 0) {
int tmp = n % 2 == 0 ? 0 : 1;
re = tmp + re;
n = n / 2;
}
int s = re.length();
for (int i = 0; i < bit - s; i++) {
re = 0 + re;
}
return re;
}

public static List<String> com(char[] str) {
List<String> re = new ArrayList<String>();
int bit = str.length;
int num = (int) (Math.pow(2, bit) - 1);
for (int i = 1; i < num + 1; i++) {
String t = "";
String tmp = change(i, bit);
for (int j = 0; j < bit; j++) {
if (tmp.charAt(j) == '1')
t += str[j];
}
re.add(t);
}
return re;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: