1.    按字典序生成组合

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为偶数,将最后一位变换(1001)。

(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<= nak + 1不是a1, a2,..., ar

(3)打印新的r-组合a1...ak-1, ak+1,...,ak+r-k+1

3.2.算法分析

1. 若将a1, a2, ..,ak也用字典序表示的话,生成r-组合就想法于将r1k-r0进行排列。由于整个过程中,1的数目和0 的数目都是不变的,可以用一个长为k的字符串来表示,字符串中有r1k-r0r1k-r0的每一个排列都对应一个组合。

2. 引入活动的1这个概念。ai=1为活动的1仅当存在aj=0j>i。直接的说法就是仅当这个1的后面有0

按字典序生成组合的实现

<代码>

生成组合算法// 生成字典序
生成组合算法
void dict_gen(int *array, int len)
}


按格雷码序生成组合的实现

<代码>

生成组合算法#include <iostream>
生成组合算法#include 
<bitset>
生成组合算法#include 
<stdlib.h>
生成组合算法
using namespace std;
生成组合算法
using std::bitset;
生成组合算法
生成组合算法
#define BIT_WIDTH 8
生成组合算法
生成组合算法
// gray 码生成器 
生成组合算法
void gray(int *array, int len);
生成组合算法
// 用于找到最后一个1的位置,如果找不到,则返回-1 
生成组合算法
int findlast1pos(int value);
生成组合算法
// 用于打印gray码 
生成组合算法
void print_dict(int *array, int len, int key);
生成组合算法
生成组合算法
void gray(int *array, int len)
}


生成r-组合的实现

<代码>

生成组合算法#define NUM_1 '1'
生成组合算法
#define NUM_0 '0'
生成组合算法
}

终于贴完了……

相关文章: