NknSのSitE

Back

Advanced Counting Techniques

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

Part 3 高级计数#

递推关系的应用#

定义#

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

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

经典例子#

斐波那契数列 (Fibonacci Sequence)#

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

递推关系

fn=fn1+fn2,n3f_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=2Hn1+1H_n = 2H_{n-1} + 1

初始条件H1=1H_1 = 1显式公式Hn=2n1H_n = 2^n - 1

位串计数#

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

递推关系

  • 结尾为 1:前 n1n-1 位必须合法,数量为 an1a_{n-1}
  • 结尾为 0:前一位必须是 1(因为不能有连续 0),再前 n2n-2 位必须合法,数量为 an2a_{n-2}
an=an1+an2,n3a_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 个数 x0x1xnx_0 \cdot x_1 \cdots x_n 进行括号化的方法数。

递推关系

Cn=k=0n1CkCnk1C_n = \sum_{k=0}^{n-1} C_k C_{n-k-1}

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

线性递推关系的求解#

线性齐次递推关系#

定义:形式为

an=c1an1+c2an2++ckanka_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 为常数且 ck0c_k \ne 0

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

  1. 写出特征方程rkc1rk1c2rk2ck=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_1mm 重根,则它对应的项为: (α1,0+α1,1n++α1,m1nm1)r1n(\alpha_{1,0} + \alpha_{1,1}n + \dots + \alpha_{1,m-1}n^{m-1}) r_1^n
  3. 代入初始条件:解线性方程组求出常数 αi\alpha_i

示例an=an1+2an2a_n = a_{n-1} + 2a_{n-2},初始条件 a0=2,a1=7a_0=2, a_1=7。 特征方程:r2r2=0(r2)(r+1)=0r1=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=32n(1)na_n = 3 \cdot 2^n - (-1)^n

线性非齐次递推关系#

定义:形式为

an=c1an1+c2an2++ckank+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)nntt 次多项式,且 1 不是特征根,则设特解为 nntt 次多项式。
  • F(n)=CsnF(n) = C \cdot s^n,且 ss 不是特征根,则设特解为 AsnA \cdot s^n
  • ssmm 重特征根,则特解形式需乘以 nmn^m

示例an=3an1+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=α3nn3/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,其中 a1,b>1,c>0,d0a \ge 1, b > 1, c > 0, d \ge 0

f(n) is {O(nd)if a<bdO(ndlogn)if a=bdO(nlogba)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=bdO(logn)\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=bdO(nlogn)\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>bdO(nlog23)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=1inAi1i<jnAiAj+1i<j<knAiAjAk+(1)n1i=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 个元素的集合的满射函数数量 (mnm \ge n):

nmC(n,1)(n1)m+C(n,2)(n2)m+(1)n1C(n,n1)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![111!+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]

nn \to \infty 时,Dn/n!1/eD_n/n! \to 1/e

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