计算fibnacci 级数的几种方法
2016-04-15 08:16
393 查看
1. 直接计算(递归)
int fib(int x)
{
if (x <= 1)
return x;
return fib(x-1)+fib(x-2);
}时间复杂度: O(2^n)
2. 使用动态规划:
int fib(int n)
{
if( n == 0 || n == 1)
{
return n;
}
int a = 0, b = 1,i;
for (i = 2; i <= n;i++)
{
int c = a + b;
a = b;
b = c;
}
return b;
}
时间复杂度: O(n)
3. 使用矩阵幂
unsigned long long fibnacci(int n)
{
unsigned long long fib[2][2] = {{1, 1}, {1, 0}};
unsigned long long result[2][2] = {{1, 0}, {0, 1}};
unsigned long long tmp[2][2];
while(n > 0 )
{
if( n & 1)
{
int i,j,k;
memset(tmp, 0, sizeof(tmp));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
int k;
for(k = 0; k < 2; k++)
{
tmp[i][j] += result[i][k] * fib[k][j];
}
}
}
memcpy(result, tmp, sizeof(result));
}
int i, j, k;
memset(tmp, 0, sizeof(tmp));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
int k;
for(k = 0; k < 2; k++)
{
tmp[i][j] += fib[i][k] * fib[k][j];
}
}
}
memcpy(fib, tmp, sizeof(tmp));
n = n >> 1;
}
return result[0][1];
}
时间复杂度: O(Logn)
int fib(int x)
{
if (x <= 1)
return x;
return fib(x-1)+fib(x-2);
}时间复杂度: O(2^n)
2. 使用动态规划:
int fib(int n)
{
if( n == 0 || n == 1)
{
return n;
}
int a = 0, b = 1,i;
for (i = 2; i <= n;i++)
{
int c = a + b;
a = b;
b = c;
}
return b;
}
时间复杂度: O(n)
3. 使用矩阵幂
unsigned long long fibnacci(int n)
{
unsigned long long fib[2][2] = {{1, 1}, {1, 0}};
unsigned long long result[2][2] = {{1, 0}, {0, 1}};
unsigned long long tmp[2][2];
while(n > 0 )
{
if( n & 1)
{
int i,j,k;
memset(tmp, 0, sizeof(tmp));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
int k;
for(k = 0; k < 2; k++)
{
tmp[i][j] += result[i][k] * fib[k][j];
}
}
}
memcpy(result, tmp, sizeof(result));
}
int i, j, k;
memset(tmp, 0, sizeof(tmp));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
int k;
for(k = 0; k < 2; k++)
{
tmp[i][j] += fib[i][k] * fib[k][j];
}
}
}
memcpy(fib, tmp, sizeof(tmp));
n = n >> 1;
}
return result[0][1];
}
时间复杂度: O(Logn)
相关文章推荐
- Python编程习惯
- python编程之import篇
- 如何在一个创业公司做好架构师
- Oracle-27-集合操作(交集、并集、差集)&子查询之单行子查询
- POJ 【3278】 Catch That Cow
- Android 基本控件的使用四(仿团购底部菜单App)(RadioGroup)
- mysql _error insert
- Hive中文注释乱码问题的解决
- UVa1585 习题3-1
- 通过修改注册表解决——任务管理器禁用问题
- python调用caffe模型进行classify时读入mean文件错误:mean shape incompatible with input shape
- STL迭代器失效问题
- 转: Apache SSI详解及应用
- jquery中prop()方法和attr()方法的区别浅析
- 【福昕PDF阅读器】当前文件兼容于PDFA且以不接受修改的只读模式打开
- strut获取作用对象的两种方式
- UVA_10074_Take the Land
- 面试记录五:腾讯后台研发
- Apache HTTP Server 2.4编译安装及其新特性(四)
- 队列-Implement Queue using Stacks(用栈实现队列)