用生成函数法求f(n)=2f(n/2)+n

liuting005 2008-04-01 11:31:44
用生成函数法求f(n)=2f(n/2)+n 的时间复杂度
...全文
1499 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
VictorGun 2012-04-25
  • 打赏
  • 举报
回复
生成函数法在组合数学上应该是母函数法,
对序列(a0, a1, ..),定义函数:g(z)=a0+a1z+a2z2+..+anzn+..称为序列(a0, a1, ..)的生成函数。
利用递推公式建立关于生成函数的定解方程
解定解方程得到生成函数的级数形式,其系数即为序列的解。
FancyMouse 2010-12-17
  • 打赏
  • 举报
回复
生成函数和lz说的递归式一点关系都没。
lfc0416 2010-12-16
  • 打赏
  • 举报
回复
是使用幂级数展开式,然后应用微积分技术和数学变换求出有限解析表达式,再用微积分重新展开来求的通项。对递归很有用
lfc0416 2010-12-16
  • 打赏
  • 举报
回复
13楼应该对了
lfc0416 2010-12-16
  • 打赏
  • 举报
回复
你们都不对
arong1234 2008-04-02
  • 打赏
  • 举报
回复
可惜没时间学,否则倒是很感兴趣
[Quote=引用 13 楼 medie2005 的回复:]
主要思路是:
用生成函数变换,求得f(n)的生成函数F(Z)(可能要求指数型生成函数),利用拉格郎日求逆或者泰勒展开,求得F(Z)展开式中第n项的表达式,也可以是渐进表达式(只需要求时间复杂度).这样,得到的第n项的表达式,或渐进表达式就是要求的时间复杂度.
[/Quote]
tailzhou 2008-04-02
  • 打赏
  • 举报
回复
master method应该是使用生成函数对递归方程T(n)=aT(n/b)+ f(n) 的求解得到的结论;
medie2005 2008-04-02
  • 打赏
  • 举报
回复
主要思路是:
用生成函数变换,求得f(n)的生成函数F(Z)(可能要求指数型生成函数),利用拉格郎日求逆或者泰勒展开,求得F(Z)展开式中第n项的表达式,也可以是渐进表达式(只需要求时间复杂度).这样,得到的第n项的表达式,或渐进表达式就是要求的时间复杂度.
medie2005 2008-04-02
  • 打赏
  • 举报
回复
生成函数并不是master method(主方法).
生成函数不仅在处理递归上有用,在组合计数方面,公式推导方面也大有用处.
我看算法分析导论的时候学过一点,不过现在不怎么会了.
tailzhou 2008-04-02
  • 打赏
  • 举报
回复
生成函数法应该就是算法导论上所说的master method:

copy其中一段,但很多特殊符号粘贴不过来,有点乱:

The master method depends on the following theorem.

Theorem 4.1

Let a >= 1 and b > 1 be constants, let â(n) be a function, and let T(n) be defined on the nonnegative integers by the recurrence


T(n) = aT(n/b) + â(n),
where we interpret n/b to mean either n/b or n/b. Then T(n) can be bounded asymptotically as follows.

1. If â(n) = O(n^logb(a-e)) for some constant e> 0, then T(n) = (n^logb(a)).

2. If â(n) = (n^logb(a)), then T(n) = (n^(logb(a))lg n).

3. If â(n) = (n^logb(a+e)) for some constant e > 0, and if aâ(n/b) <= câ(n) for some constant c < 1 and all sufficiently large n, then T(n) = (â(n)).


对于lz的例子,a=2,b=2 ,â(n)==o(n)==o(n^logb(a)),适用第2条;


arong1234 2008-04-01
  • 打赏
  • 举报
回复
所谓的生成函数法不知道,时间复杂度也不知道。
总之通项公式我给你推出来了
arong1234 2008-04-01
  • 打赏
  • 举报
回复
今令f(1)=c
f(2)=2c+2
f(4)=2(2c+2)+4 = 4c+8
f(8) = 2(4c+8)+8 = 8c+24
f(16) = 2(8c+24)+16 = 16c+64
f(2^k) = c*2^k + P(k)

考虑P(k),
P(0) = 0
P(1) = 2 *P(0) + 2
P(2) = 2*P(1)+4
...
p(n-2) = 2*P(n-3)+2^(n-2)
p(n-1) = 2*P(n-2)+2^(n-1)
P(n) = 2* P(n-1) + 2^n = 2*2*P(n-2)+2*2^(n-1)+2^n = 4P(n-2)+2*2^n
= 4*2P(n-3)+4*2^(n-2)+2*2^n

归纳得到P(n) = 2^kP(n-k)+k*2^n = 2^nP(n-n)+n*2^n =n*2^n

很显然,P(n-1) = (n-1)2^(n-1)
2*P(n-1)+2^n = 2*(n-1)*2^(n-1) + 2^n=P(n) 得到验证

带回f(2^k)得到f(2^k) = c*2^k+k*2^k,对于任意常数c成立
其中^表示幂






rover___ 2008-04-01
  • 打赏
  • 举报
回复
用生成函数法可用来求解递推关系。所求f(n)=2f(n/2)+n 是个非线性递推关系。
UP一下,不知道怎么解。
arong1234 2008-04-01
  • 打赏
  • 举报
回复
自动进行公式推导?这个蛮高深的,我觉得楼主应该到图书馆去找书学习,涉及比较高深理论的难以找到人问的。即使人家愿意教你,也不是三句两句能解释清楚的,谁有那么多时间解释复杂的东西啊
liuting005 2008-04-01
  • 打赏
  • 举报
回复
【引用 5 楼 medie2005 的回复:
生成函数,CSDN上会的人也是没几个的.】
那我应该问谁呢?感觉你们好像什么都会。
medie2005 2008-04-01
  • 打赏
  • 举报
回复
生成函数,CSDN上会的人也是没几个的.
liuting005 2008-04-01
  • 打赏
  • 举报
回复
例:A(x)=a0 +a1*x+a2*x^2+…..+an*x^n +…..
汉诺塔:an=an-1 +1
a1 =1
A(x) =∑ai*x^i
-2xa(x)=-2a1*x^2-2a2*x^3-…-2an*x^(n+1)…..
A(x)-2xA(x)= a1*x+(a2-a1)*x^2 +…+(an-2an-1)*x^n +…
= a1*x+ x^2+x^n +…
= a1 x+∑x^i (i从2开始到n)
=x/(1-x)
最后求出an 通项的表达式,再往后就不太会了
liuting005 2008-04-01
  • 打赏
  • 举报
回复
这好像是用递推方法做出来的
rushman 2008-04-01
  • 打赏
  • 举报
回复
关键词:递归,log2 n
  • 打赏
  • 举报
回复
生成函数法是什么方法?
f(n)=2*f(n/2)+n
=2*[2*f(n/4)+n/2]+n=4*f(n/4)+2*n
=4*[2*f(n/8)+n/4]+2*n=8*f(n/8)+3*n
=16*f(n/16)+4*n
=……
=(2^lgn)*f(n/(2^lgn))+n*lgn
=n*f(1)+n*lgn
所以时间复杂度为O(n*lgn)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧