斐波纳契数列
斐波纳契数列相关问题
=====================================================================
【通项公式】
=====================================================================
【迭代实现】
int Fib5(int index){
if(index<1) {return-1;}
int a1=1,a2=1,a3=1;
for(int i=0;i<index-2;i++) {
a3=a1+a2; a1=a2; a2=a3;
}
return a3;
}
=====================================================================
【矩阵法】
算Fibonacci数精确值的最快的方法。
F(n)和F(n - 1)写成一个2x1的矩阵
[FnFn−1]=[Fn−1+Fn−2Fn−1]=[1×Fn−1+1×Fn−21×Fn−1+0×Fn−2]=[1110]×[Fn−1Fn−2]
[FnFn−1]=[1110]n−1×[F1F0]=[1110]n−1×[10]
关键点,幂运算可以【二分加速】。
设有一个方阵a,利用分治法求a的n次方,有:
an={an/2×an/2a(n−1)/2×a(n−1)/2×a, if x is even, if x is odd
可见复杂度满足T(n) = T(n / 2) + O(1),根据Master定理可得:T(n) = O(log n)。
总结:二阶方阵相乘一次可以看成是常数时间(虽然这个常数会比较大),因此整个算法的时间复杂度是O(log n),空间复杂度是O(1)。
=====================================================================