排列和组合的实现
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;
}
}
排列问题很容易想到递归算法: 例如针对一个数组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;
}
}
相关文章推荐
- 排列与组合的实现
- 回溯实现数字的排列组合
- ABAP实现穷举期间范围内相邻月份排列组合
- 排列组合计算第m种组合 STL实现——pku1833
- 排列组合数列的java实现
- 用java实现对数组的排列组合
- C语言实现数学上的组合和排列
- 用回溯法(backtracking)实现数学排列和组合
- 排列与组合的算法实现
- 递归实现全排列和组合
- 回溯实现数字的排列组合
- 递归实现数字排列组合
- 递归实现数字排列组合
- 排列组合非递归算法的实现
- 高效率的排列组合算法(java实现)
- 一个实现排列和组合的JavaBean
- 【转】JAVA实现排列组合算法
- VB.NET 排列组合算法实现
- 在ORACLE中使用SQL语句实现排列组合
- 排列与组合的Java递归实现