【离散数学】计数/排列组合

离散数学第三篇,讨论基本的计数技术——排列组合及其推广。组合数学是离散数学的重要组成部分,这里比较简略,待到有时间详细学习组合数学后再讨论一些复杂一点的问题。那何为组合数学呢?组合数学(Combinatorics)是研究一定条件的组态的存在、计数以及构造的科学。直白说就是研究物体如何安排的科学。这里的组合数学是狭义的组合数学,广义的组合数学就是离散数学。因计算机科学的核心就是使用算法研究离散数据,所以组合数学在算法科学中具有重要地位。本文主要内容:基本计数原则、鸽巢原理、排列组合及其推广、二项式定理与恒等式以及生成排列组合的算法。


基本计数原则

乘法原则

如果一个任务被分解为相互独立的两个步骤,完成第一个步骤有 n1 n 1 种方法,第二个步骤有 n2 n 2 种方法,则完成整个过程方法数为 n1n2 n 1 ⋅ n 2 。推广到多个步骤就是 n1n2nk n 1 ⋅ n 2 ⋅ ⋯ ⋅ n k ,共k个步骤, ni n i 是第 i i 个步骤的方法数。

用集合语言描述如下: |A1×A2××Ak|=|A1||A2||Ak| | A 1 × A 2 × ⋯ × A k | = | A 1 | ⋅ | A 2 | ⋅ ⋯ ⋅ | A k |

求和原则

如果有两种独立的途径完成一项任务,第一种有 n1 n 1 种方法,第二种有 n2 n 2 种方法,则完成该任务共有 n1+n2 n 1 + n 2 种方法。推广到多种途径就是 n1+n2++nk n 1 + n 2 + ⋯ + n k 种方法。

也称为加法原则。用集合语言描述: |A1A2Ak|=|A1|+|A2|++|Ak| | A 1 ∪ A 2 ∪ ⋯ ∪ A k | = | A 1 | + | A 2 | + ⋯ + | A k | ,其中 AiAj= A i ∩ A j = ∅ ,对所有 i i j j .

减法原则

如果一个任务可以有两种途径完成,第一种有 n1 n 1 种方法,第二种有 n2 n 2 种方法,两种途径中有 n3 n 3 种方法是相同的。则完成该任务共有 n1+n2n3 n 1 + n 2 − n 3 种方法。

集合语言描述:即是两个集合的容斥原理 |A1A2|=|A1|+|A2||A1A2| | A 1 ∪ A 2 | = | A 1 | + | A 2 | − | A 1 ∩ A 2 |

除法原则

如果一个任务可以由 n n 种方法完成,而在这 n n 中方法中每一种完成的方式在 n n 种中正好有 d d 种与之对应(即在该问题的研究中可以看做一种方法),则完成该任务的方法数为 n/d n / d

这几个原则乃是计数最基础的原则,很好理解。


鸽巢原理

鸽巢原理的通俗描述:如果鸽子比笼子多,那么一定有一个笼子里面至少有两只鸽子。

鸽巢原理

描述:把 k+1 k + 1 个甚至更多物体放入 k k 个盒子,那么至少有一个盒子里面有两只甚至更多个物体。

推论:从 k+1 k + 1 个甚至更多个元素的集合到 k k 个元素的集合的函数 f f 一定不是一对一函数。

广义鸽巢原理

描述:将 N N 个物体放入 k k 个盒子,那么至少有一个盒子里面有 N/k ⌈ N / k ⌉ 个物体。

应用

定理:每个由 n2+1 n 2 + 1 个不同实数构成的序列都包含一个长度为 n n 的严格递增子序列或严格递减子序列。

上述定理可以使用广义鸽巢原理证明。

拉姆齐数(Ramsey number) R(m,n) R ( m , n ) (其中 m,n2 m , n ≥ 2 ) 是这样一个数 N N ,使得在 N N 个人中有 m m 个人互相认识或 n n 个人互相不认识需要的最小人数 N N 。其中两个人要么互相认识,要么互相不认识。

拉姆齐定理(Ramsey theory)是组合学的一个重要组成部分,用来处理集合元素的子集分配问题。
拉姆齐数也是图论中的重要函数之一。已知的拉姆齐数非常少,这包括 R(2,n)=n R ( 2 , n ) = n (其中 n2) n ≥ 2 ) R(3,3)=6 R ( 3 , 3 ) = 6 R(4,4)=18 R ( 4 , 4 ) = 18 等。有一个关于拉姆齐数的笑话

想像有队外星人军队在地球降落,要求取得R(5,5)的值,否则便会毁灭地球。在这个情况,我们应该集中所有电脑和数学家尝试去找这个数值。若它们要求的是R(6,6)的值,我们要尝试毁灭这班外星人了。

形象的描述了寻找拉姆齐数的难度。我们只能知道很多拉姆齐数的上下界,包括著名的 43R(5,5)49 43 ≤ R ( 5 , 5 ) ≤ 49


排列组合

解决某些计数问题时,我们会发现可以通过找到特定大小集合中不用元素的排列的方法数来解决问题,其中元素的次序收到限制,即是排列问题(Arrangement)。而另一些问题可以通过找到从特定大小元素集合中选出特定数量元素的方法数来解决,即是组合问题(Combination)。这里详细阐述这两类问题。

排列

n n 个不同元素组成的集合中选出 r r 个元素排成一列,即需要考虑排列的次序。这种有序安排称为 n n 元素集合的r排列。排列的方法数记作 P(n,r) P ( n , r ) (也记作 Arn A n r 或者 Prn P n r ),读作 n n 元素集合的 r r 排列数。

显然, P(n,r) P ( n , r ) =n(n1)(n2)(nr+1) = n ( n − 1 ) ( n − 2 ) ⋯ ( n − r + 1 ) =n!(nr)! = n ! ( n − r ) !
n n 元素集合的全排列为 P(n,n)=n! P ( n , n ) = n !

组合

n n 个不同元素组成的集合中无序选出 r r 个元素,即不需要考虑排列的次序。这些无序选取的元素构成该集合的子集,称为 n n 元素的一个 r r 组合。组合的方法数记作 C(n,r) C ( n , r ) (或者 Crn C n r ),读作 n n 元素集合的 r r 组合数。也记作 (nr) ( r n ) ,并且称为二项式系数。

显然, C(n,r) C ( n , r ) =n!r! (nr)! = n ! r !   ( n − r ) ! =P(n,r)P(r,r) = P ( n , r ) P ( r , r ) =n(n1)(n2)(nr+1)r! = n ( n − 1 ) ( n − 2 ) ⋯ ( n − r + 1 ) r !

显然有

C(n,r)=C(n,nr) C ( n , r ) = C ( n , n − r )
P(n,r)=C(n,r)P(r,r) P ( n , r ) = C ( n , r ) ⋅ P ( r , r )
基础不过多解释。


二项式定理与恒等式

n n 元素集合的 r r 排列数常记作 (nr) ( r n ) ,由于这些数出现在二项式幂 (a+b)n ( a + b ) n 的展开式中作为系数,所以也称二项式系数

二项式定理

x x y y 是变量, n n 是非负整数,那么

(x+y)n=j=0n(nj)xnjyj ( x + y ) n = ∑ j = 0 n ( j n ) x n − j y j
这很容易理解,由二项式定理可以得到任何一个 (x+y)n ( x + y ) n 的展开式。

一些推论:

  • nk=0(nk)=2n ∑ k = 0 n ( k n ) = 2 n ,令 x=y=1 x = y = 1 得到。
  • nk=0(1)k(nk)=0 ∑ k = 0 n ( − 1 ) k ( k n ) = 0 ,令 x=1 x = 1 y=1 y = − 1 得到。
  • nk=02k(nk)=3n ∑ k = 0 n 2 k ( k n ) = 3 n ,令 x=1 x = 1 y=2 y = 2 得到。

帕斯卡恒等式

n n k k 是满足 nk n ≥ k 的正整数,则有 (n+1k)=(nk1)+(nk) ( k n + 1 ) = ( k − 1 n ) + ( k n ) .

证明:现从n+1个元素中取k个元素组成一个集合,将n+1个元素集合分为两部分,一个包含n个元素,一个包含1个元素。现要从n+1个集合中取出k个元素,则将有两种选择——包含这单独的一个元素与否,若包含,则只需要从n个元素中取出另外的k-1个,若不包含,则需从n个中取出全部k个,由加法原则有 (n+1k)=(nk1)+(nk) ( k n + 1 ) = ( k − 1 n ) + ( k n )

我们可以使用帕斯卡恒等式递归定义二项式系数。

帕斯卡三角形

帕斯卡三角形的基础是帕斯卡恒等式,亦是著名的杨辉三角
如下:

(00)(10)(11)(20)(21)(22)(30)(31)(32)(32)(40)(41)(42)(43)(44)(50)(51)(52)(53)(54)(55)(60)(61)(62)(63)(64)(65)(66) ( 0 0 ) ( 0 1 ) ( 1 1 ) ( 0 2 ) ( 1 2 ) ( 2 2 ) ( 0 3 ) ( 1 3 ) ( 2 3 ) ( 2 3 ) ( 0 4 ) ( 1 4 ) ( 2 4 ) ( 3 4 ) ( 4 4 ) ( 0 5 ) ( 1 5 ) ( 2 5 ) ( 3 5 ) ( 4 5 ) ( 5 5 ) ( 0 6 ) ( 1 6 ) ( 2 6 ) ( 3 6 ) ( 4 6 ) ( 5 6 ) ( 6 6 ) …

计算出数值:
111121133114641151010511615201561 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 ⋯

在上述三角形中,用帕斯卡恒等式可以证明,每个二项式系数均等于该数其上一行左右两系数之和(左边或者右边没有数的可以看做是0),即每一行相邻两个系数相加就产生了下一行的这两个系数中间的二项式系数。

其他二项式系数恒等式

范德蒙德恒等式:

(m+nr)=k=0r(mrk)(nk) ( r m + n ) = ∑ k = 0 r ( r − k m ) ( k n )

证明方法:将m+n个元素的集合分为m个和n个元素的两个集合,从这两个集合中合取r个元素的方法数与从原来m+n个元素集合中取r个元素的方法数相等。

推论:
m=n m = n 即可得到: (2nn)=rk=0(nk)2 ( n 2 n ) = ∑ k = 0 r ( k n ) 2

定理: r r n n 为非负整数, rn r ≤ n ,那么

(n+1r+1)=j=rn(jn) ( r + 1 n + 1 ) = ∑ j = r n ( n j )

证明:考虑包含r+1个1的n+1位01位串,最后一个1出现的位置可能是r+1,r+2,…,n+1位上,则其余的1则出现在前面。若最后一位在第j+1位上,则前面j位出现的r个1的位串数为 (jr) ( r j ) ,由加法法则即可证明上述恒等式。

多项式定理

类比二项式定理,由排列组合与计数原则可以得到:
多项式定理:如果n是正整数,则

(x1+x2++xm)n=x1+x2++xm=nC(n;n1,n2,...,nm)xn11xn22xnmn ( x 1 + x 2 + ⋯ + x m ) n = ∑ x 1 + x 2 + ⋯ + x m = n C ( n ; n 1 , n 2 , . . . , n m ) x 1 n 1 x 2 n 2 ⋯ x n n m

其中多项式系数 C(n;n1,n2,...,nm)=n!n1!n2!nm! C ( n ; n 1 , n 2 , . . . , n m ) = n ! n 1 ! n 2 ! ⋯ n m !

证明:从 n n 次幂中选出 n1 n 1 次给 x1 x 1 n2 n 2 次给 x2 x 2 ,…, nm n m xm x m 即可,系数 C(n;n1,n2,...,nm)= C ( n ; n 1 , n 2 , . . . , n m ) = C(n,n1)C(nn1,n2)C(nm,nm) C ( n , n 1 ) ⋅ C ( n − n 1 , n 2 ) … C ( n m , n m ) 化简即可得到上述式子。


排列组合的推广

单纯的排列与组合能解决的问题十分有限。因为排列与组合要求所有元素不同,而且不能重复选择一个元素。而某些问题中涉及重复选择与具有不可区分的元素的排列组合。这时需要对排列组合进行推广。我们还可以通过模拟把物体放入盒子的过程来解决许多问题,其中的物体可以是可分辨的与不可分辨的,盒子也可以是可分辨的与不可分辨的。

有重复的排列

当元素允许重复时,由乘法法则很容易得到排列数。

定理: n n 个元素集合的允许重复 r r 排列数是 nr n r

有重复的组合

n n 个元素集合的允许重复的 r r 组合有 C(n+r1,r) C ( n + r − 1 , r ) =C(n+r1,n1) = C ( n + r − 1 , n − 1 ) 个。

证明:因为n个元素可以重复,我们可以将其等效为n个盒子,放入其中的元素不区分,并用n-1条隔板将其分隔。则n元素集合的允许重复的r组合数即是将选出r个元素放入n个盒子中,即用n-1个隔板将其隔开。则从n个元素中可重复地选r个即可等价为从隔板和物体构成的n+r-1个物体或者隔板的排列中选出r个物体或者选出n-1个隔板的位置。即是 C(n+r1,r) C ( n + r − 1 , r ) =C(n+r1,n1) = C ( n + r − 1 , n − 1 )

允许重复与不允许的排列组合数:

类型 允许重复 公式
r 排列 n!(nr)! n ! ( n − r ) !
r 组合 n!r!(nr)! n ! r ! ( n − r ) !
r 排列 nr n r
r 组合 (n+r1)!r!(n1)! ( n + r − 1 ) ! r ! ( n − 1 ) !

具有不可区分物体的排列

设类型 j j nj n j 个物体, 1jk 1 ≤ j ≤ k n1+n2++nk=n n 1 + n 2 + ⋯ + n k = n ,则 n n 个物体的不同排列数为

n!n1!n2!nk! n ! n 1 ! n 2 ! … n k !

即是从 n n 个位置中选 nj n j 个来放类型 j j 的物体,有:
C(n,n1)C(nn1,n2)C(nk,nk) C ( n , n 1 ) ⋅ C ( n − n 1 , n 2 ) … C ( n k , n k ) =n!n1!n2!nk! = n ! n 1 ! n 2 ! … n k !

把物体放入盒子的问题

许多问题都可以等效为把物体放入盒子的问题。其中的物体可以是可分辨的与不可分辨的,盒子也可以是可分辨的与不可分辨的。其中如果盒子是可分辨的,则可以转化为前面的问题。如果盒子是不可分辨的,不管物体可不可分辨,都将没有闭公式,可以通过列举或者编程求解来解决此类为题。

可分辨的物体与可分辨的盒子

n n 个可分辨的物体放入 k k 个可分辨的盒子使得 ni n i 个物体放入盒子 i i ( i=1,2,...,k i = 1 , 2 , . . . , k )的方法数为:

n!n1!n2!nk! n ! n 1 ! n 2 ! … n k !

不可分辨的物体与可分辨的盒子

n n 个不可分辨的物体放入 k k 个可分辨的盒子使得 ni n i 个物体放入盒子 i i ( i=1,2,...,k i = 1 , 2 , . . . , k )的方法数为: C(n+k1,n) C ( n + k − 1 , n )

可以看到这即是 k k 个元素集合的可重复的 n n 排列数。

可分辨的物体与不可分辨的盒子

这类问题求出公式比较复杂,列举可解决。这里略过。

不可分辨的物体与不可分辨的盒子

列举同样可以解决,这里通过一个例子来说明。
例:将6个物体放入4个盒子,有以下方式:
6
5,1
4,2
3,3
4,1,1
3,2,1
2,2,2
3,1,1,1
2,2,1,1
共9种方式。

n n 个不可分辨的物体放入 k k 个不可分辨的盒子等价于将 n n 写成 k k 个非递增正整数之和。其中的每一种方法,我们将其称作将正整数 n n 划分成 k k 个正整数的一个划分,用 pk(n) p k ( n ) 来表示。则将 n n 个不可分辨的物体放入 k k 个不可分辨的盒子的方法数为 pk(n) p k ( n ) 。对此,没有简单的公式来表示,略。


生成排列及组合的算法

以后补上。


参考资料:《离散数学及其应用》(本科教学版,Kenneth H.Rosen著,原书第七版)

你可能感兴趣的:(离散数学,数学,计算机科学,离散数学)