离散数学第三篇,讨论基本的计数技术——排列组合及其推广。组合数学是离散数学的重要组成部分,这里比较简略,待到有时间详细学习组合数学后再讨论一些复杂一点的问题。那何为组合数学呢?组合数学(Combinatorics)是研究一定条件的组态的存在、计数以及构造的科学。直白说就是研究物体如何安排的科学。这里的组合数学是狭义的组合数学,广义的组合数学就是离散数学。因计算机科学的核心就是使用算法研究离散数据,所以组合数学在算法科学中具有重要地位。本文主要内容:基本计数原则、鸽巢原理、排列组合及其推广、二项式定理与恒等式以及生成排列组合的算法。
基本计数原则
乘法原则
如果一个任务被分解为相互独立的两个步骤,完成第一个步骤有 n1n1 种方法,第二个步骤有 n2n2 种方法,则完成整个过程方法数为n1⋅n2n1⋅n2。推广到多个步骤就是n1⋅n2⋅⋯⋅nkn1⋅n2⋅⋯⋅nk,共k个步骤,nini是第ii个步骤的方法数。
用集合语言描述如下:
求和原则
如果有两种独立的途径完成一项任务,第一种有 n1n1 种方法,第二种有 n2n2 种方法,则完成该任务共有n1+n2n1+n2种方法。推广到多种途径就是 n1+n2+⋯+nkn1+n2+⋯+nk 种方法。
也称为加法原则。用集合语言描述:|A1∪A2∪⋯∪Ak|=|A1|+|A2|+⋯+|Ak||A1∪A2∪⋯∪Ak|=|A1|+|A2|+⋯+|Ak|,其中Ai∩Aj=∅Ai∩Aj=∅,对所有 ii, .
减法原则
如果一个任务可以有两种途径完成,第一种有 n1n1 种方法,第二种有 n2n2 种方法,两种途径中有 n3n3 种方法是相同的。则完成该任务共有 n1+n2−n3n1+n2−n3 种方法。
集合语言描述:即是两个集合的容斥原理 |A1∪A2|=|A1|+|A2|−|A1∩A2||A1∪A2|=|A1|+|A2|−|A1∩A2|
除法原则
如果一个任务可以由 nn 种方法完成,而在这 中方法中每一种完成的方式在 nn 种中正好有 种与之对应(即在该问题的研究中可以看做一种方法),则完成该任务的方法数为 n/dn/d。
这几个原则乃是计数最基础的原则,很好理解。
鸽巢原理
鸽巢原理的通俗描述:如果鸽子比笼子多,那么一定有一个笼子里面至少有两只鸽子。
鸽巢原理
描述:把 k+1k+1 个甚至更多物体放入 kk 个盒子,那么至少有一个盒子里面有两只甚至更多个物体。
推论:从 个甚至更多个元素的集合到 kk 个元素的集合的函数 一定不是一对一函数。
广义鸽巢原理
描述:将 NN 个物体放入 个盒子,那么至少有一个盒子里面有 ⌈N/k⌉⌈N/k⌉ 个物体。
应用
定理:每个由 n2+1n2+1 个不同实数构成的序列都包含一个长度为 nn 的严格递增子序列或严格递减子序列。
上述定理可以使用广义鸽巢原理证明。
拉姆齐数(Ramsey number): (其中m,n≥2m,n≥2) 是这样一个数 NN,使得在 个人中有 mm 个人互相认识或