当前位置: 首页 > news >正文

斐波那契的几种思路,你都会吗

文章目录

  • 递归
  • 数组
  • 迭代
  • 矩阵快速幂
  • 对角化(通项)

茴字的四种写法,你都会么?

递归

  • 时间>O(n)
  • 空间O(1)
int fibo(int n){
    if(1==n || 2==n)	return 1;
    return fibo(n-1) + fibo(n-2);
}

数组

  • 时间O(n)
  • 空间O(n)
#define MAXN 100
int fibo(int n){
    int dp[MAXN];
    dp[0] = 0; dp[1] = 1;
    for(int i=2; i<=n; i++){
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
}

迭代

  • 时间O(n)
  • 空间O(1)
int fibo(int n){
    int f1=1, f2=1, f;
    while(n>=3){
        n--;
        f = f1+f2;
        f1 = f2;
        f2 = f;
    }
    return f;
}

矩阵快速幂

  • 时间O(logn)
  • 空间O(1)

已知 x t + 1 = x t + x t − 1 \Large x_{t+1} = x_t + x_{t-1} xt+1=xt+xt1, 令 X t = [ x t − 1 , x t ] T \Large X_t=[x_{t-1}, x_t]^T Xt=[xt1,xt]T, 则有
X t = [ 0 1 1 1 ] X t − 1 = [ 0 1 1 1 ] t − 1 X 1 = [ 0 1 1 1 ] t − 1 [ 0 1 ] \Large X_{t} = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}X_{t-1} =\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}^{t-1}X_1 = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}^{t-1}\begin{bmatrix} 0 \\ 1 \end{bmatrix} Xt= 0111 Xt1= 0111 t1X1= 0111 t1 01

Eigen::Matrtix2f fast_power(Eigen::Matrix2f& mat, int n){
    if(0 == n)	return Eigen::Matrix2x::Identity();
    if(1 == n)	return mat;
    if(n&2) return mat*fast_power(mat, n-1);
    Eigen::Matrix2f tmp = fast_power(mat, n>>1);
    return tmp*tmp;
}

int fibo(int n){
    Eigen::Matrix2f base;
    base << 0, 1, 1, 1;
    Eigen::Matrix2f X1;
    X1 << 0, 1;
    return (int)(fast_power(base, n-1)*X1)[1];
}

对角化(通项)

  • 时间O(1)
  • 空间O(1)

在上式中, 令 A = [ 0 1 1 1 ] \Large A=\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} A= 0111 , 得到两个特征值 λ 1 = 1 + 5 2 , λ 2 = 1 − 5 2 \Large \lambda_1=\frac{1+\sqrt{5}}{2}, \lambda_2=\frac{1-\sqrt{5}}{2} λ1=21+5 ,λ2=215 , 以及对应的特征向量 η 1 = [ 1 1 + 5 2 ] , η 2 = [ 1 1 − 5 2 ] \Large \eta_1=\begin{bmatrix} 1 \\ \frac{1+\sqrt{5}}{2} \end{bmatrix}, \eta_2=\begin{bmatrix} 1 \\ \frac{1-\sqrt{5}}{2} \end{bmatrix} η1= 121+5 ,η2= 1215 . 那么很容易将 A \Large A A对角化:
A = P − 1 Σ P \Large A = P^{-1} \Sigma P A=P1ΣP
其中 β 1 = η 1 ∣ η 1 ∣ , β 2 = η 2 ∣ η 2 ∣ , P = [ β 1 , β 2 ] , Σ = d i a g ( λ 1 , λ 2 ) \Large \beta_1 = \frac{\eta_1}{|\eta_1|}, \beta_2 = \frac{\eta_2}{|\eta_2|}, P = [\beta_1, \beta_2], \Sigma=diag(\lambda_1, \lambda_2) β1=η1η1,β2=η2η2,P=[β1,β2],Σ=diag(λ1,λ2). 这里由于 η 1 , η 2 \Large \eta_1, \eta_2 η1,η2属于不同的特征值,已经能够保证正交,因此不需要额外的正交化.

那么有
A t = ( P − 1 Σ P ) t = P − 1 Σ t P \Large A^{t} = (P^{-1}\Sigma P)^t = P^{-1}\Sigma^t P At=(P1ΣP)t=P1ΣtP
那么前面求 X t \Large X_t Xt也变得简单了
X t = [ 0 1 1 1 ] t − 1 [ 0 1 ] = A t − 1 [ 0 1 ] = P − 1 Σ t − 1 P [ 0 1 ] \Large X_{t} = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}^{t-1}\begin{bmatrix} 0 \\ 1 \end{bmatrix} = A^{t-1}\begin{bmatrix} 0 \\ 1 \end{bmatrix} = P^{-1}\Sigma^{t-1} P \begin{bmatrix} 0 \\ 1 \end{bmatrix} Xt= 0111 t1 01 =At1 01 =P1Σt1P 01
上式中, P \large P P是一个二阶方阵,求逆计算量并不大. Σ \Large \Sigma Σ是一个二阶对角阵, 幂方也只需要给对角线元素幂方即可. 上式的计算量其实并不大.

这里最大的问题是精度损失, 有可能在计算过程中会因为float精度的问题,导致结果转换为int时存在一定的误差.

相关文章:

  • 关于新冠的几点总结
  • 开源项目推荐 | 中科院自动化所历时9年打造的类脑认知智能引擎“智脉”正式开源部署至OpenI启智社区
  • Servlet基础教程 (保姆级教学)
  • vue经历从2.0到3.0更新
  • 安装mysqlclient失败解决办法
  • 华为OD机试真题 Java 实现【单词接龙】
  • Spring boot 日志直接推送到elasticsearch上
  • 网络部署运维实验(pat 端口映射含命令)
  • 软件测试期末复习(二)试题及答案
  • 智能家居创意DIY之智能灯泡
  • Linux——磁盘在网络中共享
  • 【Git】一文带你入门Git分布式版本控制系统(创建合并分支、解决冲突)
  • Spring Boot骚操作-多数据源Service层封装
  • 信贷--------
  • Qt编写雷达模拟仿真工具1-背景布局
  • 【Leetcode】101. 对称二叉树
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【前端学习】-粗谈选择器
  • Cookie 在前端中的实践
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ECMAScript入门(七)--Module语法
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • LeetCode29.两数相除 JavaScript
  • MySQL QA
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 订阅Forge Viewer所有的事件
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 记一次用 NodeJs 实现模拟登录的思路
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 手机端车牌号码键盘的vue组件
  • Android开发者必备:推荐一款助力开发的开源APP
  • Linux权限管理(week1_day5)--技术流ken
  • PostgreSQL之连接数修改
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 我们雇佣了一只大猴子...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​低代码平台的核心价值与优势
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • (11)MSP430F5529 定时器B
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot教学评价 毕业设计 641310
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)关于pipe()的详细解析
  • (转)人的集合论——移山之道
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net 简单实现MD5
  • .net经典笔试题
  • .Net面试题4
  • .net实现客户区延伸至至非客户区
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)