O(logN)求斐波那契数列第N项:动态规划、矩阵分治

2023-10-29

logN求Fibonacci数列第N项

  • 斐波那契数列通项公式 F ( i ) = F ( i − 1 ) + F ( i − 2 ) F(i)=F(i-1)+F(i-2) F(i)=F(i1)+F(i2)
  • 以下介绍两种复杂度为 O ( l o g N ) O(logN) O(logN)的算法
  • 两种方法思想类似

1. 动态规划

  • 当我们尝试将 F ( i − 1 ) F(i-1) F(i1) F ( i − 2 ) F(i-2) F(i2)进行继续拆解时(始终保持两项),发现两项的系数始终是斐波那契数列中的某一相邻两项
  • 因此,F(i)一定可以可以由4个项组成
    • F ( i ) = F ( i − a ) F ( i − x ) + F ( i − b ) F ( i − ( x − 1 ) ) F(i)=F(i-a)F(i-x)+F(i-b)F(i-(x-1)) F(i)=F(ia)F(ix)+F(ib)F(i(x1))
    • a = 0 a=0 a=0时则为 F ( i ) = F ( 2 ) F ( i − 1 ) + F ( 1 ) F ( i − 2 ) F(i)=F(2)F(i-1)+F(1)F(i-2) F(i)=F(2)F(i1)+F(1)F(i2)
    • 且a,b,x具有一定关系

思路

a,b,x有多种可能
此时需要算4个小项才能合并到1个大项
若这4个项中有相同的项,则可以简化计算
此外,越大的项,计算的复杂度越大,反之越小

因此我们可以想到取 i / 2 i/2 i/2 附近的项

  • 通过递推得(也可以用较小的 i i i找找规律)
    • i i i为奇数时, F ( i ) = F 2 ( i / 2 + 1 ) + F 2 ( i / 2 ) F(i)=F^2(i/2+1)+F^2(i/2) F(i)=F2(i/2+1)+F2(i/2)
    • i i i为偶数时, F ( i ) = F ( i / 2 + 1 ) ∗ F ( i / 2 ) + F ( i / 2 ) ∗ F ( i / 2 − 1 ) F(i)=F(i/2+1)*F(i/2)+F(i/2)*F(i/2-1) F(i)=F(i/2+1)F(i/2)+F(i/2)F(i/21)

即我们将一个递推项分成2或3项分别计算后再合并

  • 可以分析复杂度为 O ( l o g N ) O(logN) O(logN)
  • :在实际程序实现中,不能直接return F(i/2+1)*F(i/2)+F(i/2)*F(i/2-1),这样会造成计算冗余
  • 应该先保存下结果,计算后return

DP代码

int Fibonacci(int x) // logN
{
    if (x == 1 || x == 2) return 1;
    if (x % 2 != 0)
    {
        int F1 = Fibonacci(x / 2 + 1), F2 = Fibonacci(x / 2);
        return F1 * F1 + F2 * F2;
    }
    else
    {
        int F1 = Fibonacci(x / 2 + 1), F2 = Fibonacci(x / 2), F3 = Fibonacci(x / 2 - 1);
        return F1 * F2 + F2 * F3;
    }
}

2. 矩阵分治

  • 结合矩阵的知识,我们可以知道斐波那契数列符合
  • 于是随着等号右边中的斐波那契项的项数 i i i降低,该矩阵就不断左乘

因此可以基于矩阵结合律计算若干项矩阵乘积,再左乘 F ( 1 ) a n d F ( 2 ) F(1) and F(2) F(1)andF(2)

  • 设该矩阵为A
  • A n = A n / 2 ∗ A n / 2 A^n=A^{n/2}*A^{n/2} An=An/2An/2
  • 其中 A n / 2 A^{n/2} An/2只需计算一项
  • 依次类推

这就是快速幂的思想

快速幂讲解

代码

int[2][2] Matrix(int x)
{
    int a[2][2] = { { 1, 1 }, { 0, 1 } };
    if (x == 1) return a;
    int b[2][2] = Matrix(x / 2);
    if (x % 2 == 0) return b * b; // 省略矩阵乘法
    return b * b * a;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

O(logN)求斐波那契数列第N项:动态规划、矩阵分治 的相关文章

  • 飞猪平台用户行为分析—python

    文章目录 一 项目背景 1 1数据来源 1 2数据介绍 二 分析目的 三 分析思路 四 数据分析 3 1数据清洗 3 2用户分析 3 2 1用户维度 3 2 1 1浏览量pv 访客量uv 成交量分析 3 2 1 2留存分析 3 2 1 3用
  • 执行命令定义时出错_深入浅出SDC clock定义(下)

    前情提要 前面两次分别和大家一起学习了SDC的整体框架组成和clock定义的一部分内容 如果想要查看可以点击下方蓝色链接 从中可以看出 所有SDC构成中最基本的就是clock的定义 它作为所有SDC的基础 贯穿到几乎所有SDC指令当中 并且
  • 区块链学习笔记(3)--交易机制与双花

    比特币的交易机制 如何交易 一位所有者 A 利用他的私钥对前一次交易T1和下一位所有者 B 的地址签署一个随机散列的数字签名 A将此数据签名制作为交易单T2 并将交易单T2广播全网 电子 货币就发送给了下一位所有者 要点 1 交易发起者的私

随机推荐

  • Android面试常见问题总结

    1 AsyncTask是什么 有什么缺陷 AsyncTask是一种轻量级的异步任务类 它可以在线程池中执行后台任务 然后把执行的进度和最终结果传递给主线程并在主线程中更新UI 多个AsyncTask对象是串行执行的 Android 1 5刚
  • 2的n次方对照表和二进制、十进制的互相转换

    2的1次方 2 2的2次方 4 2的3次方 8 2的4次方 16 2的5次方 32 2的6次方 64 2的7次方 128 2的8次方 256 2的9次方 512 2的10次方 1024 这里我介绍二进制和十进制快速的转换方法 例1 137
  • 深度学习图像分割学习路径

    深 度 学 习 图 像 分 割 学
  • 见证国内人工智能与机器人技术的进步

    随着新一代人工智能与机器人技术的不断进步 人工智能与机器人技术已上升为国家十四五规划首要发展的科技技术 同时 亦是引领新一轮科技革命和产业变革的战略性技术 具有溢出带动性的 头雁 效应 人工智能与机器人专业是与 物联网 互联网 高新技术产业
  • LeetCode-1487. Making File Names Unique

    Given an array of strings names of size n You will create n folders in your file system such that at the ith minute you
  • 这张互联网支付牌照被正式注销!

    本应出现在年初续展结果中的支付机构百联优力 北京 投资有限公司 简称 百联优力 的支付牌照于2月10日被正式注销 注销原因为不予续展 2月15日 中国人民银行官网公示的 已注销许可 页面再添三家支付机构名单 分别为江苏飞银商务智能科技有限公
  • 国内IT公司病的有多重?技术圈交际花谈软件研发管理怪现状

    虎嗅注 在创业过程中 研发管理是很重要的内容 但是国内创业公司的研发管理却长期处于一种比较混乱的状态 国内创业公司的研发管理到底出了什么问题 技术人攻略的Gracia采访了素有 技术圈交际花兼娱记 称号的程显峰 从程显峰的口中 我们可以了解
  • STL之unique_copy

    template
  • App 和设备通过蓝牙连接收发数据

    一 Android 中进行蓝牙开发需要用到的类和执行过程 1 使用BluetoothAdapter startLeScance来扫描设备 2 在扫描到设备的回调函数中的得到BluetoothDevice 对象 并使用Bluetooth st
  • java基础之static关键字修饰变量、方法

    我们一般想要调用某个类中的属性或者行为 方法 就需要创建一个类的对象才能去做这个事情 static修饰变量 class Chinese String name int age public static void main String a
  • RPM中国镜像

    Les RPM de Remi Packages 提供Fedora RHEL 各版本的兼容包 DAG Apt Yum RPM package 除提供RHEL Fedora兼容rpm包外 还有提供Apt版本 Sohu com Open Sou
  • 使用python编写基于UDP协议的通讯程序,实现简单的回声功能(附代码)

    基于UDP的网络程序 UDP User Datagram Protocol 是一种面向无连接的 不可靠的传输协议 其不需要像 TCP 一样进行握手和维护连接状态 UDP 在发送数据时不会确保数据能够到达接收方 也不会对数据进行排序和重传 相
  • 华为支持升级鸿蒙os的机型2020,华为支持升级鸿蒙os的机型有哪些?

    支持升级鸿蒙os机型有 华为P40 华为P40Pro 华为P40Pro 华为Mate 30 5G 华为Mate30 Pro 华为Mate 30 Pro 5G能主华为Mate30 RS 华为MatePad Pro 华为MatePad Pro
  • 读写分离三节点集群环境搭建

    文章目录 0 环境检查 1 数据准备 2 配置主库 配置文件 启动主库 设置OGUID 修改数据库模式 3 配置备库01 配置文件 启动备库 设置OGUID 修改数据库模式 4 配置备库02 配置文件 启动备库 设置OGUID 修改数据库模
  • 【测试开发】web 自动化测试 --- selenium4

    目录 1 什么是自动化为什么要做自动化 2 为什么选择selenium作为我使用的web自动化工具 3 什么是驱动 驱动的工作原理是什么 5 第一个自动化程序演示 6 selenium基本语法 6 1 定位元素的方法 6 2 操作页面元素
  • 技术赋能-混流编排功能,助力京东618直播重保

    每每到618 双11这样的大型活动的时候 每天都有几个重要的大v或者品牌直播需要保障 以往的重点场次监播方式是这么造的 对每路直播的源流 各档转码流分别起一个ffplay播放窗口 再手动调整尺寸在显示器桌面进行布局 排到一屏里来监播 这样做
  • android 12.0 设置app为默认浏览器

    1 概述 在12 0 的产品定制化中 如果系统安装多个浏览器时 需要设置默认浏览器来完成需求 这就需要看系统设置中的相关源码 当出现多个浏览器时 该如何设置默认浏览器呢 其实在Settings 默认应用 gt 浏览器应用 当点击选择浏览器时
  • 基于深度学习的低光照图像增强

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 之前在做光照对于高层视觉任务的影响的相关工作 看了不少基于深度学习的低光照增强 low light enhancement 的文章 3 4 5 7 8 9 10 于是决定
  • python题库刷题训练软件

    刷题软件 文末有联系方式 注明来意 1 下列叙述中正确的是 A 数据库系统减少了数据冗余 B 经规范化后的数据库系统避免了一切冗余 C 数据库系统中数据的一致性是指数据类型一致 D 数据库系统比文件系统能管理更多的数据 数据库系统的数据具有
  • O(logN)求斐波那契数列第N项:动态规划、矩阵分治

    logN求Fibonacci数列第N项 斐波那契数列通项公式 F i F i