计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,1
4、计数原理 /Counting
4.5 排列与组合的生成
Generating Permutations
and Combinations
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,2
在实际应用中,往往不仅需要计数,而且要把各种情况都枚举出来 。
一,字典序排列 /lexicographic ordering
for permutation
定义,
顺序:排列a 1,a 2,…,a n中相邻两数
a i<a i+1,称为一个顺序 。
逆序:排列a 1,a 2,…,a n中相邻两数
a i>a i+1,称为一个逆序 。
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,3
例:
排列1 3 2 6 5 4
顺序:13,26,逆序:32,65,54 。
对n个对象进行全排列,有n ! 个排列,可以对n个对象加上标记 。
不失一般性,我们只需对n个自然数 { 1,
2,…,n } 进行全排列,枚举出所有的情况 。
1,给出初始排列:p 1=1,2,3,4,…,n
2,若p k已定义 (1 ≤ k ≤ n ! -1 )
p k=a 1,a 2,…,a m,…,a n
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,4
则按下列规定,定义p k
p k+1=b 1,b 2,…,b m,…,b n
(1)寻找a m:m=max {j |a j<a j+1}
即a m,a m+1是最右面的顺序,自a m+1开始均为逆序 。
(2)给出b i( i=1,2,…,n )
a )
b 1=a 1,b 2=a 2,…,b m-1=a m-1
b ) b m=min {a p|a p>a m,p>m )
即在a m右面大于a m的项中选取最小的项作为b m。
c ) 把a m,a m+1,…,a p-1,a p+1,…,a n从小到大排列,送入b m+1,b m+2,…,b n。
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,5
例1,设有n=6个数字的排列a 1,a 2,…,
a 6为1,2,4,6,5,3,求它的下一个排列 。
解,1.求 m,4,6是最右的顺序,a m=4,
m=3
2.定义 bi,b 1=1,b 2=2,在a m右边还有6,5,3,其中6和5大于a m=4,
5是最小的,b 3=5
3.余下a 3=4,a 4=6,a 6=3,从小到大排起来,为3,4,6,即让b 4=3,
b 5=4,b 6=6
得到1,2,4,6,5,3的下一个排列:1,2,5,3,4,6 。
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,6
例2:求n=4时 { 1,2,3,4 } 的所有排列 。
解:
1234 → 1243 → 1324 → 134 2→ 1
423 → 1432 → 2134 → 2143 → 2
314 → 2341 → 2413 → 2431 → 3
124 → 3142 → 3214 → 3241 → 3
412 → 3421 → 4123 → 4132 → 4
213 → 4231 → 4312 → 4321
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,7
定理一:
用字典序排序方法可由1,2,3,…,
n的第一个排列1,2,…,n ( 全顺序 ) 开始,得到n ! 个排列,且最后一个排列是n,
n-1,…,2,1 ( 全逆序 ) 。
注:
例2中开始的排列与结束时的排列的特征,
可用数学归纳法证明,对任意n个数用此算法都能枚举出所有的排列 。
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,8
二,字典序组合 /lexicographic ordering for
combination
对任意n个对象,求取其中k个对象组合的所有组合。
不失一般性,只要讨论求 {1,2,…,n}的所有k子集,共
k
n
C 个。
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,9
字典序组合算法,
1,S 1= { 1,2,…,k }
2,若S i= { a 1,a 2,…,a k} 已得到
( 1 ≤ i ≤ Cnk -1 ) 则构造下一个子集
S i+1= { b 1,b 2,…,b k}
(1)m=max {j |a j≠ n- ( k-j ) },
即 { a 1,a 2,…a j,…,a k} 与
{ n-k+1,n-k+2,…,
n-k+j,…,( n-1 ),n } 比较从右边开始比较第一个不相等的项为a m
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,10
(2)构造S i+1
a ) b 1=a 1,b 2=a 2,…,b m-1=a m-1
b ) b m=a m +1
c ) b m+1=b m+1,b m+2=b m+1+1,…,
b k=b k-1+1
注:
不用耽心b k会取到大于n的数计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,11
例:
n=10,k=7 。 若m=5,则
( a 1,a 2,a 3,a 4,a 5,a 6,a 7)
与 ( 4,5,6,7,8,9,10 ) 比较由于m=5,据算法,a 5不会取到8,
只能小于8,于是b m=a m+1至多是8,
a 6,a 7至多是9和10,不会取到大于1
0的数 。
例3,求 { 1,2,…,10 } 的6子集,共有 C106=210个,当S i= { 2,3,5,6,
9,10 } 时,求S i+1。
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,12
S i= { 2,3,5,6,9,10 }
与 { 5,6,7,8,9,10 } 比较
6 ≠ 8,a m=6,m=4,
于是b 1=a 1=2,b 2=a 2=3,b 3=a 3=5,
b 4=a 4+1=7,b 5-7+1=8,
b 6=8+1=9
得S i+1= { 2,3,5,7,8,9 }
S i+2
S i+3
S i+4
S i+5
……
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,13
定理二:
对n个元素的k子集组合,用字典序组合法,
可由 {1,2,…,k}开始,到 {n-k+1,n
-k+2,…,n-1,n}结束,共有
k
n
C 个组合。
计数原理
7/31/2009 11:29 AM Deren Chen,Zhejiang Univ,14
练 习
pp.300 5,10