Part 3 高级计数#
递推关系的应用#
数列 {an} 的 递推关系 (Recurrence Relation) 是一个方程,它将 an 表示为该数列之前的一个或多个项的函数,即 a0,a1,…,an−1,其中 n 为所有满足 n≥n0 的整数,n0 是一个非负整数。
- 解:如果一个数列的各项满足递推关系,则称该数列为递推关系的解。
- 初始条件:数列的初始条件指定了递推关系生效前的各项(例如 a0,a1 等)。
经典例子#
斐波那契数列 (Fibonacci Sequence)#
问题:一对年轻的兔子(一公一母)被放置在一个岛上。兔子在满两个月前不会繁殖。两个月大后,每对兔子每个月都会产下一对兔子。假设兔子永远不会死亡,求在经过 n 个月后岛上兔子的对数的递归关系。
递推关系:
fn=fn−1+fn−2,n≥3
初始条件:f1=1,f2=1。
汉诺塔 (Tower of Hanoi)#
问题:将 n 个圆盘从柱子 1 移动到柱子 2,每次只能移动一个圆盘,且大圆盘不能放在小圆盘上。
递推关系:
设 Hn 为移动 n 个圆盘所需的最小移动次数。
Hn=2Hn−1+1
初始条件:H1=1。
显式公式:Hn=2n−1。
位串计数#
问题:找出长度为 n 的不包含两个连续 0 的位串的数量 an。
递推关系:
- 结尾为 1:前 n−1 位必须合法,数量为 an−1。
- 结尾为 0:前一位必须是 1(因为不能有连续 0),再前 n−2 位必须合法,数量为 an−2。
an=an−1+an−2,n≥3
初始条件:a1=2 (0, 1), a2=3 (01, 10, 11)。
注意:an=fn+2,其中 fn 是斐波那契数。
卡塔兰数 (Catalan Numbers)#
问题:Cn 表示对 n+1 个数 x0⋅x1⋯xn 进行括号化的方法数。
递推关系:
Cn=k=0∑n−1CkCn−k−1
初始条件:C0=1,C1=1。
线性递推关系的求解#
线性齐次递推关系#
定义:形式为
an=c1an−1+c2an−2+⋯+ckan−k
其中 c1,c2,…,ck 为常数且 ck=0。
求解方法(特征方程法)#
- 写出特征方程:
rk−c1rk−1−c2rk−2−⋯−ck=0
- 求解特征根:
- 情况 1:k 个不同的实根 r1,r2,…,rk
通解为:
an=α1r1n+α2r2n+⋯+αkrkn
- 情况 2:有重根
如果 r1 是 m 重根,则它对应的项为:
(α1,0+α1,1n+⋯+α1,m−1nm−1)r1n
- 代入初始条件:解线性方程组求出常数 αi。
示例:an=an−1+2an−2,初始条件 a0=2,a1=7。
特征方程:r2−r−2=0⇒(r−2)(r+1)=0⇒r1=2,r2=−1。
通解:an=α12n+α2(−1)n。
代入初始条件解得 α1=3,α2=−1。
所以 an=3⋅2n−(−1)n。
线性非齐次递推关系#
定义:形式为
an=c1an−1+c2an−2+⋯+ckan−k+F(n)
其中 F(n) 是仅依赖于 n 的函数。
求解方法#
定理:通解由两部分组成:
an=an(h)+an(p)
- an(h) 是对应的齐次递推关系的通解。
- an(p) 是非齐次递推关系的一个特解。
常见 F(n) 的特解形式:
- 若 F(n) 是 n 的 t 次多项式,且 1 不是特征根,则设特解为 n 的 t 次多项式。
- 若 F(n)=C⋅sn,且 s 不是特征根,则设特解为 A⋅sn。
- 若 s 是 m 重特征根,则特解形式需乘以 nm。
示例:an=3an−1+2n,a1=3。
齐次部分 an(h)=α3n。
设特解 an(p)=cn+d(因为 F(n)=2n 是一次多项式且 1 不是特征根)。
代入原方程解得 c=−1,d=−3/2。
通解 an=α3n−n−3/2。
代入 a1=3 解得 α=11/6。
分治算法与递归关系#
分治递归关系#
设一个递归算法将规模为 n 的问题划分为 a 个子问题,每个子问题规模为 n/b,合并步骤需 g(n) 次操作。
f(n)=af(n/b)+g(n)
主定理 (Master Theorem)#
对于 f(n)=af(n/b)+cnd,其中 a≥1,b>1,c>0,d≥0:
f(n) is ⎩⎨⎧O(nd)O(ndlogn)O(nlogba)if a<bdif a=bdif a>bd
示例:
- 二分查找:f(n)=f(n/2)+2 (a=1,b=2,d=0) ⇒a=bd⇒O(logn)。
- 归并排序:M(n)=2M(n/2)+n (a=2,b=2,d=1) ⇒a=bd⇒O(nlogn)。
- 快速整数乘法:f(n)=3f(n/2)+Cn (a=3,b=2,d=1) ⇒a>bd⇒O(nlog23)≈O(n1.585)。
容斥原理 (Inclusion-Exclusion Principle)#
对于有限集 A1,A2,…,An:
i=1⋃nAi=1≤i≤n∑∣Ai∣−1≤i<j≤n∑∣Ai∩Aj∣+1≤i<j<k≤n∑∣Ai∩Aj∩Ak∣−⋯+(−1)n−1i=1⋂nAi
Onto (满射) 函数的数量#
从 m 个元素的集合到 n 个元素的集合的满射函数数量 (m≥n):
nm−C(n,1)(n−1)m+C(n,2)(n−2)m−⋯+(−1)n−1C(n,n−1)⋅1m
错位排列 (Derangements)#
n 个元素的错位排列数 Dn(没有任何元素在原始位置的排列):
Dn=n![1−1!1+2!1−3!1+⋯+(−1)nn!1]
当 n→∞ 时,Dn/n!→1/e。
示例:帽子寄存问题。n 个人取回帽子,没人拿到自己帽子的概率约为 1/e≈0.368。