生成函数(母函数)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
但以上三类情况并没有包括所有可能的 f(n):
a) f(n)介于 1),2)之间,即 f(n)小于、但不是多项式地小于 n Logba
b)
f(n)介于
2),3)之间,即
f(n)大于、但不是多项式地大于
n
Log
a b
当 f(n)不满足 1),2),3)时,只能采用其他方式求解。
算法分析中的一些常用数学方法:
∞
设 A(x)= ∑ an xn 是数列{a0, a1,a2,…,an,…}的生成函数(幂函数形式), n=0
则有 A(x)-a1x-a0=(A(x))2-(a1a0+a0a1)x-a20 ,
整理得(A(x))2-A(x)+x=0。令 z=A(x),则有 z 2- z + x=0
求解此关于 z 的一元二次方程式,得 A(x)= z=(1 ± 1− 4x )/2
∴函数序列的相互独立性保证了序列与其生成函数之间的 1-1 对应。
生成函数的函数序列大多用{1,x,x2,x3,…,xn,…},
在得到一个数列的生成函数之后,
幂级数展开后 xn 前的系数就是数列的通项 an。 普通生成函数的两种主要应用:
1.排列组合类问题 2.递归方程求解
排列组合类问题
e.g.
(1+x)n=
1 n
C n−1 2n−2
(
C
0 0
定义为
1)。此数称为
Catalan
数。
(关于生成函数与递推关系,请参见卢开澄书第二章)
以上提供了我们一些求解递归方程的方法。但在实际应用中,
我们碰到最多得还是形如 T(n)=a*T(n/b)+f(n) 一类的递归方程,
式中 a,b>0 且一般为正整数,
此类方程可(粗略地)按
α1 α2 α3 α4 ... αr
α12 α22 α32 α42 ... αr2
...
...
...
... ...
...
α1i α2i α3i α4i ... αri
范德蒙矩阵之例:
...
...
...
...
...
...
α1r α2r α3r α4r ... αrr
且 a1=1,a2=1,a3=2,a4=5,求 an。令 a0=0,则上述方程可写为:
an= a0an+a1an-1+ … +a n-1a1+an a0
从 2 开始对等式两边分别求级数,则有
∑ ∞
∞
∑ an xn = ( a0an+a1an-1+ … +a n-1a1+a n a0) xn
n=2
n=2
n
∑ ∴
1 j
=Θ(log
n)
j =1
eg4:著名的 Stirling 公式 n!≈
2πn
(
n e
n
)
也是利用了上述的积分办法
(参见卢开澄书 p48)(证明比较复杂,省略。有兴趣的同学可自己看)
2、代入法求解:
d
e.g. T(n)= 2T (n / 2) + cn log n
n =1 n≥2
设 n=2k(因此 k=log n),于是有:
(即 f(n)的量级多项式地小于 nLogba 的量级), 则 T(n)= Θ ( nLogba )。
2) 若 f(n)= Θ( nLogba )
(即 f(n)的量级等于 nLogba 的量级), 则 T(n) =Θ( nLogba Log n )。
若 f(n)= Θ( nLogba Log k n ), 则 T(n)=Θ( nLogba Log k+1n )。
(即 i≠j 时有αi≠αj),则齐次方程(*)的解为 an = A1 α1n + A2 α2n + … + Ar αrn (齐通解,即齐次方程的通解) (A1~Ar 为待定系数,可由 r 个连续的边界条件唯一确定) (将待定系数作为未知数,根据 r 个连续的边界条件可得 r 个方程,
方程的系数矩阵是范德蒙矩阵,其行列式值不为零,故有唯一解)
3) 若有ε>0, 使 f(n)=Ω( n(Logba)+ε ) (即 f(n)的量级多项式地大于 n Logba 的量级), 且满足正规性条件: 存在常数 c<1, 使得对所有足够大的 n,有 a*f(n/b)≤c*f(n), 则 T(n)=Θ(f(n))。
正规性条件的直观含义: 对所有足够大的 n,a 个子问题的分解准备与再综合所需要的 时间总和,严格小于原问题的分解准备和综合所需要的时间。
f(n)
> =
Θ(
nLogb a
)分为三种情况:
<
(注意: 递归方程 T(n)=a*T(n/b)的齐通解为 c* nLogba ,c 为待定常数)
主定理: (参见 Aho 书 P64, Corman 书 P76/南大编译本证明较全) 1) 若有ε> 0, 使 f(n)=O( n(Logba)−ε )
Th4:若(*)方程中的 f(n)≠0(非齐次),且 q(n)是(*)的一个解, 则(*)方程的解为: (*)的齐通解(含有待定系数)+ q(n) (非齐特解), (齐通解中的待定系数由边界条件唯一确定)。
若不是常系数线性递归方程,则需要用生成函数法。
生成函数法举例: 求解下列非线性递归方程
已知 an=a1an-1+a2an-2+ …+an-1a1 (n≥2)
C
0 n
+
C1 n
x+
C
2 n
x2+…+
C
n n
xn
是序列{
C
0 n
,
C1 n
,…,
C
n n
}的普通生成函数。
令
x=-1,代入得
C
0 n
+
C
2 n
+
C
4 n
+…=
C1 n
+
C
3 n
+
C
5 n
+…
。
即从 n 个不同的物体中选取偶数个物体的方法数等于
从 n 个不同的物体中选取奇数个物体的方法数。
其它应用可参看组合数学/组合分析教材。
第一章 算法分析的数学基础 生成函数(母函数) 在进行计数分析时,常常会遇到递推方程,形如:
an=cn-1*an-1+cn-2*an-2+…+cr*ar (cr≠0) 求解时往往使用生成函数的方法。 e.g. Fibonacci 数列:满足关系 an=an-1+an-2(该类数有很多好的性质) 普通与指数生成函数的定义: 设{a0,a1,a2,…,an,…}是某一数域 (e.g. 有理数,实数,复数)上的数的序列, {μ0(x), μ1(x), μ2(x), … ,μn(x), …} 是同一数域上相互独立的函数序列,则函数 F(x)=a0μ0(x)+ a1μ1(x)+ a2μ2(x)+ … + anμn(x)+ … 称为是序列{ a0,a1,…,a2,…}的普通生成函数(普母函数), G(x)= a0μ0 (x)/0! +a1μ1 (x)/1! +a2μ2 (x)/2! + … +anμn (x)/n! + … 称为是序列{a0,a1,…,a2,…}的指数生成函数(指母函数), (形状类似于 ex 的展开形式) 相互独立(independent)的函数序列: 设{μ0(x), μ1(x), μ2(x), … ,μn(x), …}是某一数域上的函数序列, (x 的值以及μk(x)(k=0,1,2, …)的值都在同一个数域中) 任取μk(x)(k=0,1,2, …),不存在数域中的数α1,α2,…,αp, 使得μk (x) = α1μi1(x) + α2μi2 (x) + … + αpμip (x) ,
即 A(x)应为 1/2 ± 1− 4x /2
∑ C x ∵ 1 − 4x = ∞ (− 2
n=1 n
, ) n−1
n
2n−2
C 即
1−
4x
的幂级数展开式通项系数为
bn=-
2 n
n −1 2n−2
,an=
±
bn/2
而 an 为正数,∴ ± 1− 4x 中符号取为负,于是有
A(x)=1/2-
1−
4x
/2,an=
n+1
k dx
0
j =1
1
∑ j ∑ j k+1
n
n k (n+1)k+1−1
nk
∴ k+1 ≤
≤ k+1 , ∴
=Θ( nk+1 )
j=1
j =1
∑ ∑ ∫ ∑ ∫ eg3:
n
n
1
j =1+
1 j
≤1+
j =1
j=2
n dx
1x
n
=1+logen,另外
j=1
1 j
≥
n+1
1
dx x
=loge(n+1)
e.g. an=an-1+an-2,边界条件 a0=a1=1,特征方程为 x2-x-1=0 两个(特征)根为α1=(1+ 5 )/2,α2=(1- 5 )/2,互不相同, ∴an= A1 α1n + A2 α2n。把 n=0 和 n=1 的两个边界条件代入,
得 2 个关于 A1, A2 的方程,算出 A1=(1+ 5 )/(2 5 ),A2= - (1- 5 )/(2 5 )。 (Fibonacci 数列的通项也可根据其生成函数展成的幂级数求出。)
j =1
∴㏒
n!<
n+1
∫1 log
xdx
。另外不难看出,㏒
n!>
n
∫1
log
xdx
成立(n-1
个小矩形
均左移一个单位,则可覆盖区间[1,n]上的曲线下的面积)。
于是求和就可转化为求积分。
由于
nຫໍສະໝຸດ Baidu
∫1
ln
xdx
=(xlnx-x)|
n 1
=
n
㏑
n
–
n
+
1,
且㏒ x=㏒ e*㏑ x (由 x=elnx),
递归方程求解
e.g. Fibonacci 数 an=an-1+an-2 a0=1,a1=1(边界条件),
则可以算出序列为{1,1,2,3,5,8,…},an=?
∞
设 A(x)= ∑ an x n ,从 2 开始对等式 an=an-1+an-2 两边分别求幂级数, n=0
∞
∞
得 ∑ an xn = ∑ ( an-1+an-2) xn ,于是有 A(x)-a1x-a0=x(A(x)-a0)+x2A(x),
1、求和转化为求积分:
n
eg1:已知㏒ n!= ㏒ n+㏒(n-1)+…㏒ 2+㏒ 1= ∑log j j =1 求㏒ n!的不含∑的表达式。
如下图,在区间[1,n+1]中,曲线 y=㏒
x
之下的面积为
n +1
∫1 log
xdx
,
而㏒
n!(
n
∑
log
j
)则等于曲线
y=㏒
x 之下 n-1 个小矩形的面积之和。
T(n) =2T(n/2) +cn log n
=2(2T(n/22)+c(n/2) log(n/2))+cn log n
=22T(n/22)+cn log(n/2)+cn log n
Th2:若α1,α2 是(**)方程的一对共扼复数根ρeiθ 和ρe−iθ , 则这两个根对应的解的部分为 Aρncos(nθ)+Bρnsin(nθ) (A,B 为实的待定系数)
Th3:若α是(**)方程的 k 重根,则α对应的解的部分为 C1αn+ C2 nαn+ C3 n2αn+ …+Ck nk-1αn (C1~Ck 为待定常数)
∴㏒
n!>
n
∫1
log
xdx
=㏒
e
(n
㏑
n
-
n
+1)
=
n
㏒
n
-
n
㏒
e
+
㏒ e,
㏒
n!<
∫n+1 log
1
xdx
=(n+1)㏒(n+1)
-
(n+1)㏒
e
+
㏒e,
∵n 充分大时上述两项主部均为 nlogn,∴㏒ n!= Θ(n ㏒ n)。
∫ x ∫ x e.g.2:类似的有: n
∑ jn
k dx ≤
≤ k
因此一般来说,对于时间复杂度满足递归关系
T(n)=a*T(n/b)+f(n)的算法,只需比较 f(n)与 nLogba 的量级大小,
算法的时间复杂度总是与量级大的那个相同(即小的那个可以忽略);
若 f(n)与 nLogba 的量级相同(或只差 Log k n ),
则算法的时间复杂度为 f(n)* Log n 。
n=2
n=2
于是可解得:A(x)=1/(1-x- x2)。
将 1/(1-x- x2) 幂级数展开之后,xn 前的系数就是数列的通项 an。 常系数线性递归方程(差分方程):
c0an+c1an-1+…+cran-r=f(n) (*) (这里 c0*cr≠0) e.g. 3an-5an-1+2an-3=n2+5 线性:所有 ai 都是一次的。非线性:含有 ai2 或如 aiaj 之类的乘积项。 求解(*)方程需要 r 个连续的边界条件
即任何一个函数项μk(x)不能被其它函数项线性表出。 e.g. {1,x,x2,x3,…,xn,…}是相互独立的,
而{1,1+x,1-x,1+x2,1-x2,…}不是相互独立的,
∵1=1/2((1+x)+(1-x))。
如使用第二个函数序列来构造普通生成函数,
则序列{1,0,0,0, …}和{0,1/2,1/2,0, …}所对应的普通生成函数是相同的, 序列与其生成函数之间没有 1-1 对应关系。
e.g. Fibonacci 方程 r=2,求解该方程需要两个连续的边界条件。
若 f(n)≠0,则(*)方程称为非齐次的;若 f(n)=0,则称方程是齐次的。
类似于常微分方程,称 c0xr+c1xr-1+…+cr=0 (**) 为方程(*)的特征方程。 Th1:若特征方程(**)恰有 r 个互不相同的特征根α1,α2,…,αr