输出fibonacci数列的第n项的各种算法分析

输出fibonacci数列的第n项的各种算法分析

二分递归

cpp 复制代码
#include <iostream>
using namespace std;

long long fib ( int n ) { //计算Fibonacci数列的第n项(二分递归版):O(ϕ^n)
	return ( 2 > n ) ?
		(long long) n //若到达递归基,直接取值
		: fib ( n - 1 ) + fib ( n - 2 ); //否则,递归计算前两项,其和即为正解
}
int main() {
    int n = 32; //n不能太大,否则运行时间会很长
    cout << fib(n);
    return 0;
}

对应的邓公PPT,其中 ϕ = 5 + 1 2 \phi =\frac{\sqrt{5}+1}{2} ϕ=25 +1

记忆化搜索

cpp 复制代码
#include <iostream>
using namespace std;

long long M[90] {0};//n=93时,fibonacci(n)就会导致64位带符号整数溢出.

long long fibonacci(int n){
	if(n < 2){//此时直接return了,可以认为是一种"懒惰抄袭"
		cout << "懒惰抄袭:调用fibonacci" << "(" << n << ")" << endl;
		return n;
	}
	else if(M[n]== 0){
		M[n] = fibonacci(n-1)+ fibonacci(n-2);
		cout << "实际计算:";
	}
	else{
		cout << "懒惰抄袭:";
	}
	cout << "调用fibonacci" << "(" << n << ")" << endl;
	return M[n];
}
int main() {
    int n = 6;
    cout << fibonacci(n);
    return 0;
}

代码运行结果:

对应的邓公PPT:

显然时间复杂度是 O ( n ) O(n) O(n).

动态规划

cpp 复制代码
#include <iostream>
using namespace std;

long long fibI ( int n ) { //计算Fibonacci数列的第n项(迭代版):O(n)
	long long f = 1, g = 0; //初始化:fib(-1)、fib(0)
    while ( 0 < n-- ) { g += f; f = g - f; } //依据原始定义,通过n次加法和减法计算fib(n)
    return g; //返回
}
int main() {
    int n = 6;
    cout << fibI(n);
    return 0;
}

显然时间复杂度是 O ( n ) O(n) O(n).

借助快速幂

cpp 复制代码
#include <iostream>
using namespace std;
//矩阵结构
struct Matrix {
    long long a, b, c, d;
    Matrix(long long a, long long b, long long c, long long d) : a(a), b(b), c(c), d(d) {}
};
//矩阵乘法
Matrix multiply(const Matrix& m1, const Matrix& m2) {
    return Matrix(m1.a * m2.a + m1.b * m2.c, m1.a * m2.b + m1.b * m2.d,
                  m1.c * m2.a + m1.d * m2.c, m1.c * m2.b + m1.d * m2.d);
}
//矩阵的快速幂算法
Matrix matrixPower(const Matrix& base, int n) {
    if (n == 0) return Matrix(1, 0, 0, 1); // 单位矩阵
    Matrix half = matrixPower(base, n >> 1);
    Matrix result = multiply(half, half);
    if (n & 1) result = multiply(result, base);
    return result;
}

long long fibonacci(int n){
	Matrix base(0, 1, 1, 1);
	return matrixPower(base, n).b;
}

int main() {
    int n = 64;
    cout << fibonacci(64);
    return 0;
}

由于矩阵的快速幂算法复杂度是 O ( log ⁡ n ) O(\log n) O(logn),故此算法时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

新威考研助你上岸

相关推荐
ysa0510305 分钟前
虚拟位置映射(标签鸽
数据结构·c++·笔记·算法
Yue丶越10 分钟前
【C语言】深入理解指针(二)
c语言·开发语言·数据结构·算法·排序算法
m0_7482480215 分钟前
C++中的位运算符:与、或、异或详解
java·c++·算法
沐浴露z17 分钟前
详解【限流算法】:令牌桶、漏桶、计算器算法及Java实现
java·算法·限流算法
王哈哈^_^39 分钟前
【完整源码+数据集】草莓数据集,yolov8草莓成熟度检测数据集 3207 张,草莓成熟度数据集,目标检测草莓识别算法系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
油泼辣子多加1 小时前
【实战】自然语言处理--长文本分类(3)HAN算法
算法·自然语言处理·分类
Shinom1ya_1 小时前
算法 day 46
数据结构·算法
夏鹏今天学习了吗2 小时前
【LeetCode热题100(64/100)】搜索旋转排序数组
算法·leetcode·职场和发展
2301_796512522 小时前
Rust编程学习 - 问号运算符会return一个Result 类型,但是如何使用main函数中使用问号运算符
开发语言·学习·算法·rust
小龙报3 小时前
算法通关指南:数据结构和算法篇 --- 队列相关算法题》--- 1. 【模板】队列,2. 机器翻译
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio