递归计算斐波那契数列的时间复杂度

转载
https://zhuanlan.zhihu.com/p/257214075
个人理解,仅作记录
方法一:
F(n)=F(n-1)+F(n-2)

T(n)=T(n-1)+T(n-2)+1(1为加法所消耗的时间)

两边加1得T(n)+1=T(n-1)+1+T(n-2)+1
令An=T(n)+1
则A(n)=A(n-1)+A(n-2)
所以T(n)+1又是一个斐波那契数列,只是初项不同、考虑两个不同初项的斐波那契数列,可以通过链接里的证明知道任何一个斐波那契数列的增长速度永远小于c,c,2c,3c,5c这一斐波那契数列的增长速度,即任意的n,A(n)<Fc(n),所以可将Fc(n)的通项公式作为An的上界,当用theta表示时就可以去除c和+1
对于其中的第二种方法中的关于递归计算Fn的叶节点的数目
这一方法所采取的方法是计算递归树中的叶子节点和内部结点
实际上 ,个人感觉应该还是要加以说明的,因为方法一中的证明只是说明了对于一个初项为a,b的斐波那契数列F,总存在一个斐波那契数列T c,c,2c,3c……使得对于任意的n,Fn<Tn其中c=max(a,b);
首先对于任意的初项a,b的F数列,把他改写成初项为1,1的T数列。先观察T数列,由于最后结果都是递归到叶节点1,1,所以最后都是把这些1进行相加, 只不过有括号的顺序。那么这些叶节点的数目就是Tn,还有内部结点,就是进行加法所耗费的时间,就是进行了多少次加法,有Tn个1相加,就执行了Tn-1个加法,所以总共花费了theta(1)Tn+theta(1)(Tn-1)的时间,就是theta(Tn),
而F(n)的叶子结点的数量和内部节点的数量和T(n)是相等的,因为我只是改变了其中的元素,1变2,2变3,数目不改变,加了多少次也没改变,所以计算F(n)的时间也为theta(T(n)) T(n)为斐波那契数列的第n项
所以用递归方法计算斐波那契数列的时间复杂度才是O(kn)其中k为黄金比例

为什么是O而不是theta因为斐波那契数列的通项公式还要减去(1-根号5/2)n

在记录一下MIT算法导论公开课里是如何得到2n/2这个下界的
首先T(n)=T(n-1)+T(n-2)+1
可以看到在一条分支上,问题规模不断减1,
在另一条分支上问题规模不断减2。则在减2的分支上问题规模减少的量是减1的分支上的两倍,则当减2的分支上的规模减少到1,也就是说这棵递归树的1到n/2层至少都是满的,1到n/2层的结点数为2n/2因为每层都延伸出两个
为什么MIT算法导论公开课里在上到递归计算斐波那契数列的时间复杂度的时候会使Omega(kn),是不是因为Fn=(kn/根号5+1/2)向下取整,算法导论P34,公式3.25,那不是直接可以用theta符号了吗?希望有人解答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值