Fibonacci线性递归算法时间复杂度分析
前言
个人见解,有错误欢迎指正
铺垫
计算 Fibonacci 数列第 n n n 项的线性递归算法如下
/************************************************************************
* Data Structures in C++
* ISBN: 7-302-33064-6 & 7-302-33065-3 & 7-302-29652-2 & 7-302-26883-3
* Junhui DENG, deng@tsinghua.edu.cn
* Computer Science & Technology, Tsinghua University
* Copyright (c) 2003-2020. All rights reserved.
************************************************************************/
__int64 fib ( int n ) {
//计算Fibonacci数列的第n项(二分递归版):O(2^n)
return ( 2 > n ) ?
( __int64 ) n //若到达递归基,直接取值
: fib ( n - 1 ) + fib ( n - 2 ); //否则,递归计算前两项,其和即为正解
}
时间复杂度分析:
- 递归基的时间复杂度 T ( 0 ) = 1 T(0) = 1 T(0)=1, T ( 1 ) = 1 T(1) = 1 T(1)=1
- 通项: T ( n ) = T ( n − 1 ) + T ( n − 2 ) + 1 , n > 1 T(n) = T(n-1) + T(n-2) + 1, \quad n > 1 T(n)=T(n−1)+T(n−2)+1,n>1
问题:如何求出 T ( n ) T(n) T(n) 的解析表达式呢?
分析
为了简化问题,不妨设
S ( n ) = T ( n ) + 1 2 (1) S(n) = \frac{T(n) + 1}{2} \tag{1} S(n)=2T(n)+1(1)
因此可以得到
S ( 0 ) = 1 = fib ( 1 ) S ( 1 ) = 1 = fib ( 2 ) S(0) = 1 = \text{fib}(1) \\ S(1) = 1 = \text{fib}(2)