27
1 §3-1 排排排排

§3-1 排列问题

Embed Size (px)

DESCRIPTION

§3-1 排列问题. n 个元素共有 n! 个排列。 不重复无遗漏地产生 n 个元素的所有 n! 个排列。 思路: 设连续产生的两个排列为 P 和 P', 只要将 P 中的两个元素交换位置就得排列 P' .. 定义 将一个排列的两个元素交换位置的操作称为换位,记作 t. 所有可能的换位操作的集合记为 T. 从而 n! 个排列可以这样来产生, 任意选择一个排列,然后连续使用 T 中的操作,得到其余的 (n! 一 1) 个排列。 这个方法实质上将 n! 个排列排成一个序列, 对其中每一个排列 ( 不是最后一个 ) 作一次换位操作,就可得其后继排列。. - PowerPoint PPT Presentation

Citation preview

Page 1: §3-1  排列问题

1

§3-1 排列问题

Page 2: §3-1  排列问题

2

n 个元素共有 n! 个排列。不重复无遗漏地产生 n 个元素的所有 n!个排列。 思路:设连续产生的两个排列为 P 和 P', 只要将 P 中的两个元素交换位置就得排列 P' .

Page 3: §3-1  排列问题

3

• 定义 将一个排列的两个元素交换位置的操作称为换位,记作 t. • 所有可能的换位操作的集合记为 T.

Page 4: §3-1  排列问题

4

• 从而 n! 个排列可以这样来产生,• 任意选择一个排列,然后连续使用 T中的操作,得到其余的 (n! 一 1) 个排列。• 这个方法实质上将 n! 个排列排成一个序列,• 对其中每一个排列 ( 不是最后一个 ) 作一次换位操作,就可得其后继排列。

Page 5: §3-1  排列问题

5

• 以 n = 3 为例,其六个排列的序列下: l 2 3 2 l 3 2 3 1 3 2 l 3 l 2 1 3 2

Page 6: §3-1  排列问题

6

• 有 n 个元素的排列称为 n 排列。• 从群论的角度问题可叙述如下,考虑有限群 G 及其算子集合 T( 现在 G 的元素是排列, T 的元素是换位 ) ,• 能否将 G 的所有元素排成一个序列,每两个相邻的元素有这样的性质,• 前者使用 t∈T 一次,即可得后者。• 下面用归纳法证对于排列而言,这样的序列存在。

Page 7: §3-1  排列问题

7

• 对元素的个数 n 进行归纳。设 n 个元素为 a1 , a2 ,…, an .• 当 n=2 时显然成立,共有两个排列,• 将其中的一个排列的仅有的两个元素交换位置即得另一个排列。• 设 n<p 时存在 n! 个排列的序列,具有上述性质。

Page 8: §3-1  排列问题

8

• 当 n=p 时,有 p! 个排列,用下述方法将它们组织成一个序列。考虑 p 个元素的前 p - 1 个元素,因为 p - 1<p• 满足归纳假设的条件,可以得到 (p - 1)!个 (p - 1) 排列,• 将最后一个元素 ap 加到它们末尾,即得

(p 一 1)! 个 p 排列,且具有上述性质,• 然后交换上述最后一个排列中元素 ap 和元素 a1( 现在 al 并不一定在第一个位置 ) 的位置,

Page 9: §3-1  排列问题

9

• 考虑这个排列的前 (p - 1) 个元素,满足归纳假设的条件,可得 (p - 1)! 个 p 排列 ( 它们最末尾的元素为 a1) ;• 然后交换元素 a1 和元素 a2 ,又可得• (p - 1)! 个 p 排列,其末尾元素为 a2 ;• 交换元素 a2 和元素 a3 ,得 (p 一 1)! 个 p排列,…,• 直至元素 ap-2 与元素 ap-1 交换位置,• 再得 (p - 1)! 个 p 排列,其末尾元素为

ap-1.

Page 10: §3-1  排列问题

10

• 从而 p 个元素的每一个都出现在• (p - 1)! 个 p 排列的末尾,• 因此共有 p× (p - 1)!=p! 个 p 排列,• 且它们都是互不相同的,• 每两个相邻的 p 排列有这样的性质:• 前者使用一次换位操作就得到了后者。证毕。•

Page 11: §3-1  排列问题

11

• 从而,产生 n! 个 n 排列的问题变成给定一个 n 排列,如何确定要交换位置的两个元素。• 令序列中第 m 个排列为• a1 , a2 , a3 ,…, an• 需要交换位置的两个元素为• ar 和 ah (r<h) , ah 在 ar 的右边,

Page 12: §3-1  排列问题

12

• 这告诉我们 a1 , a2 ,…, ah-1• 的 (h - 1)! 个排列已经产生完毕,• 因此才需将其中的一个元素 ar 与它们右边的元素 ah 交换位置,• 从而 m 必是 (h - 1)! 的倍数。• m 必不是 h! 的倍数。• 换言之, h 是具有下述性质的最小整数 j:• m 不能被 j! 整除。

Page 13: §3-1  排列问题

13

• h 的值确定以后, r 就很容易确定了。• 上面的证明指明了确定 r 的方法。分两种情况:• (1) 如 a1 , a2 ,…, ah-l 都比 ah小,则选择 al , a2 ,…, ah-1 中最小的元素与 ah 换位,• 不然则• (2) 选择 a1 , a2 ,…, ah-1 中比 a

h 大的元素中最小者与 ah 换位。

Page 14: §3-1  排列问题

14

• [ 例 1] n 为 5 .产生的第 102 个排列为• 2 1 5 3 4• 求第 103 个排列。• m=102 ,因为 102÷3! = 17 余 0• 102÷4! = 3 余 30• 所以, h = 4 ,即元素 3 要与其左的一个元素交换位置,比 3 大的元素只有一个,为 5 ,• 所以 3 和 5 交换位置,得第 103 个排列为• 2 1 3 5 4

Page 15: §3-1  排列问题

15

• [ 例 2] n=4 , 4!=24 ,使用上述方法产生的 24 个排列如下所示 ( 自上而下,再向右 ) :• 1234 432l 1342 1423• 2134 342l 3142 4123• 2314 2431 3412 2143• 3214 423l 4312 1243• 3124 324l 4132 4213• 1324 234l 1432 2413

Page 16: §3-1  排列问题

16

• 本节的主要结果是函数 permu ,• 它需要三个函数:• int FAC(int n)• // 计算 n 的阶乘• {int i = 2 , k=1 ;• for ( ;i<=n; ) k* = i++;• return k;• }

Page 17: §3-1  排列问题

17

• void SWAP(int x,int y,int a[ ])• // 交换数组 a 中下标为 x 及下标为 y的元素的值• {int t ;• t = a[x] ;• a[x] = a[y] ;• a[y] = t;• }

Page 18: §3-1  排列问题

18

• void PRlNT(int M , int n, int a[ ])

• {// 打印 n 排列 a 及其序号 M• int i=1 ;• printf (M) ;• for (;i<=n;) printf (a[i++]);• }

Page 19: §3-1  排列问题

19

• void PERMU (int n) ;• // 产生 n 个元素 1 , 2 ,…, N 的 n!个排列• 产生第一和第二两个排列 ;• M=2;• while(M< fac (n))• // 每循环一次 , 产生两个排列• { 确定 h; 确定 r; • SWAP (r, h, a); PRINT(++ M, n, a);• SWAP (1, 2, a); PRINT(++ M, n, a) ;• }

Page 20: §3-1  排列问题

20

• 产生第一和第二两个排列• for( i = l ;i<=n; i++) a[i] = i;• PRINT(1 , n , a) ; (2)• SWAP(1, 2, a) ; • PRINT(2 , n , a) ; (3)

Page 21: §3-1  排列问题

21

• 确定 h;• h = 2 ; (4)• do h2 = FAC (++ h) ; (5)• while(M%h2==0) ;• 可修改为• h = 2 ; h2=2; (4)• do h2 * = ++ h ; (5)• while(M%h2==0) ;

Page 22: §3-1  排列问题

22

• 确定 r;• r = 1 ; j = 0 ; (6)• TEMP =MAXlNT ;• for( i = l; i< h; i++)• {// 寻找最小的值• if(a[i] <a[r]) r = i• // 寻找大于 a[h] 的最小值• if((a[i] >a [h]) && (a [i] <TEMP))• { j = i;• TEMP=a[i]• }• }• if(j ) r = j ;

Page 23: §3-1  排列问题

23

注 1 当 M 为奇数时, h 的值必为 2 , r的值则为 1 ,即需要交换第 1 个、第 2 个元素的位置,因此过程 PERMU 中 while 语句的循环体每执行一次产生两个排列,用前述方法确定 h 、 r ,交换 a[h] 、 a [r] 得到一个排列,然后再交换 a[1] 、 a[2] 直接得到另一个排列。

Page 24: §3-1  排列问题

24

• 注 2 过程 PERMU 按前面的思路编写,为的是容易理解,为加速运行,将确定 r 的程序段更改为:• r = 0 ; TEMP = MAXINT ;• for( i = l; i< h; i++)• if((a[i] >a [h]) && ( a [i] <TEMP))• {r = i; TEMP = a[i];}• if( r= =0)• { r = 1 ;• for( i = 2;i<n;i++)• if(a[i]<a[r]) r = i;• }

Page 25: §3-1  排列问题

25

• 经这样更改,不仅省时间,还省去变量 j 和函数 FAC

Page 26: §3-1  排列问题

26

• 注 3 还有一种方法确定 r 的值,也分两种情况。• ① 如 al , a2 ,…, ah-1 都比 ah大,则选择 a1 , a2 ,…, ah-1 中最大者与 a[h] 交换,否则• ② 选择 a1 , a2 ,…, ah-1 中比 a

h 小的元素中最大者与 a[h] 交换。以 n = 4 为例,• 用上述方法得到的 24 个排列为

Page 27: §3-1  排列问题

27

• 1234 4213 4132 3241• 2134 2413 1432 234l • 3124 2143 3412 243l• 1324 1243 4312 4231• 2314 1423 1342 4321• 3214 4123 3142 342l