[网易2012年某笔试题] 求斐波那契数列, 要求时间复杂度尽可能小(简单题,不熟悉斐波那契的同学可参考)
来源:互联网 发布:pureVPN软件 编辑:程序博客网 时间:2024/05/29 08:32
递归法:
最容易想到的一种方法,简单易行,但缺点太明显。
#include<stdio.h>int fib(int n){if (n == 1 || n == 2)return 1;return fib(n-1) + fib(n-2);}int main(){printf("%d\n", fib(10));getchar();return 0;}暂不论使用了多少栈空间,算法本身就是指数级的复杂度了。
迭代法:
也是很容易想到的一个方法,开一个数组,依次求解。
#include<stdio.h>#define maxn 30int fib[maxn];int main(){ fib[1] = fib[2] = 1; for(int i = 3; i < maxn; i++) fib[i] = fib[i-1] + fib[i-2]; printf("%d\n", fib[10]); getchar(); return 0;}时间复杂度是O(n), 空间复杂度是O(n).
滚动数组:
既然fib[i]只跟fib[i-1], fib[i-2]有关,从fib[i-3]开始就没用了。那么这些空间完全可以利用起来。
#include<stdio.h>int fib[3];int main(){fib[0] = fib[1] = 1;for(int i = 2; i < 10; i++)fib[i%3] = fib[(i-1)%3] + fib[(i-2)%3];printf("%d\n", fib[(10-1)%3]);getchar();return 0;}时间复杂度是O(n), 空间复杂度是O(1)
公式法:
斐波那契本身有通项公式-_-|||,所以一个公式就搞定了,唯一缺点是double的精度有限,有时可能不够精确
#include<stdio.h>#include<math.h>int fib(int n){double sq = sqrt(5.0);return int((pow(1+sq, n) - pow(1-sq, n)) / (pow(2.0, n) * sq));}int main(){printf("%d\n", fib(10));getchar();return 0;}
1 0
- [网易2012年某笔试题] 求斐波那契数列, 要求时间复杂度尽可能小(简单题,不熟悉斐波那契的同学可参考)
- 2012年5月7日---基于斐波那契数列的时间复杂度分析
- 斐波那契数列时间复杂度分析
- 斐波那契数列算法及时间复杂度分析
- 斐波那契数列时间复杂度分析
- 斐波那契数列数列的三种时间复杂度的实现方法
- 二分查找算法,斐波那契数列的递归及非递归。(分析时间复杂度及空间复杂度)
- 波那契数列的复杂度求解
- 斐波那契数列算法的三种C#实现及时间复杂度分析
- 斐波那契数列时间复杂度和通项公式的一些记录
- 斐波那契数列的递归与非递归算法实现及其时间复杂度
- 斐波那契数列的时间复杂度详释与改进方法
- 斐波那契数列的三种解法及时间复杂度
- 关于斐波那契数列的复杂度最低算法
- 简单的斐波那契数列
- C语言-斐波那契(Fibonacci)数列三种不同求法时间复杂度分析
- 时间空间复杂度(二分查找和斐波那契数列)
- C++实现斐波那契数列 时间复杂度 空间复杂度
- hdu 2159 FATE(二维完全背包)
- ListView数据动态刷新
- java 步步惊心
- Fragment(二)通信
- Android开发调试中遇到的Waiting for HOME解决方案
- [网易2012年某笔试题] 求斐波那契数列, 要求时间复杂度尽可能小(简单题,不熟悉斐波那契的同学可参考)
- 图-邻接矩阵
- 黑马程序员—collections集合
- HDU 1282 回文数猜想
- IOS开发学习笔记(1)-----UILabel 详解
- 字符编码:ANSI,ASCII,GB2312,GBK,Big5,Unicode和UTF-8
- codeforces A. Fox and Number Game
- mysql 字符集设置查看
- Android Recovery mode流程详解