收藏 分享(赏)

生成排列和组合.ppt

上传人:天天快乐 文档编号:1148321 上传时间:2018-06-15 格式:PPT 页数:43 大小:180KB
下载 相关 举报
生成排列和组合.ppt_第1页
第1页 / 共43页
生成排列和组合.ppt_第2页
第2页 / 共43页
生成排列和组合.ppt_第3页
第3页 / 共43页
生成排列和组合.ppt_第4页
第4页 / 共43页
生成排列和组合.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

1、1,第四章 生成排列和组合 4.1 生成排列,上一章我们讨论了排列和组合的有关计数问题,本章我们将讨论排列和组合的某些排序方案以及执行这些方案的算法,如何编码;还要讨论两个重要的案例:偏序关系和等价关系。 由前面知识可知,n个正整数组成的集合: 1,2,3,.n 有n!个排列,只要n稍大, n!的值,2,也很大,例如15!比1 000 000 000 000还大。 Stirling公式给出一个有用并且方便的计 算方法:n! 随着n ,他们的值就越接近。在许多高等数学书中都有证明,我们本小节的目的,是要构造一个简单生成集合1,2,3,n的所有排列的算法。观察发现: 如果整数n从1,2,3,n的一

2、个排列中删除,那么结果则是1,2,3,n-1的一个排列。,3,例如:我们从 1,2,3,5 的排列中任意找一个 3 ,4, 5, 1, 2 ; 删去5后得到 3 ,4, 1, 2 ; 这个四个数的排列刚好也可以从 1, 2, 3, 4 的排列中得到。它们的关系如右: 反之,求 1,2,3,.n 的排列 也可以先求 1,2.n-1 的排列 再把n插在各个元素之间而得到 1,2,3,.n 的排列。,5, 3, 4, 1, 23, 5, 4, 1, 23, 4, 5, 1, 23, 4, 1, 5, 23, 4, 1, 2, 5,4,这里介绍全排列两种算法: (A)字典序法 (B)错位置排法 (A)

3、字典序法 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后,数字按由小到大、字母按英文字母表顺序。,5,例 字符集1,2,3,按较小的数字较先, 生成的全排列按字典序的顺序是: (123), (132), (213), (231), (312), (321) 这六个三位数数是按由小到大的顺序排列的。 一个全排列可看做一个字符串,字符串可以有前缀、后缀。例如1 2 3和 1 3 2 生成给定全排列的下一个排列 所谓一个的下一个就是这一个与下一个,6,之间没有其他的。这就要求这一个与下一个 有尽可能长的共同前缀,也即变化限制在尽可能短的后缀

4、上。例 839647521是1-9的排列。1-9的排列最前面的是123456789,也是1-9的排列中数值最小的;最后面的是987654321,也是1-9的排列中数值最大的;从右向左扫描若都是增的,就到了987654321,也就没有下一个了。,7,我们对一个给定的排列寻找按字典序紧接的 下一个排列,就是要尽可能保留长的共同前缀,而去修改不同的字符和后缀。我们给出这样一种方法: 1. 对给定的排列,从右到左扫描各个字符,如 果这些字符从右到左是按字典序递增的,该 排列就是最后一个,没有下一个排列。,8,2. 从右到左扫描各个字符,如果第k个字符不是按字典序递增的,下一个排列可以将第k个字符增加一

5、位后修改得到。3.将第k个字符增加一位后,可能与该字符前缀中的字符重复,那就再增加一位,直到与前缀中的字符不重。4.若第k个字符增加一位后,仅与该字符后缀中的字符重复,那就与后缀中重复的字符互换。,9,5.执行第4步后,保留前缀和新的第k个字符,将后缀的字符按字典序重新排列就得到原排列紧接的排列。例 按字典序求839647521的下一个排列, 解:最大的9-排列在最后,对于该排列,从右向左找出比右边数字小的第一个数4 ,将它加1(加后不与前缀的数字重复)变成5;,10,再对后缀从小到大重新排序1257,修改后缀中的重复数字5为4,接上前缀8396得到839651247,即是原排列8396475

6、21的下一个排列.例 按字典序求集合a,b,c,d,e的一个5-排列ebadc下一个排列. 解:英文字母序是:abcde;将5-排列ebadc从右向左扫描,从右向左找出比右边字母先的第一,11,个字母a ,将它增加1位变成b后与前缀中的字母重复,再将它增加1位变成c后不与前缀中的字母重复,保留前缀eb将a换成c,把后缀dc中的重复字母c换成a,对新后缀按字典序重新排列成ad ;即得到新的排列是:ebcad ; 这个排列就是紧接着5-排列ebadc最近的一个排列。,12,(B) 错位排法 当n=1,排列方式只有一种,就是1。 当n=2时,先将惟一的1-排列1写出两次,并错位置插入2,即得两个2-

7、排列如下: 1 2 2 1 当n=3时,先将两块2-排列分别写出3次,,13,并错位置插入3, 即得3!=6个3排列如下: 1 2 3 1 3 2 3 1 2 3 2 1 2 3 1 2 1 3 当n=4 时,先将6块3-排列分别写出4次,并错位置以4,即得4!=24个4排列。,14,1 2 3 4 1 2 4 3 1 4 2 34 1 2 34 1 3 2 1 4 3 2 1 3 4 2 1 3 2 4,3 1 2 4 3 1 4 2 3 4 1 24 3 1 24 3 2 1 3 4 2 1 3 2 4 1 3 2 1 4,2 3 1 4 2 3 4 1 2 4 3 14 2 3 14 2

8、 1 3 2 4 1 3 2 1 4 3 2 1 3 4,15,考察4排列的生成过程,不难发现,按4的走向可 将全部排列分成(4-1)!= 6块, 其中每一块的其余排列均可用前一排列交换4与相邻数字而得。对于1,2,n,最后一个排列交换最后两个数字而得。进而考察n(n4)排列的生成过程可知,相邻块交界处两个排列的数字交换并不一定发生在边界处,而是按照n-1排列的生成顺序交换相邻数字。,16,求n排列时,不用保存(n-1)!个n-1排列,而 只需要利用一个n位长的一维数组存放一个n排列, 然后每次对它交换某相邻数据产生下一个n排列。求算过程中,每产生一个n排列,即行输出,输出不能集中到最后。因为

9、只给出了一个排列的存储空间,后边的结果会代替前边的结果。,17,给定一个整数k,我们用 或 表示k具有向 右或向左的方向。 在1,2,n的一个排列中,若每个整数均具有指定的方向,且若某个整数k的方向所指的k的相邻元素比k小,则称k在该排列中是活动的。例如,对于排列: 其中6,3,5是活动的,因为6,3,5 右边的数比自己小。,18,一个排列中所有活动整数的最大者称为该排列 的最大活动整数。例如,上述例子中6是最大活动整数。 由此可知, 1,2,3,.n 的排列中,1是不可能活动的,除下列两种情况外, n总是活动的。 1 ) n是第一个整数而且它的箭头指向左: 2 ) n是最后一个整数而且它的箭

10、头指向右: 下面我们给出生成所有排列的算法:,19,0. 输正整数n; 1. 构造第一个排列1,2n,并初始化各数的 方向为 ; 2. 当当前排列中存在活动整数时,做: )找出当前排列的最大活动整数m (可能随它的位置而发生改变); )交换m和其它所指向的相邻整数; )改变所有满足pm的整数p的方向; )以上处理的结果生成了一个新的排列,20,我们就 n = 4 叙述该算法。结果用三列显示:,由于在 中除4外没有活动整数,算法终止。,21, 对错位置数生成 n!个全排列的改进算法1 对某个选中的n-1排列,置n于最右端得到一个n排列;2 令n由右向左与相邻数字交换,每交换一次即得一个n排列(共

11、可得n-1个n排列);3 当n到达最左端时,若n!个n排列均已生成,转7; 否则,令除n以外的数n-1按2 交换最大数字相邻的数字,得到下一个n-1排列,连同最左端的n构成一个n排列;,22,4 令n由反向由左向右与相邻数字交换,每交 换一次即得一个n排列(共可得n-1个排列);5 当n到达最右端时,若n!个n排列均已生成,转7; 否则,令除n以外的数n-1按2 交换最大数字相邻的数字, 得到下一个n-1排列,连同最右端的n构成一个n排列;6返回2;7结束。,23,这里有一个求r-排列的程序,提供给大家参考: 此算法以字典序升序列出1,2,.,n的所有排列 输入:n 输出:以字典序升序列出1,

12、2,n的所有排列。 1. procedure permutation(n) 2. for i:=1 to n do 3. Si:=i 4. print s1,sn /打印第一个排列,24,5. for i:=2 to n! do 6. begin 7. m:=n-1 8. while smsm+1 do 9. / 从右边找到第一个减少 10. m:=m-1 11. k:=n 12. while smsk do 13. / 找到smsk的最右元素 14. k:=k-1,25,15. swap(sm,sk) 16. p:=m+1 17. q:=n 18. while pq do 19. / 交换s

13、m+1和sn,交换sm+2和sn-1, 等。 20. begin 21. swap (sp,sq) 22. p:=p+1 23. q:=q-1,26,24. end 25. print s1,sn /打印第i个排列 26. end 27. end permutation 大家可以上机运行上述程序。,27,4.2 排列中的逆序 假设i1,i2,in是集合1,2,n的一个排列。如果存在kil则称数对(ik, il)为该排列中的一个逆序(反序),即前面的元素大于后面的元素,不一定是排列中相邻的元素,例如: 排列31524中有四个逆序,分别是:(3,1),(3,2),(5,2),(5,4)。集合1,2

14、,n的排列中唯一没有逆序的排列是:1,2,n 。,28,对于排列 i1, i2, , in , 我们定义非负整数aj(j1,2,n)是该排列中逆序数的总和。其中整数j是重要的第二成分,并称aj为整数j在该排列中的逆序数。 aj表示了排列中的逆序数量,但它是相对整数j来计算的,换句话说: aj等于在排列中先于 j但大于j的整数的个数,即j 之前比j 大的数的数量;它度量了j反序的程度。,29,对于逆序数aj而言,自身又能够成一个数字序 列: a1, a2, , an ; 我们把这个数字序列叫做原排列i1,i2, ,in的逆序列。数a1a2+an可以度量原排列的无序程度,它的值越大,说明相应的排列

15、的无序程度越大。例:在集合1,2,3,4,5中有排列31524,12345,54321。下表给出了每个排列的逆序和相应的逆序列:,30,31,对于排列3 1 5 2 4的逆序列a1 , a2 , a3,a4 , a5。 1前 面比1大的数只有一个3,a1 = 1; 2前面比2大的数有两个3 和 5 ,a2 = 2; 3前面比3大的数没有a3 = 0 ; 4前面比4大的数只有5; a4 = 1 ; 5前面比5大的数没有a5 = 0;故: a1 , a2 , a3,a4 , a5 1, 2, 0, 1, 0 排列i1,i2, ,in的逆序列a1, a2 , an满足条件: 0 a1 n-1 (a1

16、是1前面并且大于1的数是个数),32,0 a2 n-2 (a2是2前面并且大于2的数是个数). 0 an-1 1 (an-1是n-1前面并且大于n-1的数是个数) an = 0 ; 这样逆序列可能构成的数量为: n (n-1) (n-1) 3 2 1 = n! 这刚好与集合1,2,n的所有排列数相同,这样就提出问题:集合1,2,n的不同的排列就有不同的逆序列。下面给予证明:,33,定理4.2.1 令b1,b2,bn是满足 0 b1 n1;0 b2 n2; 0 bn1 1; bn0 的整数序列。那么,通过b1,b2,bn可以唯一的构造出1,2,n一个序列,使得它的逆序列是: b1,b2,bn 。

17、 证明 采用两种方法唯一构造一个排列,使它的逆序列是b1,b2,bn 。,34,算法一 从逆序列构造一个排列 n: 写出 n n-1: 考虑 bn-1。我们知道0bn11如果bn-1=0, 那么n-1必须放在n的前面。如果bn-1=1,那么 n-1必须放在n的后面。 n-2: 考虑 bn-2。我们知道0bn22如果bn-2=0,35,那么n-2必须放在从n 1步得到的两个数的前面。 如果bn-2=1, 那么n-2必须放在从n 1步得到的两个数的中间。如果bn-2=2, 那么n-2必须放在从n 1步得到的两个数的后面。 . 1: 我们必须把 1 放在步骤n-1所构成的序列的第b1个数的后面。,3

18、6,例: 确定1,2,3,4,5,6,7,8的排列,已知它的逆序列是: 5, 3, 4, 0, 2, 1, 1, 0。解:由上面算法一,各步数插入位置后产生下列结果: 8步: 8 4步: 4 8 6 5 7 7步: 8 7 3步: 4 8 6 5 3 7 6步: 8 6 7 * 2步: 4 8 6 2 5 3 7 5步: 8 6 5 7 1步: 4 8 6 2 5 1 3 7 因此,该逆序列的排列是: 4 8 6 2 5 1 3 7,37,算法二 从逆序列构造一个排列 从n个空位置开始,从左到右把这些位置标为: 1, 2, 3,n。 1:由于在排列中要有b1个整数在1的前面,因此必须把1放在b

19、1+1的位置上。 2:由于在排列中要有b2个整数在2的前面,而且这些整数还没有被插进来,因此必须给这些整数留出b2个空位置,于是把2放在b2+1的位置上。,38,. . . . . . . k: (一般步骤)由于在排列中要有bk个整数在k的前面,因此必须给这些整数留出bk个空位置,在本步骤开始时空位置的个数是n-(k-1)=n-k+1。于是把k放在从左边数的第(bk+1)的位置上 . . . . . . . n: 把n放在剩余的一个空位置上。例:(还是上题) 确定1,2,3,4,5,6,7,8的排列,已知它的逆序列是: 5, 3, 4, 0, 2, 1, 1, 0。,39,解:由上面算法二,

20、分别将数插入位置后得到结果:,逆序列5, 3, 4, 0, 2, 1, 1, 0的排列是: 4 8 6 2 5 1 3 7,40,通过上面的证明我们可以看出,一个排列可 以通过指定它的逆序列而唯一确定。逆序列可以看成排列的“代码”这种功能多用于编码。 习惯上。按照其逆序个数的偶数或者奇数而把1,2,n 的排列 i1,i2, ,in称为偶的或奇的。排列的符号按照偶的或奇的而被定义为+1或-1。排列的符号在矩阵的行列式理论中很重要。我们不需要更进一步讨论。,41,总 结,本次课我们介绍了自然数集合生成排列的方法以及排列数和逆序列等,逆序列与排列的关系多用与编码技术方面。 要求能生成排列,能求出排列的逆序列,能通过排列的逆序列求出排列。,42,本次授课到此结束,作业如下: P72 2, 6, 7, 102.确定在 中的活动整数。6. 确定1,2,3,.,8的下列排列的逆序列。,43,7.构造1,2,3,.,8的排列,其逆序列是10.通过逐次交换相邻的数把排列256143和436251变成123456。下次上课内容:4.3 生成组合,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报