NknSのSitE

Back

DM Advanced Counting Techniques

Records About Recurrence Relations, Generating Functions, and Inclusion-Exclusion Principle

Part 3 高级计数#

递推关系的应用#

定义#

数列 {an}\{a_n\} 的 递推关系 (Recurrence Relation) 是一个方程,它将 ana_n 表示为该数列之前的一个或多个项的函数,即 a0,a1,…,an−1a_0, a_1, \dots, a_{n-1},其中 nn 为所有满足 n≥n0n \ge n_0 的整数,n0n_0 是一个非负整数。

  • 解:如果一个数列的各项满足递推关系,则称该数列为递推关系的解。
  • 初始条件:数列的初始条件指定了递推关系生效前的各项(例如 a0,a1a_0, a_1 等)。

经典例子#

斐波那契数列 (Fibonacci Sequence)#

问题:一对年轻的兔子(一公一母)被放置在一个岛上。兔子在满两个月前不会繁殖。两个月大后,每对兔子每个月都会产下一对兔子。假设兔子永远不会死亡,求在经过 nn 个月后岛上兔子的对数的递归关系。

递推关系:

fn=fn−1+fn−2,n≥3f_n = f_{n-1} + f_{n-2}, \quad n \ge 3

初始条件:f1=1,f2=1f_1 = 1, f_2 = 1。

汉诺塔 (Tower of Hanoi)#

问题:将 nn 个圆盘从柱子 1 移动到柱子 2,每次只能移动一个圆盘,且大圆盘不能放在小圆盘上。

递推关系: 设 HnH_n 为移动 nn 个圆盘所需的最小移动次数。

Hn=2Hn−1+1H_n = 2H_{n-1} + 1

初始条件:H1=1H_1 = 1。 显式公式:Hn=2n−1H_n = 2^n - 1。

位串计数#

问题:找出长度为 nn 的不包含两个连续 0 的位串的数量 ana_n。

递推关系:

  • 结尾为 1:前 n−1n-1 位必须合法,数量为 an−1a_{n-1}。
  • 结尾为 0:前一位必须是 1(因为不能有连续 0),再前 n−2n-2 位必须合法,数量为 an−2a_{n-2}。
an=an−1+an−2,n≥3a_n = a_{n-1} + a_{n-2}, \quad n \ge 3

初始条件:a1=2a_1 = 2 (0, 1), a2=3a_2 = 3 (01, 10, 11)。 注意:an=fn+2a_n = f_{n+2},其中 fnf_n 是斐波那契数。

卡塔兰数 (Catalan Numbers)#

问题:CnC_n 表示对 n+1n+1 个数 x0⋅x1⋯xnx_0 \cdot x_1 \cdots x_n 进行括号化的方法数。

递推关系:

Cn=∑k=0n−1CkCn−k−1C_n = \sum_{k=0}^{n-1} C_k C_{n-k-1}

初始条件:C0=1,C1=1C_0 = 1, C_1 = 1。

线性递推关系的求解#

线性齐次递推关系#

定义:形式为

an=c1an−1+c2an−2+⋯+ckan−ka_n = c_1 a_{n-1} + c_2 a_{n-2} + \dots + c_k a_{n-k}

其中 c1,c2,…,ckc_1, c_2, \dots, c_k 为常数且 ck≠0c_k \ne 0。

求解方法(特征方程法)#

  1. 写出特征方程: rk−c1rk−1−c2rk−2−⋯−ck=0r^k - c_1 r^{k-1} - c_2 r^{k-2} - \dots - c_k = 0
  2. 求解特征根:
    • 情况 1:kk 个不同的实根 r1,r2,…,rkr_1, r_2, \dots, r_k 通解为: an=α1r1n+α2r2n+⋯+αkrkna_n = \alpha_1 r_1^n + \alpha_2 r_2^n + \dots + \alpha_k r_k^n
    • 情况 2:有重根 如果 r1r_1 是 mm 重根,则它对应的项为: (α1,0+α1,1n+⋯+α1,m−1nm−1)r1n(\alpha_{1,0} + \alpha_{1,1}n + \dots + \alpha_{1,m-1}n^{m-1}) r_1^n
  3. 代入初始条件:解线性方程组求出常数 αi\alpha_i。

示例:an=an−1+2an−2a_n = a_{n-1} + 2a_{n-2},初始条件 a0=2,a1=7a_0=2, a_1=7。 特征方程:r2−r−2=0⇒(r−2)(r+1)=0⇒r1=2,r2=−1r^2 - r - 2 = 0 \Rightarrow (r-2)(r+1)=0 \Rightarrow r_1=2, r_2=-1。 通解:an=α12n+α2(−1)na_n = \alpha_1 2^n + \alpha_2 (-1)^n。 代入初始条件解得 α1=3,α2=−1\alpha_1=3, \alpha_2=-1。 所以 an=3⋅2n−(−1)na_n = 3 \cdot 2^n - (-1)^n。

线性非齐次递推关系#

定义:形式为

an=c1an−1+c2an−2+⋯+ckan−k+F(n)a_n = c_1 a_{n-1} + c_2 a_{n-2} + \dots + c_k a_{n-k} + F(n)

其中 F(n)F(n) 是仅依赖于 nn 的函数。

求解方法#

定理:通解由两部分组成:

an=an(h)+an(p)a_n = a_n^{(h)} + a_n^{(p)}
  • an(h)a_n^{(h)} 是对应的齐次递推关系的通解。
  • an(p)a_n^{(p)} 是非齐次递推关系的一个特解。

常见 F(n)F(n) 的特解形式:

  • 若 F(n)F(n) 是 nn 的 tt 次多项式,且 1 不是特征根,则设特解为 nn 的 tt 次多项式。
  • 若 F(n)=C⋅snF(n) = C \cdot s^n,且 ss 不是特征根,则设特解为 A⋅snA \cdot s^n。
  • 若 ss 是 mm 重特征根,则特解形式需乘以 nmn^m。

示例:an=3an−1+2n,a1=3a_n = 3a_{n-1} + 2n, a_1=3。 齐次部分 an(h)=α3na_n^{(h)} = \alpha 3^n。 设特解 an(p)=cn+da_n^{(p)} = cn + d(因为 F(n)=2nF(n)=2n 是一次多项式且 1 不是特征根)。 代入原方程解得 c=−1,d=−3/2c=-1, d=-3/2。 通解 an=α3n−n−3/2a_n = \alpha 3^n - n - 3/2。 代入 a1=3a_1=3 解得 α=11/6\alpha = 11/6。

分治算法与递归关系#

分治递归关系#

设一个递归算法将规模为 nn 的问题划分为 aa 个子问题,每个子问题规模为 n/bn/b,合并步骤需 g(n)g(n) 次操作。

f(n)=af(n/b)+g(n)f(n) = a f(n/b) + g(n)

主定理 (Master Theorem)#

对于 f(n)=af(n/b)+cndf(n) = a f(n/b) + c n^d,其中 a≥1,b>1,c>0,d≥0a \ge 1, b > 1, c > 0, d \ge 0:

f(n) is {O(nd)if a<bdO(ndlog⁡n)if a=bdO(nlog⁡ba)if a>bdf(n) \text{ is } \begin{cases} O(n^d) & \text{if } a < b^d \\ O(n^d \log n) & \text{if } a = b^d \\ O(n^{\log_b a}) & \text{if } a > b^d \end{cases}

示例:

  • 二分查找:f(n)=f(n/2)+2f(n) = f(n/2) + 2 (a=1,b=2,d=0a=1, b=2, d=0) ⇒a=bd⇒O(log⁡n)\Rightarrow a = b^d \Rightarrow O(\log n)。
  • 归并排序:M(n)=2M(n/2)+nM(n) = 2M(n/2) + n (a=2,b=2,d=1a=2, b=2, d=1) ⇒a=bd⇒O(nlog⁡n)\Rightarrow a = b^d \Rightarrow O(n \log n)。
  • 快速整数乘法:f(n)=3f(n/2)+Cnf(n) = 3f(n/2) + Cn (a=3,b=2,d=1a=3, b=2, d=1) ⇒a>bd⇒O(nlog⁡23)≈O(n1.585)\Rightarrow a > b^d \Rightarrow O(n^{\log_2 3}) \approx O(n^{1.585})。

容斥原理 (Inclusion-Exclusion Principle)#

定理#

对于有限集 A1,A2,…,AnA_1, A_2, \dots, A_n:

∣⋃i=1nAi∣=∑1≤i≤n∣Ai∣−∑1≤i<j≤n∣Ai∩Aj∣+∑1≤i<j<k≤n∣Ai∩Aj∩Ak∣−⋯+(−1)n−1∣⋂i=1nAi∣\left| \bigcup_{i=1}^n A_i \right| = \sum_{1 \le i \le n} |A_i| - \sum_{1 \le i < j \le n} |A_i \cap A_j| + \sum_{1 \le i < j < k \le n} |A_i \cap A_j \cap A_k| - \dots + (-1)^{n-1} \left| \bigcap_{i=1}^n A_i \right|

应用#

Onto (满射) 函数的数量#

从 mm 个元素的集合到 nn 个元素的集合的满射函数数量 (m≥nm \ge n):

nm−C(n,1)(n−1)m+C(n,2)(n−2)m−⋯+(−1)n−1C(n,n−1)⋅1mn^m - C(n, 1)(n-1)^m + C(n, 2)(n-2)^m - \dots + (-1)^{n-1} C(n, n-1) \cdot 1^m

错位排列 (Derangements)#

nn 个元素的错位排列数 DnD_n(没有任何元素在原始位置的排列):

Dn=n![1−11!+12!−13!+⋯+(−1)n1n!]D_n = n! \left[ 1 - \frac{1}{1!} + \frac{1}{2!} - \frac{1}{3!} + \dots + (-1)^n \frac{1}{n!} \right]

当 n→∞n \to \infty 时,Dn/n!→1/eD_n/n! \to 1/e。

示例:帽子寄存问题。nn 个人取回帽子,没人拿到自己帽子的概率约为 1/e≈0.3681/e \approx 0.368。