第5 章 组合计数 5.1 内容提要 定理5.1(加法原理) 假定S1,S2,…,St 均为集合,第i 个集合Si 有ni 个元素。若 {S1,S2,…,St}为两两不交的集合(若i≠j,Si∩Sj =.),则可以从S1,S2,…,St 选择出 的元素总数为n1+n2+…+nt(即集合S1∪S2∪…∪St 含有n1+n2+…+nt 个元素)。 定理5.2(乘法原理) 如果一项工作需要t 步完成,第1步有n1 种不同的选择,第2步 有n2 种不同的选择,…,第t 步有nt 种不同的选择,那么完成这项工作所有可能的不同的 选择总数为n1×n2×…×nt。 排序 n 个不同元素x1,x2,…,xn 的一种排列为x1,x2,…,xn 的一个排序。 定理5.3 n 个元素的排列共有n!种。 排列 n 个(不同)元素x1,x2,…,xn 的r 排列是{x1,x2,…,xn}的r 元素子集上的排 列。n 个不同元素上的r 排列的个数记作P(n,r)。 定理5.4 n 个不同元素上的r 排列数目为P (n,r)=n(n-1)(n-2)…(n-r+1), r≤n。 组合 给定集合X = x1,x2,…,{ xn} 包含n 个元素,从X 中无序、不重复选取的r 个 元素称为X 的一个r 组合,X 的所有r 组合的个数记作C(n,r)。 定理5.5 n 个不同元素上的r 组合数为 C(n,r)=P(n,r) r! =n(n -1)…(n -r+1) r! = n! (n -r)!r! , r ≤n 定理5.6 令a1a2…ar 是{1,2,…,n}的一个r 组合。在字典排序中,第一个r 组合是 12…r。最后一个r 组合是(n-r+1)(n-r+2)…n。设a1a2…ar≠(n-r+1)(n-r+2)…n。 令k 是满足ak<n 且使得ak+1不同于a1,a2,…,ar 中的任何一个数的最大整数。那么在字典排 序中,a1a2…ar 的直接后继r-组合是a1…ak-1(ak +1)(ak +2)…(ak +r-k+1)。 定理5.7 设序列S 包含n 个对象,其中第1类对象有n1 个,第2类对象有n2 个,…, 第t 类对象有nt 个,则S 的不同排序个数为 n! n1!n2!…nt ! 定理5.8 X 为包含t 个元素的集合,在X 中允许重复、不计顺序地选取k 个元素, 共有 C(k +t-1,t-1)=C(k +t-1,k) 离散数学解题指导(第3 版) 11 8 种选法。 定理5.9(二项式定理) 设a 和b 为实数,n 为正整数,则 (a +b)n =Σn k=0 C(n,k)an-kbk 其中C(n,r)为a+b 的幂的展开式中的系数,故称为二项式系数。 定理5.10 对任意1≤k≤n,C(n+1,k)=C(n,k-1)+C(n,k)。 定理5.11 鸽笼原理(第一种形式) n 只鸽子飞入k 个鸽笼,k<n,则必存在某个鸽笼 包含至少两只鸽子。 定理5.12 鸽笼原理(第二种形式) 设f 为有限集合X 到有限集合Y 的函数,且|X|> |Y|,则必存在x1,x2∈X ,x1≠x2,满足f(x1)=f(x2),X 相当于第一种形式中的鸽子,Y 相当于第一种形式中的鸽笼。鸽子x 飞入鸽笼f(x1)。由鸽笼原理的第一种形式,至少有 两只鸽子x1,x2 ∈X 飞入同一个鸽笼,即对某两个x1,x2 ∈X ,x1 ≠x2,满足f (x1)= f(x2)。 定理5.13 鸽笼原理(第三种形式) 设f 为有限集合X 到有限集合Y 上的函数,|X|= n,|Y|=m 。令k=én/m ù,则至少存在k 个元素a1,a2,…,ak ∈X ,满足f(a1)=f(a2)= …=f(ak)。 递推定义函数 为了定义以非负整数集合作为其定义域的函数,就要规定这个函数在 0处的值,并给出从较小的整数处的值来求出当前值的规则。这样的定义称为递推定义。 递推定义集合 递推定义可用来定义集合,先给出初始元素,然后给出从已知元素构造 其他元素的规则。以这种方式描述的集合是严格定义的。 常系数k 阶齐次线性递推关系 形为an =c1an-1+c2an-2+…+ckan-k ,ck ≠0的递推 关系称为常系数k 阶齐次线性递推关系。 特征方程与特征根 方程pk -c1pk-1-c2pk-2-…-ck-1p-ck =0称为k 阶线性齐 次递推关系an =c1an-1-c2an-2-…-ckan-k 的特征方程,其中p 是一个常数。方程的解 p 称为该递推关系的特征根。 定理5.14 令 an =c1an-1 +c2an-2 ① 为常系数二阶齐次线性关系。 (1)若S 和T 为式①的解,则U =bS+dT 也为式①的解。 (2)若r 为方程 t2 -c1t-c2 =0 ② 的一个根,则序列rn(n=0,1,…)为式①的一个解。 (3)若an 为式①定义的序列, a0 =C0, a1 =C1 ③ 且r1 和r2 为方程②的两个不相同的根,则存在常数b 和d,使得 an =brn1 +drn2 , n =0,1,… 成立。定理5.15(Master定理) 设a≥1,b>1为常数,f(n)为函数,T (n)为非负整数,且 T(n)=aT(n/b)+f(n),则有以下结果: 组合计数 第5章 1 19 (1)f(n)=O(nlogba-ε),ε>0,那么T(n)=Θ(nlogba)。 (2)f(n)=Θ(nlogba),那么T(n)=Θ(nlogbalogn)①。 (3)f(n)=Ω(nlogba+ε),ε>0,且对于某个常数c<1和所有的充分大的n 有af(n/b)≤ cf(n),那么T(n)=Θ(f(n))。 定理5.16 对输入规模为n 的二分法查找,在最坏情形下的时间复杂度为O(logn)。 生成函数 对于序列a0,a1,a2,…,多项式A(x)=a0+a1x+a2x2+… 称为序列a0, a1,a2,…的生成函数。 下面用B(x)=b0+b1x+b2x2+…表示序列b0,b1,b2,…的生成函数;C (x)=c0+ c1x+c2x2+…表示序列c0,c1,c2,…的生成函数。 性质5.1 如果bn =αan ,α 为常数,则B(x)=αA(x)。 性质5.2 如果cn =an +bn ,则C(x)=A(x)+B(x)。 性质5.3 如果cn =Σn i=0 aibn-i,则C(x)=A(x)·B(x)。 性质5.4 如果bn = 0, n<l an-l, n≥l,则B(x)=xl·A(x)。 性质5.5 如果bn =an+l,则B(x)= A(x)- Σl-1 n=0 anxn xl 。 性质5.6 如果bn =Σn i=0 ai,则B(x)=A(x) 1-x 。 性质5.7 如果bn =Σ∞ i=0 ai,且A(1)=Σ∞ n=0 an 收敛,则B(x)=A(1)-xA(x) 1-x 。 性质5.8 如果bn =αnan ,a 为常数,则B(x)=A(αx)。 性质5.9 如果bn =nan ,则B(x)=xA'(x)。 性质5.10 如果bn = an n +1,则B(x)=1 x∫x 0 A(x)dx。 指数型生成函数 对于序列a0,a1,a2,…,多项式 Ge(x)=a0 +a1 x 1! +a2 x2 2! +a3 x3 3! + … 称为序列a0,a1,a2,…的指数型生成函数。 性质5.11 设数列{an}和{bn}的指数型生成函数分别为Ae(x)和Be(x),则Ae(x)· Be(x)=Σ∞ n=0 Cn xn n! ,其中Cn =Σn k=0 n k . è . . .÷akbn-k 。 5.2 例题精选 例5.1 设A 为n 元集,问: (1)A 上的自反关系有多少个? ① 本书以2为底的对数直接表示为log,如log2b 表示为logb。 120 离散数学解题指导(第3版) (2) A 上的反自反关系有多少个 ? (3) A 上的对称关系有多少个 ? (4) A 上的反对称关系有多少个 ? 解:(1)在 A 上的自反关系对应的关系矩阵中,主对角线元素都是1,其他位置的元 素 可以是1,也可以是0,每个位置有两种选择。这种位置有n2- n 个,根据乘法原理,自反关 系的个数是2n2- n 个。 (2)与(1)类似,反自反关系的个数也是2n2- n 个。 (3)考虑 A 上对称关系的矩阵。考虑分步处理的方法,先考虑主对角线上的元素。对 于主对角线上的每个位置,元素可以选择0或1,有2种选法,总共有2n 种方法。再考虑不 在主对角线上的元素,它们的值的选择并不是完全独立的。因为矩阵是对称的, i 行 j 列的 元素rij 必须与 j 行 i 列的元素rji相等。因此,当矩阵的上三角元素(或下三角元素)的值确 定以后,另一半对称位置的元素就完全确定了。这种能够独立选择0或1的位置有n2- n 2 n2-nn2+ n 个。因此,根据乘法原理,构成矩阵的方法数是2n22=22。 (4)与(3)的分析类似,也采用分步处理的方法,区别在于对非主对角线位置元素取值 n2-n 的约束条件不一样。将这些位置分成2 组,每组包含处在对称位置的两个元素rij 和 rji。根据反对称的性质,i和rji 的取值有三种可能:①rj =rj0;②rj =0,rj rj i1, i =ii =1; n2-n ③rij =rji=0。因此,所有这些位置元素的选择方法数为32。由乘法原理,考虑到主对角 n2- n 线上的元素的选取,总方法数是2n32 。 例5.说明排列生成算法如何生成163542 的后继 。 2 解:首先考虑能否在163542 后找到一个形如1635__ 的排列。唯一与163542 不同的形 如1635__ 的排列是163524,但163524<163542,故163542 的后继不是形如1635__ 的排列。 再考虑能否在163542 后找到一个形如163___ 的排列。后三个数字必为{2,4,5}的一 个排列。由于542 是{2,4,5}上最大的排列,形如163___ 的排列都小于给定的排列。故 163542 的后继不是形如163___ 的排列。 给定排列的后继不能以1635 或163 开头,原因在于给定的排列中余下的数字逆序排列 (分别为42 和542 )。故从右向左扫描,找到第一个数字d,使它的右邻 r 满足d<r。本例 中,第三个数字3满足这个性质,所以给定的排列的后继以16 开头。16 后的第一个数字必 须大于3。为找到比给定排列大的最小的排列,该位应为4。于是,给定排列的后继以164 开头。为使排列最小,余下的三个数字235 应按升序排列。于是,给定排列的后继 为164235 。 例5.证明:把5个顶点放到边长为2的正方形中,至少存在两个顶点,它们之间的 3 距离小于或等于2。 证明:鸽笼原理可用于判断是否存在给定性质的对象。若鸽笼原理的条件成立,则存 在满足条件的对象,但鸽笼原理并不能指出这样的对象怎样去寻找,或是在哪里。运用鸽笼 原理时必须确定哪些对象相当于鸽子,哪些对象相当于鸽笼。本例中5个顶点相当于鸽子, 关键在于鸽笼的确定。若采用如图5-1(a)所示的方式,则不能说明对象具有对象之间的距 组合计数 离小于或等于2这样的性质。而采用如图5-1(b)所示的方式,则可以证明把5个顶点放到 边长为2的正方形中,至少存在两个顶点,它们之间的距离小于或等于2。 如图5-1(b)所示将边长为2的正方形分为4个边长为1的小正方形,根据鸽笼原理,5 个顶点中必有2个顶点会放到其中一个小正方形里,这两个顶点的距离显然小于或等 于2。 图5-例5. 13示意图 例5.4 在计算机中经常需要对数据进行排序,其中有一种排序算法称为插入排序。该 算法思想是:假设前i-1个数已经排好,从第i-1个数开始,从后向前,顺序将已经排好 的数与第 i 个数进行比较,直到找到第 i 个数应该放置的适当位置,然后插入第 i 个数。算 法开始时i=2,每当上述过程完成后 i 加1,直到i= n 的过程完成为止。 试确定插入排序算法在最坏情况下的比较次数。为了简单起见,不妨设输入是 n 个不 同的数构成的数组,其中n=2k 为正整数。 k , 解:设 W (表示插入排序算法在最坏情况下的比较次数。如果n-1个数已经排好, n) 为插入第 n 个数,最坏情况下需要将它与前n-1个数中的每一个都进行一次比较,因此得 到递推方程 W (n)= W (-1)+n n-1 W (1)=0 设该方程的特解为 W *(=将它代入递推方程得 n)P1n+P2, P1n+P2-(P1(-1)+P2)=-1 化简得P1=n-1,左边是 n 的0次多项式,右(n) 边是 n 的1次多(n) 项式。没有常数P1 能够使 它成立。原因在于:如果特征根是1,当把特解代入方程后,在等式左边所设特解的最高次 项和常数项都被抵消了。为了保证等式两边的多项式的次数相等,必须将特解的次数提高。 不妨设特解为 W *(=将它代入递推方程得 n)P1n2+P2n, (2+P2(-1)) P1(n P1n2+P2n)-(n-1)=n-1 化简得 2P1n-P1+P2=n-1 解得P1=1/2,P2=-1/2。通解为 W (n)=nc+n(-1)/2=c+n(-1)/2 1nn 代入初值 W (1)0, 0, n)n(1)/2。这说明 W (=n2)。 =得c=最终得到 W (=n-n)O( 第 章 121 122 离散数学解题指导(第3版) 5.应用案例 3 5.1 大使馆通信的码字数 3. 问题描述:某国大使馆与它的国家通信,所用的码字由长度为 n 的十进制数字串组成。 为了捕捉到传输中的错误,约定每个码字中字符3和字符7的总个数必须是奇数。可能的 码字有多少个? 解答:设sn 表示长度为 n 的容许码字的个数。下面推导s的递推关系。考虑长度为 n+1 的字 W ,它由sn+1 计数,它的末尾要么是3或7,要么都不是(n) 。如果它以3或7结尾, 那么从 W 中删除最后一个数字得到长度为 n 的字 W *,它一定有偶数个3和7。因为共有 10n 个长度为 n 的十进制数字串,所以这种字 W *共有10n -sn 个。因为 W 的最后一个数 字可以是3或7,因此可能的这种形式的字 W 共有2×(10n -sn )个。 现在假设容许字 W 不以3或7结尾,那么删除它的最后一个数字后得到一个被sn 计 数的字。因为 W 的最后一个数字有8种可能性,所以这种形式的容许字的个数是8sn 。 综合上面两段的结果得到 n sn+1=2× (10-sn )+8sn =2×10n+6sn 其中,s0=0,因为空串不可能有表5- 1 用递推关系计算结果 n≥1 。显然, 奇数个3和7。可以利用这个递推关系计算 n 出如表5-1所示的结果。0 例如,1 s2 计算恰好有一个3或7的2位 的串的个数。因为可以用3也可以用7,又2 因为这可以是第一个数字也可以是第二个数3 字,并且因为剩下的那个数字有8种选择,因 此这样的串有2×2×8=32 个。 Sn 0 2×100+6×0=2 2×101+6×2=32 2×102+6×32=392 利用生成函数得到sn 的显式公式。设S是序列{sn}的生成函数,于是 S=s0+s1x+s2x2+s3x3+ … 有 S=s0+ (2×100+6s0)x+ (2×101+6s1)x2+ (2×102+6s2)x3+ … 12x2+ …)+6s0+s1x+s2x2+s3x3+ …) =s0+2x(100+10x+10x( =2+ …)+ 6 0+2x(1+10x+ (10x)xS - =2x(1-10x)1+6xS 求解S,得到 S(1-6x)=2x(1-10x) -1 或者 2x S= 求常数a和b,使得 (1-6x)(1-10x) 2x aba(1-10x)+b(1-6x) (1-6x)(1-10x) = 1-6x+1-10x= (1-6x)(1-10x) 组合计数 由分子相等给出方程a+b=0和-10a-6b=2。很容易解得:a=-1/2,b=1/2。因 此有 1 -1 -1 S=-2(1-6x)1+ 2(1-10x) = 1[(1-10x)-1-(1-6x)-1] 2 1[(x2+ …)-(x2+ …) ] = 21-10x+1001+6x+36 从中看到,S中xr 的系数是 : rr 10-6 sr = 例如,10036)/232,3=(- 2 =392 。这些值与先前的计算相吻合。 s2=(-=s1000216)/2 5.2 条条道路通罗马 3. 问题描述:魔术表演者甲请他的临时助手乙想一个数字,然后甲用“心灵感应”来感应 乙的数字,如图5-2所示,甲可以感应出乙最终停的位置,请说明其中的数学原理。 图5- 2 条条道路通罗马 甲拿一副扑克牌,随便洗牌,发出来排好。先数牌,规则是从1~10 由乙随便选一个数 字,例如5(乙自己记住,不告诉甲), 按顺序依次数5张牌,若第5张牌的点数大于10(J、Q、 K), 则当成数字5继续数下去;若第5张牌的点数小于或等于10(A,2,3,…,10), 则按照第 5张牌的点数依次数下去;重复这一过程直到剩余牌的数目小于要数的数字时,数牌停止。 假设选的数字是5,图5-2给出了具体数牌的过程,上方标五星的是每次数的牌,从.7 开 始,最终停在.10 。【资料来源:刘炯朗.魔术中的数学[J].中国计算机学会通讯,2015 第 章 123 离散数学解题指导(第3版) (12)】 解答:假设在魔术中乙(助手)想到的数字是6,而甲不知道乙的数字是什么。甲也选一 个数字,例如5(不一定与乙相同), 乙和甲都按照上述的规则数牌,数到最后,无法再走下去 了,可以发现乙的结果与甲的结果相同! 如图5-3所示,其中上方标记圆点为开始选数字5 的路径,上方标记菱形为开始选数字6的路径。这套魔术的秘密(数学原理)是甲可以把乙 停下的位置感应出来。 124 图5- 3 两条路径示例 还可以换别的数来尝试,例如开始选1,图5-3中上方标记五星的是数牌的路径,最后也 是停在.9 上。事实上,将一副牌排好,在数字1~10 中随便选一个,按照前面的规则数到 最后,停在同一个地方的概率大约为80% 。运气好的话,乙选的数字跟甲选的数字是会碰 头的。假如不碰头,甲可以说:“ 今天心灵感应有点问题,让我再感应一次”,最后总是能碰 头的。 这背后的数学原理是,只要助手乙和甲走的两条路中间有一点是两条路径碰头处,那么 之后的路径就是完全相同的,最后一定到达同一个地方停下来。已知52 张牌,一共是4× (1+2+…+10)+12×5=280 点, 38 点, 平均每张牌是280÷52≈5.也就是说平均每5张就 会有一张在所选的路径上,那么在每5张牌中碰到的概率约为1/5,因此在这52 张牌中完 -10≈0. 全碰不上的概率约为(11/5)107,最终碰上的概率约为0.893 。上面这个模型是数学 8524, 家做出来的,但是通过模拟,可以发现结果也差不多,约为0.见图54。因此,乙想一 个数字,甲想一个数字,两条路径走到同一个终点的概率大概是85%~89% 。正如福尔摩 斯所说:当沿着两条不同的思路思考时,就会找到一个相交点,那应该就是相当接近真 相了。 组合计数 第5章 1 25 图5-4 “条条道路通罗马”的数学原理 5.4 习题解答 5.1 当执行完以下的代码后,k的值是多少? k=0 for i1:=1 to n1 for i2:=1 to n2 . for im:=1 to nm k:=k+1 解:由于这个程序是从k=0开始,不断地给k 加1,而加1的个数就是执行循环的次 数,即n1n2…nm 次,所以当执行完代码后,k 的值是n1n2…nm 。 5.2 在一幅数字图像中,若将每个像素用8位进行编码,那么每个点有多少种不同的 取值? 解:用8位进行编码又分为8个步骤:选择第一个位,选择第二个位,…,选择第八个 位。每一位有两种选择,故根据乘法原理,8位编码共有2×2×2×2×2×2×2×2=28= 256种取值。 5.3 X 为n 个元素的集合,有多少满足A .B.X 的有序对(A ,B)? 解:给定一个满足A .B .X 的有序对(A ,B ),可知X 的每个元素必属于且仅属于 A 、B-A 、X -B 中的一个集合。反之,若指定X 的每一个元素到A(该元素在B 和X 中)、 B-A(该元素在X 中)、X -B 三个集合中的一个,也就唯一确定了满足A .B .X 的有序 对(A ,B)。可见,满A .B.X 的有序对(A ,B)的个数等于将集合X 中的元素指定到A 、 B-A 、X -B 三个集合的不同指派数。将这样的指派分为n 个步骤:指定X 中的第一个 元素到A 、B-A 、X -B 三个集合中的一个;指定X 中的第二个元素到A 、B -A 、X -B 三 个集合中的一个;……;指定X 中的第n 个元素到A 、B-A 、X -B 三个集合中的一个。每 一步有三种指定方法,故满足A .B.X 的有序对(A ,B)的个数为3....×..3..×....…..×....3 n个3 =3n 。 5.4 按字典序列出{1,2,3,4}上的所有排列以及{1,2,3,4,5,6}上的所有4组合。 解:{1,2,3,4}上的所有排列为 1234,1243,1324,1342,1423,1432,2134,2143, 2314,2341,2413,2431,3124,3142,3214,3241, 3412,3421,4123,4132,4213,4231,4312,4321 离散数学解题指导(第3 版) 12 6 {1,2,3,4,5,6}上的所有4组合为 1234,1235,1236,1245,1246,1256,1345,1346, 1356,1456,2345,2346,2356,2456,3456 与r 组合生成算法类似,排列生成算法可按字典序列出{1,2,…,n}上的所有排列。 5.5 若按字典序列出X ={1,2,3,4,5,6,7}上所有的4组合,则2367的下一个字串是 什么? 解:以23开头的最大的字串为2367,故字串2367的下一个字串以24开头。因为字串 2456是以24开头的最小的字串,故字串2367的下一个字串是2456。 5.6 说明排列生成算法如何生成163542的后继,应使左边尽可能多的数字保持不变。 解:见主教材例5.14。 5.7 求(a+b)9 展开式中a5b4 项的系数。 解:在二项式定理中令n=9,k=4,得展开式含a5b4 的一项为 C(n,k)an-kbk =C(9,4)a5b4 =126a5b4 故a5b4 项的系数为126。 5.8 求和:12+22+…+n2。 解:先求{n2}的生成函数A(x)= Σ∞ n=0 n2xn 。由1 (1-x)2 =Σ∞ n=1 nxn-1,得x (1-x)2 = Σ∞ n=1 nxn 。对上式两边求微分得1+x (1-x)3 = Σ∞ n=1 n2xn-1,所以有(1+x)·x (1-x)3 = Σ∞ n=1 n2xn = Σ∞ n=0 n2xn =A(x)。令bn =Σn i=1 ai,根据性质5.6可知,{bn}的生成函数是B(x)=A(x) 1-x = x(1+x) (1-x)4 = x (1-x)4 + x2 (1-x)4。所以B(x)的展开式中xn 的系数是bn = (n+2)(n+1)n 6 + (n +1)n(n -1) 6 =n(n +1)(2n +1) 6 。从而得到级数和12 +22 + …+ n2 =n(n +1)(2n +1) 6 。 5.9 证明:对于n 是正整数,有 1× n1 . è . . . ÷ +2× n2 . è . . . ÷+ … +n × n n . è . . . ÷ =n ×2n-1 证明:由二项式定理(1+x)n = Σn k=0 n k . è . . .÷kxk-1,两边求导数得n(1+x)n-1 = Σn k=1 n k . è . . .÷kxk-1。令x =1,即为要证明的等式。 5.10 列表中有80件物品的清单,每个物品的属性为“可用”或“不可用”,共有45个 “可用”物品,证明:至少有两件可用物品编号之差恰为9。例如,列表中可用物品13号和 22号,或69号和78号都满足条件。 证明:令ai 表示第i 个可用物品的编号,则只需证明存在i 和j,使ai-aj =9。考虑 两组数字:a1,a2,…,a45和a1+9,a2+9,…,a45+9。两组中90个数字的取值范围为1~ 89,根据鸽笼原理的第二种形式,必有两个数字相等。由于前一组中的数字两两不同,后一