1.1.算法的描述
(1)从0...0开始,当字典序为1...1时,退出
(2)求出使得ai=0的最小整数i
(3)用1代替ai并用0代替ai-1, ai-1, ..., a0
2. 按格雷码序生成组合
2.1.算法描述
(1)从0...0开始,到10...0结束。
(2)设t代表代码中1的个数,若t为偶数,将最后一位变换(1变0,0变1)。
(3)若t为奇数,则找到最后一个1,然后把i+1位变换。
2.2.算法分析
通过算法分析,可以得出以下的结论
1. t的奇偶性是交替出现的,最开始为偶数。
2. 在C语言中,可以通过与一个数,将某一位变成0,通过或一个数将某变成1.
3. 可以通过循环右移,然后检查最后一位是否为1来找到最后一个1.
4. 通过判断最后一位是否为(二进制)1来判断是奇数还是偶数。
3. 生成r-组合
3.1.算法描述
(1)算法从1..10...0开始,到0...01...1结束。
(2)确定最大的整数k,使得ak +1<= n且ak + 1不是a1, a2,..., ar。
(3)打印新的r-组合a1...ak-1, ak+1,...,ak+r-k+1。
3.2.算法分析
1. 若将a1, a2, ..,ak也用字典序表示的话,生成r-组合就想法于将r个1和k-r个0进行排列。由于整个过程中,1的数目和0 的数目都是不变的,可以用一个长为k的字符串来表示,字符串中有r个1和k-r个0。r个1和k-r个0的每一个排列都对应一个组合。
2. 引入活动的1这个概念。ai=1为活动的1仅当存在aj=0且j>i。直接的说法就是仅当这个1的后面有0。
按字典序生成组合的实现
<代码>
按格雷码序生成组合的实现
<代码>
生成r-组合的实现
<代码>
终于贴完了……