关于组合问题的一种巧妙方法
2013-04-09 09:59
253 查看
在算法设计与分析里,组合排列(或者表面像排列组合)的问题很好的解决方法主要是回溯法,广度优先遍历法。
这里提供关于组合问题一种巧妙的解决办法。比如我们要从m个元素里取n个元素的所有组合。
我们用一个m位二进制数代表m个元素(一位代表一个元素)。取n个元素可以看做是这个m位二进制数中有n位的值为1.
一个m位二进制数可以代表2的m次方个值,(代表m个元素所有组合的情况)
/**
* 从m个数里取n个数的组合的个数,这里i并不是一个m位数,只是使用了i最右边的m位数
* 思路:
* @param m
* @param n
* @return
*/
public static int getCombinations(int m,int n){
int total=0;
for(long i=0l;i<Math.pow(2, m);++i){
int count=0;
//j=0表示右边第一位,j=1表示右边第二位,
for (int j = 0; j <m; j++) {
//>>>无符号右移,左边填充0,i>>>j先运算,把我们要考核的哪一位移到最右边,然后与1进行&运算,即可知道我们考核的那一位的值。
if((i>>>j&1)==1){
++count;
}
if(count>n){
break;
}
}
if(count==n){
++total;
}
}
return total;
}
/* 取组合方法
* 参数: list ---- 原始集合
* 返回: 包含所有组合的集合
*/
public static List<List<Object>> getCombinations(List<Object> list) {
List<List<Object>> result = new ArrayList<List<Object>>();
long n = (long)Math.pow(2,list.size());
List<Object> combine;
for (long l=0L; l<n; l++) {
combine = new ArrayList<Object>();
for (int i=0; i<list.size(); i++) {
if ((l>>>i&1) == 1)
combine.add(list.get(i));
}
result.add(combine);
}
return result;
}
这里提供关于组合问题一种巧妙的解决办法。比如我们要从m个元素里取n个元素的所有组合。
我们用一个m位二进制数代表m个元素(一位代表一个元素)。取n个元素可以看做是这个m位二进制数中有n位的值为1.
一个m位二进制数可以代表2的m次方个值,(代表m个元素所有组合的情况)
/**
* 从m个数里取n个数的组合的个数,这里i并不是一个m位数,只是使用了i最右边的m位数
* 思路:
* @param m
* @param n
* @return
*/
public static int getCombinations(int m,int n){
int total=0;
for(long i=0l;i<Math.pow(2, m);++i){
int count=0;
//j=0表示右边第一位,j=1表示右边第二位,
for (int j = 0; j <m; j++) {
//>>>无符号右移,左边填充0,i>>>j先运算,把我们要考核的哪一位移到最右边,然后与1进行&运算,即可知道我们考核的那一位的值。
if((i>>>j&1)==1){
++count;
}
if(count>n){
break;
}
}
if(count==n){
++total;
}
}
return total;
}
/* 取组合方法
* 参数: list ---- 原始集合
* 返回: 包含所有组合的集合
*/
public static List<List<Object>> getCombinations(List<Object> list) {
List<List<Object>> result = new ArrayList<List<Object>>();
long n = (long)Math.pow(2,list.size());
List<Object> combine;
for (long l=0L; l<n; l++) {
combine = new ArrayList<Object>();
for (int i=0; i<list.size(); i++) {
if ((l>>>i&1) == 1)
combine.add(list.get(i));
}
result.add(combine);
}
return result;
}
相关文章推荐
- 关于MFC中的Debug Assertion Failed问题的一种可能的解决方法。
- 关于ISA2004内网卡网线拔插造成ISA代理失效问题的一种解决方法(下列错误而失败:0x80072
- 关于【error=2,No such file or directory】问题的一种起因与解决方法
- 关于两个不知缘由的常见问题的一种解决方法
- 关于onConfigurationChanged方法及常见问题解决
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
- 关于客户遇到的S5pv210 wince6.0 BSP编译不通过的问题解决方法
- 关于图片预览使用base64在chrome上的性能问题解决方法
- 关于mysql中文插入 问号??问题的解决方法!
- 一种巧妙的删除程序自己的方法
- 关于update.inf问题安装失败的解决方法
- 关于Android4.0 emulator-arm.exe-应用程序错误,内存不能为"read"问题解决方法
- window.open关于浏览器拦截问题分析及解决方法
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- 关于H-JTAG的NANDFLASH烧写方法以及2416初始化脚本的问题
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
- 关于GestureDetector.OnGestureListener类的onScroll方法参数distanceX和distanceY问题
- iOS 关于无限循环自动图片轮播器中的一种方法
- 关于EwebEeditor 不能上传图片问题解决方法
- 关于Memcached的CAS和Set方法造成Socket泄漏的问题