斐波那契数列三种实现+矩阵乘法+矩阵cimi

本文介绍了一种利用矩阵快速计算斐波那契数列的方法,通过矩阵乘法和矩阵幂运算实现O(logN)的时间复杂度,并对比了传统O(N)和暴力递归O(2^N)的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.lyk.kk;

/**
 * Created by Administrator on 2017/9/4.
 */
public class A1 {
    //矩阵乘法
    public int [][] muliMatrix(int [][]m,int [][]n){
        //定义结果数组  行为m行,列为n列
        int [][]result=new int[m.length][n[0].length];
        for(int i=0;i<m.length;i++){
            for(int j=0;j<n[0].length;j++){
                for(int k=0;i<n.length;k++){
                    result[i][j]+=result[i][k]*result[k][j];
                }
            }
        }
        return result;
    }
    //矩阵的n次幂
    public int[][] matrixPower(int [][]m,int p){
        int [][]result=new int[m.length][m[0].length];
        for(int i=0;i<result.length;i++){
            result[i][i]=1;
        }
        int [][]temp=m;
        for(;p!=0;p>>=1){
            if((p&1)!=0){
                result=muliMatrix(temp,temp);
            }
        }
        return result;
    }
    //求斐波那契数列。用矩阵实现。复杂度0(longN).
    public int f3(int n){
        if(n<1) return 0;
        if(n==1||n==2){
            return 1;
        }
        int [][] base={{1,1},{1,0}};
        int [][] result=matrixPower(base,n-2);
        return result[0][0]+result[1][0];
    }

    //求斐波那契额数列,O(N)
    public int f2(int n){
        if(n<1) return 0;
        if(n==1||n==2){
            return 1;
        }
        int now=1;
        int pre=1;
        int temp=0;
        for(int i=3;i<=n;i++){
            temp=now;
            now=pre+now;
            pre=temp;
        }
        return now;
    }
    //求斐波那契数列,暴力递归O(2^N)
    public int f1(int n){
        if(n<1) return 0;
        if(n==1||n==2){
            return 1;
        }
        return f1(n-1)+f1(n-2);
    }

}

package com.lyk.kk;

/**
 * Created by Administrator on 2017/9/4.
 */
public class A1 {
    //矩阵乘法
    public int [][] muliMatrix(int [][]m,int [][]n){
        //定义结果数组  行为m行,列为n列
        int [][]result=new int[m.length][n[0].length];
        for(int i=0;i<m.length;i++){
            for(int j=0;j<n[0].length;j++){
                for(int k=0;i<n.length;k++){
                    result[i][j]+=result[i][k]*result[k][j];
                }
            }
        }
        return result;
    }
    //矩阵的n次幂
    public int[][] matrixPower(int [][]m,int p){
        int [][]result=new int[m.length][m[0].length];
        for(int i=0;i<result.length;i++){
            result[i][i]=1;
        }
        int [][]temp=m;
        for(;p!=0;p>>=1){
            if((p&1)!=0){
                result=muliMatrix(temp,temp);
            }
        }
        return result;
    }
    //求斐波那契数列。用矩阵实现。复杂度0(longN).
    public int f3(int n){
        if(n<1) return 0;
        if(n==1||n==2){
            return 1;
        }
        int [][] base={{1,1},{1,0}};
        int [][] result=matrixPower(base,n-2);
        return result[0][0]+result[1][0];
    }

    //求斐波那契额数列,O(N)
    public int f2(int n){
        if(n<1) return 0;
        if(n==1||n==2){
            return 1;
        }
        int now=1;
        int pre=1;
        int temp=0;
        for(int i=3;i<=n;i++){
            temp=now;
            now=pre+now;
            pre=temp;
        }
        return now;
    }
    //求斐波那契数列,暴力递归O(2^N)
    public int f1(int n){
        if(n<1) return 0;
        if(n==1||n==2){
            return 1;
        }
        return f1(n-1)+f1(n-2);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值