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