组合生成算法
2015-03-03 15:39
260 查看
上学期在离散课上学到的基于字典序的组合生成算法,在这里整理一下:
目的:
集合1~n已经确定,已知当前组合,按照字典序生成下一个组合;
1.所有组合都是按字典序升序排列;
2.每个组合内部元素互不相同,且升序排列;
算法:
最大值:从左向右共有r个位置,每个位置的元素的最大值是不同的。分别为:第1个:n-r+1……第n个:n;
思路细化:
已知当前组合(s[1],s[2]…s[r]),
1.从右向左检查首个未达到最大值的元素,假设为s[i];
2.s[i]=s[i]+1;
3.for j: i+1 to r—s[j]=s[j-1]+1;
注:上面算法是针对1~n集合的组合生成算法,如果拓展为任意元素不重复集合其实也很简单,将元素递增排序并存储到集合中去,我们可以把上述方法中的s[i]当做目标集合的下标,每生成一个组合按照对应下标输出就能实现。
目的:
集合1~n已经确定,已知当前组合,按照字典序生成下一个组合;
1.所有组合都是按字典序升序排列;
2.每个组合内部元素互不相同,且升序排列;
算法:
最大值:从左向右共有r个位置,每个位置的元素的最大值是不同的。分别为:第1个:n-r+1……第n个:n;
思路细化:
已知当前组合(s[1],s[2]…s[r]),
1.从右向左检查首个未达到最大值的元素,假设为s[i];
2.s[i]=s[i]+1;
3.for j: i+1 to r—s[j]=s[j-1]+1;
void next_comb(int s[],int n,int r) { int i,j,max_val; max_val=n; i=r; while( s[i] == max_val ) { i--; max_val--; } s[i]++; for( j = i+1; j <= r; j++ ) s[j]=s[j-1]+1; return ; }
注:上面算法是针对1~n集合的组合生成算法,如果拓展为任意元素不重复集合其实也很简单,将元素递增排序并存储到集合中去,我们可以把上述方法中的s[i]当做目标集合的下标,每生成一个组合按照对应下标输出就能实现。
相关文章推荐
- 基础算法测试——生成一个1-10之间的随机整数组合
- 基础算法之排列组合生成算法
- 排列组合算法1:生成全部有序列b
- 不定长数组取值交叉遍历组合生成算法
- 基于字典序的组合生成算法
- 得出“15选5”的各种组合(组合生成算法)
- 基础算法测试——生成一个1-10之间的随机整数组合
- 全排列生成算法与组合数排列求法
- 子集和问题 —— 一种组合生成算法
- 使用排序化简组合生成算法
- 水一个:组合数学生成作业的程序,算法很垃圾,有兴趣的帮我改一下啊
- C++之根据组合遍历顺序生成二叉树(25)---《那些奇怪的算法》
- 基础算法测试——生成一个1-10之间的随机整数组合
- 根据N种规格中的M种规格值生成的全部规格组合的一种算法
- C++之根据组合遍历顺序生成二叉树(25)---《那些奇怪的算法》
- 生成组合序列算法
- [组合算法] 生成不重复的字符串
- 算法——递归生成集合的所有组合
- 基础算法测试——生成一个1-10之间的随机整数组合
- 【算法】组合数学——排列数生成算法详解(一)