1 第二十二章组合计数方法 ? 22.1 递推方程的公式解法 ? 22.2 递推方程的其他解法 ? 22.3 生成函数的定义及其性质 ? 22.4 生成函数的应用 ? 22.5 指数生成函数及其应用 ? 22.6 高级计数 2 22.1 递推方程的公式解法 ?递推方程的定义 ?递推方程的实例 ?常系数线性递推方程的求解 ?常系数线性递推方程定义 ?公式解法 ?递推方程在计数问题中的应用 3 递推方程的定义 设序列a 0 , a 1 , …, a n , …, 简记为{a n }, 一个把a n 与某些个a i (i<n)联系起来的等式 叫做关于序列 {a n } 的递推方程 当给定递推方程和适当的初值就唯一确定了序列. 例:Fibonacci数列:1,1,2,3,5,8,… , Fibonacci数列的递推方程 f n = f n-1 + f n-2 初值 f 0 = 1,f 1 = 1 阶乘计算数列: 1,2,6,24,5!,…, 递推方程 F(n) = nF(n-1) 初值 F(1) = 1 4 例1 一个编码系统用8进制数字对信息编码,一个码是有效的 当且仅当含有偶数个7, 求n位长的有效码字有多少个? 解 设所求有效码字为a n 个 a n = 7a n-1 + 8 n-1 ? a n-1 a n = 6a n-1 + 8 n-1 , a 1 =7 解得 a n =(6 n +8 n )/2 递推方程的实例 5 例2 Hanoi塔 问题 T(n) = 2 T(n-1) + 1,T(1) = 1 解得 T(n) = 2 n ?1 1秒移1个,64个盘子要多少时间?(5000亿年) 思考:是否存在更好的解法? Reve难题:Hanoi塔变种,柱子个数增加,允许盘子相等. 递推方程的实例(续) 6 例3 哪种排序算法在最坏情况下复杂度比较低? 插入排序、归并排序 插入排序 W(n) = W(n ?1) + n ?1 W(1) = 0 解得 W(n) = O(n 2 ). 归并排序,不妨设n = 2 k . W(n) = 2W(n/2) + n-1 W(1) = 0 解得 W(n) = O(nlogn) 递推方程的实例(续) 7 常系数线性齐次递推方程的定义 ? ? ? =?=== =??????? ?1210 21 )1(,...,)2(,)1(,)0( 0)(...)2()1()( k k bkHbHbHbH knHanHanHanH 其中a 1 ,a 2 ,…,a k 为常数,a k ≠ 0 称为k阶常系数线性齐次递推方程 b 0 , b 1 , …, b k-1 为k个初值 实例:Fibonacci数列的递推方程 常系数线性齐次递推方程求解 8 常系数线性齐次递推方程的公式解法 ?特征方程、特征根 ?递推方程的解与特征根的关系 ?解的线性性质 ?无重根下通解的结构 ?求解实例 ?有重根下通解结构 ?求解实例 9 特征方程与特征根 ? ? ? =?=== =??????? ?1210 21 )1(,...,)2(,)1(,)0( 0)(...)2()1()( k k bkHbHbHbH knHanHanHanH 特征方程 x k ?a 1 x k-1 ? … ? a k = 0, 特征方程的根称为递推方程的特征根 实例 递推方程 f n = f n-1 + f n-2 特征方程 x 2 ?x?1= 0 特征根 2 51 , 2 51 ?+ 10 定理1 q是非零复数,则q n 是递推方程的解 ? q是它的特征根 证: q n 是递推方程的解 ? q n ?a 1 q n-1 ? a 2 q n-2 ? …? a k q n-k = 0 ? q n-k (q k ?a 1 q k-1 ? a 2 q k-2 ? …? a k ) = 0 ? q k ? a 1 q k-1 ? a 2 q k-2 ? … ? a k = 0 ? q是它的特征根 递推方程解与特征根的关系 11 定理2 h 1 (n)和h 2 (n)是递推方程的解, c 1 ,c 2 为任意常数, 则c 1 h 1 (n)+c 2 h 2 (n)是递推方程的解. 证明 将c 1 h 1 (n)+c 2 h 2 (n)代入递推方程左边, 化简后等于0 推论:若q 1 ,q 2 ,…,q k 是递推方程的特征根, 则c 1 q 1 n +c 2 q 2 n +…+c k q k n 是递推方程的解, 其中c 1 , c 2 , …, c k 是任意常数. 解的线性性质 12 通解定义: 若对递推方程的每个解h(n)都存在一组常数c 1 ’, c 2 ’, …, c k ’ 使得h(n)=c 1 ’q 1 n +c 2 ’q 2 n +…+c k ’q k n 成立, 则称c 1 q 1 n +c 2 q 2 n +…+c k q k n 为通解. 定理3 设q 1 , q 2 , … , q k 是递推方程不等的特征根, 则H(n)= c 1 q 1 n +c 2 q 2 n +…+c k q k n 为通解. 无重根下通解的结构 13 定理的证明 证: H(n)是解. 设h(n)是递推方程的任意解, h(0), h(1), …, h(k-1)由初值b 0 , b 1 , … , b k-1 唯一确定. ? ? ? ? ? ? ? =+++ =+++ =+++ ? ??? 1 11 22 1 11 12211 021 '...'' ... '...'' '...'' k k kk kk kk k bqcqcqc bqcqcqc bccc 系数行列式 0)( 1 ≠? ∏ ≤<≤ kji ji qq 当q i ≠ q j 时 方程组有唯一解 14 例4 Fibonnaci数列,特征根为 2 51 , 2 51 ?+ , 通解为 nn n ccf ? ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? + = 2 51 2 51 21 带入初值 f 0 =1, f 1 =1, 得 ? ? ? ? ? = ? ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? + =+ 1 2 51 2 51 1 21 21 cc cc 解得 2 51 5 1 , 2 51 5 1 21 ? ?= + = cc 11 2 51 5 1 2 51 5 1 ++ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + = nn n f 求解实例 15 例5 H(n) ?4H(n?1) + 4H(n?2) = 0 H(0) = 0, H(1) = 1 特征方程 x 2 ?4x+4 = 0 通解 H(n) = c 1 2 n + c 2 2 n = c2 n 代入初值得: c2 n ? 4c2 n-1 + 4c2 n-2 = 0 c?2c + c = 0, c无解. 问题:两个解线性相关. 观察:n2 n 是解,且与2 n 线形无关 有重根下求解中的问题 16 定理4 若q是递推方程的e重特征根,则 q n ,nq n , …, n e-1 q n 是递推方程的线性无关的解 定理5 设q 1 , q 2 , … , q t 是递推方程的不相等的特征根, 且q i 的重数为e i ,令 n i e ieiii qncnccnH i i )...()( 1 21 ? +++= 那么通解 ∑ = = t i i nHnH 1 )()( 证明:请阅读教材 有重根下的通解结构 17 例6 H(n) + H(n-1) - 3H(n-2) - 5H(n-3) - 2H(n-4) = 0 H(0) = 1, H(1) = 0, H(2) = 1, H(3) = 2 特征方程 x 4 + x 3 ? 3x 2 ? 5x ?2 = 0 , 特征根-1,-1,-1,2, 通解为 nn cncnccnH 21 4 2 321 +?++= ))(()( ? ? ? ? ? ? ? =+??? =+++ =+??? =+ 2893 1442 02 1 4321 4321 4321 41 cccc cccc cccc cc 解得 9 2 ,0, 3 1 , 9 7 4321 ==?== cccc 解为 nnn nnH 2 9 2 )1( 3 1 )1( 9 7 )( +???= 求解实例 18 常系数线性非齐次递推方程求解 ?递推方程的标准型 ?通解结构 ?特解的求法 ?多项式函数 ?指数函数 ?组合形式 19 递推方程的标准型及通解 .0)(,0,),()(...)1()( 1 ≠≠≥=????? nfaknnfknHanHanH kk 定理6 设)(nH是对应齐次方程的通解,H * (n)是一个特解,则 )(*)()( nHnHnH += 是递推方程的通解. 证(1)H(n)是解,代入验证. (2)设h(n)是解,证明h(n)为一个齐次解与特解H * (n)之和. 0)](*)([ ...)]1(*)1([)](*)([ )()(*...)1(*)(*) )()(...)1()( 1 1 1 =???? ?????? =?????? =????? knHknha nHnhanHnh nfknHanHanH nfknhanhanh k k k h(n)-H * (n)是齐次解,即h(n)是一个齐次解与H * (n)之和. 20 f(n)为n的t次多项式,一般H * (n)也为n的t次多项式 例7 a n + 5a n-1 + 6a n-2 = 3n 2 设 a n * = P 1 n 2 + P 2 n + P 3 , 代入得 P 1 n 2 +P 2 n+P 3 +5[P 1 (n-1) 2 +P 2 (n-1)+P 3 ]+6[P 1 (n-2) 2 +P 2 (n-2)+P 3 ]=3n 2 ? ? ? ? ? =+ =+ = 0 12P 17P-29P 0 12 34- 3 12 321 21 1 PP P 288 115 24 17 4 1 288 115 , 24 17 , 4 1 2 * 321 ++= === nna PPP n , 通解为 288 115 24 17 4 1 )3()2( 2 21 +++?+?= nncca nn n 特解的求法 21 例8 Hanoi塔 T(n) = 2 T(n-1)+1 T * (n) = P P = 2 P + 1 , P = -1 T(n) = c 2 n –1, 代入初值 T(1)=1, 得c=1, 解为 T(n) = 2 n –1. 例9 H(n)- H(n-1) = 7n 设特解P 1 n+P 2 不行,应设n 2 次项, 因为特征根是1. 设H * (n) = P 1 n 2 + P 2 n, 代入 解得 P 1 = P 2 = 7/2, 通解为 H(n) = c?1 n + 7 2 n(n+1) = c + 7 2 n(n+1) 实例 22 f(n)为指数函数 β n ,若β不是特征根,则特解为 H * (n) = Pβ n 例10 通信编码问题 a n = 6a n-1 + 8 n-1 , a 1 =7 a * n = P 8 n-1 , 代入得P = 4 通解 a n =c?6 n + 4?8 n-1 代入初值得 a n =(6 n +8 n )/2 特解的求法(续) 23 若β是e重特征根,则特解为Pn e β n 例11 H(n)– 5H(n-1) + 6H(n-2) = 2 n , H * (n) = Pn2 n , 代入得 Pn2 n – 5P(n-1)2 n-1 + 6P(n-2)2 n-2 = 2 n 解得 P = -2 H * (n) = -n2 n+1 特解的求法(续) 24 例12 组合形式 a n - 2a n-1 = n+3 n a 0 = 0 设特解为a n * = P 1 n + P 2 + P 3 3 n ,代入 (P 1 n+P 2 +P 3 3 n )- 2[P 1 (n-1)+P 2 +P 3 3 n-1 ] = n+3 n -P 1 n+(2P 1 -P 2 )+P 3 3 n-1 = n+3 n P 1 = -1, P 2 = -2, P 3 = 3 a n = c2 n –n-2 + 3 n+1 解得 c = –1,a n = –2 n –n–2 + 3 n+1 特解的求法(续) 25 22.2 递推方程的其他解法 ?换元法 ?迭代归纳法--递归树 ?差消法 ?尝试法 ?应用实例 26 思想:通过换元转化成常系数线性递推方程 例1 0 2 12 0 2 1 2 > ? ? ? ? ? = += ? n nn a a aa 令 , 2 nn ab = 代入得 b n = 2 b n-1 + 1,b 0 = 4 解得 125,125 ??=??= n n n n ab 换元法 27 例2 归并排序 T(n) = 2 T( n/2 ) + n-1 , n = 2 k T(2) = 1 解 H(k)= 2 H(k-1) + 2 k - 1 H(1) = 1 令H * (k) = P 1 k2 k + P 2 , 解得P 1 =P 2 =1, H * (k) = k2 k + 1 通解 H(k) = C 2 k + k2 k + 1, 代入初值,得C = -1, H(k) = - 2 k + k2 k +1, T(n) = n log n– n + 1 换元法—归并排序 28 例3 计数a 1 , a 2 , … , a n 相乘(可交换)的方法数 h(n) = (4n-6) h(n-1) h(1) = 1 )!1( )!22( 24...)42)(22( )!22( 2 ]13...)52)(32[(2 )1(26...)104)(64( ... )2()104)(64( )1()64()( 1 1 ? ? = ??? ? = ???= ????= = ???= ??= ? ? n n nn n nn hnn nhnn nhnnh n n 用归纳法验证. 迭代归纳法 29 例4 错位排列问题 错位排列:{1,2,…,n}的排列a 1 a 2 …a n , a i ≠i, i=1,2,…,n, n个元素的错位排列数记作D n 将错位排列按首元素2,3,…,n分类:有n-1类, 第一位为2的类: 第二位为1: 方法数为D n-2 第二位不是1:方法数为D n-1 递推方程: D n = (n-1)(D n-1 +D n-2 ) D 1 = 0, D 2 = 1 迭代归纳法—错位排列 30 解:D n = (n-1)(D n-1 + D n-2 ) ] ! )(... !! [! )()(...)(...)( )(...)(...)( ... )()())(())(( )()()( ,)( )(][)( ...])([ n n nnn nnDnn nnnDnnn nDnnD DnDD DD DnDnDD n nn nnn n nn nn n nn nn nnnn 1 1 2 1 1 1 1 11141 13121 111121 111 01 121 1 13 2 1 12 3 1 2 11 2 12 2 211 ?+?+?= ?+?++??+ ??+?= = ?+?+??+??= ?+?+?= =?+= ?=??= =???=? ? ?? ? ? ? ? ?? ??? 迭代归纳法—错位排列 31 例5 归并排序 T(n) = 2T(n/2) + n-1, n=2 k T(2) = 1 递归树有k层,总数为 nk– (1 + 2 + … + 2 k-1 ) = nk– (2 k –1) = nlog n– n + 1 迭代归纳法—递归树 32 T(n)= 2 T(n/2) + n-1 = 2 [2 T(n/4) + n/2–1] + n-1 = 2 2 T(n/2 2 ) + n-2 + n-1 = … = 2 k-1 T(n/2 k-1 ) + n-2 k-2 + … + n-2 + n-1 = 2 k-1 T(2) + n(k-1)–(1 + 2 + … + 2 k-2 ) = 2 k-1 + n(k-1)– (2 k-1 –1) = nk– n + 1 = nlog n– n + 1 迭代归纳法—归并排序 33 例6 快速排序 算法 快速排序 Quicksort 输入:数组A[p..r] 输出:排好序的数组A Quicksort(A,p,r) 1. if p<r 2. then q←Partition(A,p,r) 3. A[p]?A[q] 4. Quicksort(A,p,q-1) 5. Quicksort(A,q+1,r) 差消法—快速排序 34 ? ? ? ? ? = ≥++= ∑ ? = 0)1( 2,1)( 2 )( 1 1 T nniT n nT n i )log()( )(log 3 1 ... 1 1 1 2 2 )1( 3 2 ... 2 1 2 1 2)1( 1 )( 2)1()1()( 2)1(2)1()1()( )1()1()(2)1()1( )(2)( 2 1 2 2 1 1 nnOnT nO nn T nnnn nT n nT nnTnnnT nnTnTnnnT nniTnTn nniTnnT n i n i = = ? ? ? ? ? ? +++ + = ++++ + = + + ? = + +?+= +?=??? ?+?+=?? ++= ∑ ∑ ? = ? = 平均情况下复杂度分析 35 )(log2ln)1ln(ln 1 3 1 ... 1 1 1 1 2 1 2 nOnx dx xnn n n =?+== ≤+++ + + + ∫ 积分近似 36 例7 1)( 2 )( 1 1 ++= ∑ ? = niT n nT n i (1) T(n)=C, 左边=O(1), 右边= 1 2 21)1( 2 ++?=++? n n C CnnC n =O(n) (2) T(n)=cn, 左边=cn, 1)1(1)1( 1 2 )1)(11(2 1 2 1 1 +?+=++?= ++ ??+ = ++= ∑ ? = cncnnc n nn n c nci n n i 右边 尝试法—快速排序 37 (3) T(n)=cn 2 , 左边=cn 2 )( 3 2 1)]( 3 [ 2 1 2 22 31 1 2 nOn c nnO cn n nci n n i +=+++=++= ∑ ? = 右边 (4) T(n)=cnlogn , 左边=cnlogn )(log) 2ln2 1(log 1)]log( 2ln4 log 2 [ 2 1log 2 22 1 1 nOn c ncn nnnO n n n n c nii n c n i +?+= +++?= ++= ∑ ? = 右边 尝试法—快速排序 38 )log( 2ln4 log 2 ) 4 4 2ln 2 4 ( 2ln 1 ) 4 ln 2 ( 2ln 1 ] 4 ln 2 [ 2ln 1 ln 2ln log 22 22 2 22 22 nnO n n n n n n x x x xdx x xdxx n nn +?= ?? ?= ?= = ∫∫ 积分近似 39 n为输入规模,n/b为子问题输入规模, a为子问题个数,d(n)为分解及综合的代价 )/( )()/(... )/()/()/( ...)()/()/()( 1)1( ),()/()( 1 0 2211 22 i k i ik kkkkkk k bndaa ndbnad bnabndabnTa ndbnadbnTanT T bnndbnaTnT ∑ ? = ???? += ++ +++= =++= = =+= an k bb naa loglog == 分治算法 40 (1) d(n)=c ? ? ? ? ? ===+ ≠== ? ? + = 1)(log)( 1)()( 1 1 )( log anOkcOkca anOaO a a ca nT k ak k k b 二分检索 W(n) = W(n/2) + 1 a = 1, b = 2, d(n) = c W(n) = O(logn) a ki k i ik b nabndaanT log 1 0 ),/()( =+= ∑ ? = 分治与递归算法—二分检索 41 (2) d(n)=cn ? ? ? ? ? ? ? >= ? ? += ? ? + ==+ <= ? ? + = +=+= ∑∑ ? = ? = banO ba ba ca ba ba cna bannOcnkn banO ba ba cnn b a cna b cn aanT a kk k k k k a k i ik i k i ik b b )( 1/1/ 1)/( )log( )( 1/ 1)/( )()( log log 1 1 1 1 归并排序 W(n) = 2W(n/2) + n?1 a = 2, b = 2, d(n) = O(n), W(n)= O(nlogn) 分治与递归算法—二分归并 42 作业 ?复习要点 公式法 换元法 迭代归纳法 理解差消与尝试法 会应用递推方程解决组合计数问题 ?书面作业 习题二十二,3, 6, 8, 10, 11, 12,