首页 > 编程知识 正文

斐波那契数列迭代算法,斐波那契查找复杂度最坏

时间:2023-05-04 10:34:22 阅读:167653 作者:2484

ggdxj数列序列算法的最优复杂度——时间复杂度为o(logn )对于菲薄那契系列问题的探讨很多,下面就以两个例子来分析:

第一种情况:

在朦胧的大草原上,俊秀的奥特曼拾起了n根棒子,第I根棒子的长度是I,俊秀的奥特曼现在很开心。 我想选择其中的三根木棍做成美丽的三角形。 但是,清秀的荔枝戏弄俊秀的奥特曼,想去掉一些木棍,俊秀的奥特曼任意挑三根木棍也做不出三角形来。 清秀荔枝最少要去掉几根木棍? 给n,回去至少去掉几瓶?

例如在N=14 .中,棒的长度分别是1234567891011121314

三角形的条件是两边之和必须大于三边

所以,我们请留下木棍长为1 2 3 5 8 13的木棍。 这些棒不能用任意组合构成三角形

观察该数列,可以得出满足f(n )=f(n-1 ) f ) n-2 )的公式。 这就是纯粹的ggdxj数列问题

情形2 ) ggdxj的讨论还可以优化为o(logn )。

有个农场里有一头母牛。 农场通过生育技术人工授精,母牛不能生公牛,而只能生母牛。 母牛从第二年开始生母牛,wmdxrk的牛需要等待三年才能生母牛

假设牛不会死,n年后问农场里有多少头母牛。

第一年: 1头母牛a

第二年:母牛a生B 2只

第三年:母牛a生三只c、a、b

第4年:母牛a产d、a、b、C 4只

第五年:母牛a生e,b生f、a、b、c、D 6只

第六年:母牛a生g、b生h、c生I、a、b、c、d、e、F 9只

以上几只数满足式f(n )=f ) n-1 ) f ) n-3 )

对于案例一无非就是求出ggdxj数列问题了:

我想大家都相当熟悉ggdxj数列,最多两分钟就能写出以下时间复杂度o(n )的代码。

//递归长fib (intn ) if ) n=1||n==2) {return 1; }返回(fib (n-2 ) fib (n-1 ); }但是,上述实现的时间复杂度在o(n )面试的时候没有划分,我想说的是o ) Logn )进行优化。 那么,我们来讨论一下如何将时间复杂度定为o ) Logn ) :

(编辑器很难敲出数学的特殊符号,所以我拍了几张照片如下:

实现代码如下所示。

publicstaticvoidmain (string [ ] args ) system.out.println ) Fibonacci(5); system.out.println (Fibonacci2(5); (} /** *一般解法时间复杂度o(n ) @paramn ) ) { return 0)/publicstaticintFibonacci(intn ) if ) N1 ) { return 0; (if ) n==1||n==2) { return 1; }else{returnFibonacci(n-1 ) Fibonacci (n-2 ); } } /** *整个调用时间的复杂性o(logn ) @paramn ) { return 0)/publicstaticintfibonacci2(intn ) if ) N1 ) { return 0; (if ) n==1||n==2) { return 1; } int [ ] [ ] base=new int [ ] [ ] { 1,1 },{ 1,0 }; int[][]RES=marixpow(base,n-2 ); return res[0][0] res[1][0]; } privatestaticint [ ] [ ] marixpow [ int ] [ ] base,intn ] { int [ ] [ ] RES=new int [ base.length ] [ base [0].le enen ires.length; I ) { res[i][i]=1; //单位矩阵} int[][] t=base; for (; n!=0; n=1(if ) ) N1)!=0() /满足指数bit为1时RES=multmaritx(RES,t ); //基数矩阵是不断变化的t=multmaritx(t,t );

} return res; } /** * 虽然是三个for循环但是矩阵就是个2*2的大小有限。所以实际时间复杂度O(1) * @param t * @param t1 * @return */ private static int[][] multMaritx(int[][] t, int[][] t1) { int[][] res = new int[t.length][t1[0].length]; for(int i=0;i<t.length;i++){ for(int j=0;j<t1[0].length;j++){ for(int k=0;k<t1.length;k++){ res[i][j] += t[i][k]*t1[k][j]; } } } return res; }

下面来分析案例二:

由于案例二的公式是:F(N) = F(N-1)+F(N-3)
这是个3X3的矩阵,我们也可以通过带入前面几个值求出矩阵base来:

以下是案例二的实现代码最优解:O(logN):

/** * @author zhanglijie * @version 1.0 * @since 1.1.0 2021/5/7 0007 20:54 * 一个农场,有一个母牛,农场通过生育技术人工授精让母牛只能生母牛而不让生公牛。母牛从第二年开始生母牛,对于wmdxrk的牛需要等过了三年才能生母牛 * 假设牛不会死,问n年后农场有多少只母牛? * * 第一年 :母牛A 1只 * 第二年: 母牛A生B 2只 * 第三年: 母牛A生C,A,B 3只 * 第四年:母牛A生D,A,B,C 4只 * 第五年:母牛A生E,B生F,A,B,C,D 6只 * 第六年:母牛A生G,B生H,C生I,A,B,C,D,E,F 9只 * 13 * 19 * * * 公式:F(N) = F(N-1)+F(N-3) * */public class CowHowMany { public static void main(String[] args) { int year =8; int sum = getHowManyCow(year); System.out.println(sum); } private static int getHowManyCow(int year) { if(year<=3){ return year; } int[][] base = new int[][]{ {1,1,0}, {0,0,1}, {1,0,0} }; int[][]res = martixPow(base,year-3); return 3*res[0][0]+2*res[1][0]+1*res[2][0]; } private static int[][] martixPow(int[][] base, int n) { int[][] res = new int[base.length][base[0].length]; for(int i=0;i<res.length;i++){ res[i][i] = 1;//单位矩阵 } int[][] t = base; for(;n!=0;n>>=1){ if((n&1)!=0){ res = multMaritx(res,t); } t = multMaritx(t,t); } return res; } private static int[][] multMaritx(int[][] t, int[][] t1) { int[][] res = new int[t.length][t1[0].length]; for(int i=0;i<t.length;i++){ for(int j=0;j<t1[0].length;j++){ for(int k=0;k<t1.length;k++){ res[i][j] += t[i][k]*t1[k][j]; } } } return res; }}

有关ggdxj套路的算法很多很多,我们在刷leetcode的时候或者在面试笔试的时候都会见到,以上是我对其的总结。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。