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):
有关ggdxj套路的算法很多很多,我们在刷leetcode的时候或者在面试笔试的时候都会见到,以上是我对其的总结。