Chap1-2排列组合生成、可重组合
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.7 组合的生成
设从[1,n]中取r元的一个组合为C1C2…Cr 不妨设C1<C2<…<Cr ,则 i≤Ci≤(n-r+i), i=1,2,…,r 生成C1C2…Cr的下一个组合的算法如下 (1)找j=max{i|Ci<n-r+i} (2)令Cj=Cj+1 (3)令Ci=Ci-1+1,i=j+1,…,r 这等于给所有的组合建立了字典序。 n中取r的排列生成可以由组合生成和全排列生成 结合而得到。
k k!1 即 n! 1 k k !
k 1 k 1 n 1
n 1
1. 6.2 序数法
不难证明,从0到n!-1的任何数m可唯一的表示为
m an1 (n 1)! an2 (n 2)! ... a1 1! 其中 0 ai i, i 1,..., n 1.
允许重复(可重)的组合是指从S { a1 , a2 ,..., ak } 中取r个元素b1 , b2 ,..., br , 允许重复,即允许bi b j , i j 的数同时出现于一个组合中的组合, 其全体记为 (k , r ), 其个数记为C (k , r ).
a1...ak b1...bk
[例]字符集{1,2,3},较小的数字较先,这样按字 典序生成的全排列是: 123,132,213,231,312,321。 ※ 一个全排列可看做一个字符串,字符串可有 前缀、后缀。
1.6.3字典序法
1)生成给定全排列的下一个排列.所谓一个的 下一个就是这一个与下一个之间没有其他的。 这就要求这一个与下一个有尽可能长的共同前 缀,也即变化限制在尽可能短的后缀上。 [例] 839647521是1--9的排列。1—9的排列最 前面的是123456789,最后面的是987654321, 从右向左扫描若都是增的,就到了987654321, 也就没有下一个了。否则从右向左扫描找出第 一次出现下降的位置。
1.6全排列的生成算法
全排列的生成算法就是对于给定的字符集,
用有效的方法将所有可能的全排列无重复无遗 漏地枚举出来。 这里介绍4种全排列算法: (A) 直接生成法 (B) 序数法 (C) 字典序法 (D) 换位法
1.6.1 直接生成法
递推算法:假设已经生成n-1个数的所有(n-1)! 个全排列,将n插入到每一个排列的前面、第 12之间、第23之间、。。。最后,即得到n个 数的所有n(n-1)!=n! 个全排列。
1.8多重集的排列和组合
• 多重集—元素可以多次出现的集合,即元素可 以重复。我们把某个元素ai出现的次数
ni(ni=0,1,2,…)叫做该元素的重复数,通常把
含有k种不同元素的多重集S记作
{n1 a1 , n2 a 2 ,...,nk ak }
定义 从一个多重集 {n1 a1 , n2 a 2 ,...,nk ak } 中有序 选取的r个元素叫做S的一个r-(可重)排列。当 r n(n n1 n2 ... nk ) 时也叫做S的一个排列.
mn1 an1 ,
0 an1 n 1
(an1 , an2 ,..., a2 , a1 ) m
1. 6.2 序数法
下面我们试图将n-1个元素的序列(an-1,…,a1)与n 个元素的排列建立起一一对应关系. 设序列(an1, an2 ,..., a1 )对应某一排列 p1 p2 pn , 其中 ai : 排列中数i 1所在位置的右边比i 1小的数
例2 用两面红旗,三面黄旗依次悬挂在一根旗 杆上,问可以组成多少种不同的标志?
解:所求的标志数是多重集{2红旗,3黄旗}的排列 数,故N=5!/(2!×3!)=10
总结
设 S {n1 a1 , n2 a2 ,..., nk ak }, n n1 n2 ... nk
则S的r-排列数N满足:
r个相同的球 0…010…01…10…0 \ /
————\/———— ——————— /\ ————————\ /
k-1个相同的盒壁
则所求计数为C(k+r-1,r).
1.8.2可重组合
另证 不妨假设k个不同元素为1,2,…,k,设某一个r可 重组合为b1,b2,…,br。由于允许重复,可以假设 b1 b2 br 定义c1 b1 , c2 b2 1, ci bi i 1, 则
的个数,i 1,2,..., n -1
例 p=4213 (a3,a2,a1)= (301) 反过来, 由(a3,a2,a1)= (301)也可以得到排列4213,
1. 6.2 序数法
方法如下 由a3=3, 知4放在空格的最左端, 4 _ _ _ _ 2 1 3
而a2=0,说明3的右边没有比它更小的,故3放在最 右端,
1.6.3字典序法
[例] 求839647521的下一个排列
找出比右边数字小的第一个数4
7 5 2 14 7 12 5 8396 5 7 4 21 4<5 4< 4>1 4>27
大于4的用橙色表示 为后缀 小于4的用绿色表示
接上前缀83965得到839651247 在后缀7521中找出比4大的数 7 将此后缀翻转 后缀变为7421 找出其中比4大的最小数 5 4 、5 对换 即839647521的下一个。
推论2:设多重集S {n1 a1, n2 a2 ,..., nk ak }, 且r k , 则 S中每个元素至少取一个的r 组合数是C(r 1, k 1).
(1) 1
(2)
1 2 2 1 (3) 1 2 3 1 32 31 2 32 1 2 31 2 1 3
(4)
1 2 34 1 2 43 1 4 2 3 2 3 4 1 3 2 4 1 14 3 2 1 3 4 2 1 3 2 4 3 1 2 4 3 14 2 3 4 1 2 1 2 43
43
3 3 3 2 2 2 42 42 2 2 2
定理1.2 从 S { a1, a2 ,..., ak } 中取r个作可重 的组合,其个数为C(k+r-1,r) 这个计数问题相当于r个相同的球放入k个不同的 盒子里,个数没有限制的计数.
1.8.2 可重组合
而后一问题又可转换为r个相同的球与k-1个相同 的盒壁的排列的问题。
1)若r > n,则N = 0;
n! 2)若r = n, 则 N= n ! n ! ... n ! 1 2 k
ni r, 则 N k r 3)若r < n ,且对所有的i,
4)若r < n ,且存在i, ni r , 则对N没有一般的 求解公式,具体解法以后再说。
1.8.2可重组合
考虑a1=1,容易得出,2右边还有一个空格放1,于 是得到了排列4213。
1. 6.2 序数法
这个算法的优点是建立了自然序数和排列之 间的一一对应关系(通过n-1个元素的序列 (an-1,…,a1) )。
缺点是这种对应关系需要通过序列转换, 即两层对应关系,多一层计算量。
1.6.3字典序法
字典序:对于两个序列a1…ak和b1…bk ,若存在t,使 得ai=bi, i<t,但at<bt ,则称
c1 cr k r 1. 这相当于从1到k+r-1中取r个不允许重复的组合。 很容易验证,这是一个一一对应,从而定理成 立。 第二个证明可说一种“拉伸压缩”技巧。不可谓 不巧妙。但仍不如第一证明来的明快,由此可见 组合证明的功效。
1. 8.2可重组合
推论1:设多重集S {n1 a1, n2 a2 ,..., nk ak }, 且对一切 的i=1,2,..k,有ni r, 则S的r 组合数是C(k r 1, r ).
所以从0到n!-1的n!个整数与
(an-1,an-2,…a2,a1)
一一对应。
另一方面,不难从m算出an-1,an-2,…a2,a1.
1. 6.2 序数法
算法如下:
m m1, 0 m n! 1 m1 2 m2 a1 , 0 a1 1 m2 3 m3 a2 , 0 a2 2 ……………. mn2 (n 1) mn1 an2 , 0 an2 n 2
(2) n是最后一个数,且其方向指向右侧.
1.6.4换位法
于是,我们可由 12......n 按如下算法产生所有排列
算法
1,开始时:12......n
2,当存在可移数时 (a) 找最大的可移数m (b) 将m与其箭头所指的邻数互换位置 (c) 将所得排列中比m大的数p的方向调整,即改 为相反方向。
2 1 4 2 1 24 1 2 1 4 3 1 4 3 41 4 3 1 3 1 1 3 41 3 1 43 1 3 4
1.6.4换位法
对上述过程,一般地,对i,将前一步所得的每一 排列重复i次,然后将i由第一排的最后往前移, 至最前列,正好走了i次,下一个接着将i放在下一 排列的最前面,然后依次往后移,一直下去即得i 元排列。 下面我们用较正式的语言来说这件事。 对给定的一个整数k,我们赋其一个方向,即在 其上写一个箭头(指向左侧或右侧)
优点是生成简便,缺点是速度慢。
1.6.2 序数法
n的十进制表示:
n ai10i ,0 ai 10
i 1 k
n的p进制表示
n ai pi ,0 ai p
i 1 k
1. 6.2 序数法
我们来看另一种表示 n!=((n-1)+1)(n-1)!=(n-1)(n-1)!+(n-1)!, 同理, (n-1)!=(n-2)(n-2)!+(n-2)!, …, 故 n!= (n-1)(n-1)!+ (n-2)(n-2)!+…+2×2!+2!
定理:设S {n1 a1 , n2 a2 ,..., nk ak }, 且n ni , 则S
i 1
k
n! 的排列数等于 n1 ! n2 ! ... nk !
1.8.1可重排列
例1 求不多于4位数的二进制数的个数.
解:问题相当于多重集 { 0, 1}的4-排列 问题,故其个数为N=24 16
k 或者 k
1.6.4换位法
考虑{1,2…n}的一个排列,其上每一个整数都给 了一个方向,我们称整数k是可移的 (Mobile&Active),如果它的箭头所指的方向的邻 点小于它本身。例如
263154
中6、3、5都是可移的。显然1永远不可移,n 除了以下两种情形外,它都是可移的: (1) n是第一个数,且其方向指向左侧,
5
1.6.3字典序法
一般而言,设P是[1,n]的一个全排列。
P=P1P2…Pn=P1P2…Pj-1PjPj+1…Pk-1PkPk+1…Pn j=max{i|Pi<Pi+1},k=max{i|P1…Pk-1PjPk+1…Pn翻转,
P’= P1P2…Pj-1PkPn…Pk+1PjPk-1…Pj+1即是P的下一个
1 2 3 4 1 2 4 3 1 4 2 3 4 1 2 3 4 1 3 2 1 4 3 2 1 3 4 2 1 3 2 4 3 1 2 4 3 14 2 3 4 1 2 4 3 1 2
4 3
3 3 3 2 2 2 42 42 2 2 2
2 1 42 1 2 41 2 1 4 3 1 4 3 41 43 1 3 1 1 3 41 3 1 43 1 3 4
1.8.1可重排列
定理 设多重集 S { a1 , a2 ,..., ak } 则S的 kr. r-(可重)排列数是
推论: 设多重集S {n1 a1 , n2 a2 ,..., nk ak }, 且对 一切的i 1,2,..k ,有ni r , 则S的r 排列数是k r .
该算法的优点是排列清晰,而且保持着字典序。 缺点是算法较繁琐。
1.6.4换位法
基于直接生成法 [n]的全排列可由[n-1]的全排列生成: 给定[n-1]的一个排列п,将n 由最右端依次插入排 列п ,即得到n个[n]的排列:
p p2…pn-1n
1
p p2…npn-1
1
…
np p2…pn-1
1
例, n=4