您的位置:首页 > 其它

组合生成算法

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;

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]当做目标集合的下标,每生成一个组合按照对应下标输出就能实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法