斐波那契数列(fibonacci sequence)使用 master 公式(主定理)计算时间复杂度

master公式:求递归问题的时间复杂度公式,只适用于过程规模相同的情况(拆分过程相同)。

  • T ( N ) = a × T ( N b ) + O ( N d ) T(N) = a \times T(\frac{N}{b}) + O(N^d) T(N)=a×T(bN)+O(Nd)

其中:
d < l o g b a d \lt log_ba d<logba 时,时间复杂度为 O( N l o g b a N^{log_ba} Nlogba)
d = l o g b a d = log_ba d=logba 时,时间复杂度为 O( N d × l o g N N^d\times{logN} Nd×logN)
d > l o g b a d \gt log_ba d>logba 时,时间复杂度为 O( N d N^d Nd)

一个经典的递归案例就是 fibonacci 数列,代码如下:

int fibo1(int n) {
    if(n == 1 || n == 0)
    	return n;
    return fibo1(n - 1) + fibo1(n - 2);
}

此时,会发现该递归的过程规模不相同! 所以不能使用master公式。 这也是为什么各大搜索网站结果,都没有搜索结果。

但如果强行进行计算呢?

  1. 该递归使用了两次,所以 a = 2;
  2. 递归内使用了 n-1 or n-2,所以问题规模被拆分成了 N − 1 N \frac{N-1}{N} NN1 的规模,因为b等于问题规模除以N后的倒数,所以 b = N 2 N − 1 b = \frac{N^2}{N-1} b=N1N2
  3. 中间的处理过程为两个返回结果相加,复杂度为 O(1) = O( N 0 N^0 N0),所以 d = 0;
  4. 经过计算符合 d < log ⁡ b a \log_ba logba ,时间复杂度为 O( N log ⁡ b a N^{\log_ba} Nlogba);
  5. 最终结果为 O( N l o g N 2 N − 1 2 N^{log_{\frac{N^2}{N-1}}2} NlogN1N22),经过换底公式化简为 lg ⁡ 2 2 lg ⁡ ( N ) − lg ⁡ ( N − 1 ) \frac{\lg2}{2\lg{(N)} - \lg{(N-1)}} 2lg(N)lg(N1)lg2

而 fibonacci 的时间复杂度应为 O( 2 N 2^N 2N),结果差别比较大。
计算过程还不是很严谨,记住:过程规模不相同不符合。别犯题目那样的错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值