【数据结构(邓俊辉)学习笔记】绪论05——动态规划

news2024/11/26 2:55:16

文章目录

  • 0.前言
  • 1. Fibonacci数应用
    • 1.1 fib():递归
      • 1.1.1 问题与代码
      • 1.1.2 复杂度分析
      • 1.1.3 递归分析
    • 1.2 fib():迭代

0.前言

make it work,make it right,make it fast.
让代码能够不仅正确而且足够高效地运行。

1. Fibonacci数应用

1.1 fib():递归

在这里插入图片描述

1.1.1 问题与代码

上述fib()算法运行地较慢

__int64 fib ( int n ) { //计算Fibonacci数列的第n项(二分递归版):O(2^n)
   return ( 2 > n ) ?
          ( __int64 ) n //若到达递归基,直接取值
          : fib ( n - 1 ) + fib ( n - 2 ); //否则,递归计算前两项,其和即为正解
}

在这里插入图片描述
CPU资源未被占满,进程在满负荷运行,但是依然运行地非常非常慢。

1.1.2 复杂度分析

上述推导看复杂度为指数( 2 n 2^n 2n
估算下
ϕ 43 \phi^{43} ϕ43 = 2 30 2^{30} 230 = 1 0 9 10^{9} 109flo = 1 sec(计算工作量大概可以用10地9次方条基本操作指令来度量,10的9次方就是现在主流计算机主频的cpu在1s中大致能够吞吐的计算量,亦是fib(43)计算大概需要1s)

1.1.3 递归分析

使用第二种手段对上述代码进行分析
在这里插入图片描述
**每个递归实例从原理上来讲只需要计算一次。**诀窍和改进放在也在于此。

1.2 fib():迭代

在这里插入图片描述
方法A:
将Fibonacci数的各项所计算的结果制作成一个表格,将每项计算结果存入表中,每次需要递归实例的时候便可以查表获取。智能屏蔽此次和后续调用。在O(1)时间内返回结果。
方法B:
计算方向为自小而大,自底而上,这样由原来的递归算法改进为迭代型算法,同样可以完成刚才工作。如果比作上楼梯,那么在每个台阶上只需停留一次。

例如fib(5):
f(5) = f(4) + f(3)
f(4) = f(3) + f(2)
f(3) = f(2) + f(1)
f(2) = f(1) + f(0)
f(1) = f(0) + f(-1)
迭代的计算是自底而上,所以是算f(1) f(2) f(3)f(4) f(5)
g = g+f 等同于 f(1) = f(0) + f(-1) 再迭代
g = g+f 等同于 f(2) = f(1) + f(0) ,
这次f(0)是未知的,所以f = g-f就是算出下次迭代的末项f(0)
f(0) = f(1) - f(-1) 等同于 f = g-f

具体的代码分析可以参考Fibonacci数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1626056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch-激活函数与GPU加速

目录 1. sigmod和tanh2. relu3. Leaky Relu4. selu5. softplus6. GPU加速7. 使用GPU加速手写数据训练 1. sigmod和tanh sigmod梯度区间是0~1,当梯度趋近0或者1时会出现梯度弥散的问题。 tanh区间时-1~1,是sigmod经过平移和缩放而…

Golang | Leetcode Golang题解之第50题Pow(x,n)

题目: 题解: func myPow(x float64, n int) float64 {if n > 0 {return quickMul(x, n)}return 1.0 / quickMul(x, -n) }func quickMul(x float64, n int) float64 {if n 0 {return 1}y : quickMul(x, n/2)if n%2 0 {return y * y}return y * y * …

微服务组件-反向代理(Nginx)

微服务组件-反向代理(Nginx) Nginx 基本概念 1、nginx是什么? ①、Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器同时也提供了IMAP/POP3/SMTP服务。它是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器&a…

Linux--内核移植(一)Kernel编译启动

Linux内核编译 编译内核之前需要先在ubuntu上安装lzop库,另外,图形化配置工具还需要ncurses库支持,安装命令为: sudo apt-get install lzop sudo apt-get install build-essential sudo apt-get install libncurses5-dev 在U…

大数据时代的引擎:大数据架构随记

大数据架构通常可以分为以下几层: 一、数据采集层 负责从各种数据源采集、清洗、转换、丰富以及格式化数据,可能包括结构化、半结构化和非结构化的数据。 1.1、常用的技术 在大数据领域,数据采集是一个关键的环节,常用的数据采集…

如何安装sbt(sbt在ubuntu上的安装与配置)(有详细安装网站和图解)

sbt下载官网 选择对应的版本和安装程序 Download | sbt (scala-sbt.org) 安装 解压 将sbt-1.9.0.tgz上传到xshell,并解压 解压: tar -zxvf sbt-1.9.0.tgz 配置 1、在/home/hadoop/sbt中创建sbt脚本 /home/hadoop/sbt 注意要改成自己的地址 cd …

【Linux】详解信号产生的方式

一、kill命令 在命令行中通过kill -数字 pid指令可以给指定进程发送指定信号。这里说明一下几个常见的信号: SIGINT(2号信号):中断信号,通常由用户按下CtrlC产生,用于通知进程终止。SIGQUIT(3号…

小型内衣裤洗衣机哪个牌子好?六大选购锦囊私藏分享

内衣洗衣机是现代家庭必不可少的小家电,它不仅方便快捷,还能够保持衣物清洁和卫生。然而,市场上洗衣机品牌众多,质量和性能参差不齐,使得消费者购买时难以做出选择。那么,小型内衣裤洗衣机哪个牌子好&#…

企业OA管理|基于SprinBoot+vue的企业OA管理系统(源码+数据库+文档)

企业OA管理目录 基于SprinBootvue的企业OA管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员模块的实现 1.1 用户信息管理 1.2 公告信息管理 1.3 客户关系管理 1.4 通讯录管理 2 用户模块的实现 2.1 客户关系添加 2.2 通讯录添加 2.3 日程安排添加 四、…

7-32 说反话-加强版

题目链接:7-32 说反话-加强版 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 str1 input().split(\n)[0] // 按行获取输入 list_str str1.split()[::-1] // 按空格分割为字符串组,然后将字符串组逆序 str1 .join(list_str) //…

LCD液晶显示屏强光老化测试设备太阳光模拟器仪器

1. LCD液晶显示屏老化测试的意义 LCD液晶显示屏老化测试是评估显示屏寿命和性能的重要手段。随着科技的发展,LCD液晶显示屏已经成为我们日常生活中不可或缺的一部分。长期使用后,LCD液晶显示屏可能会出现亮度下降、颜色失真、响应速度变慢等问题。通过进…

已解决java.lang.IllegalThreadStateException: 非法线程状态异常的正确解决方法,亲测有效!!!

已解决java.lang.IllegalThreadStateException: 非法线程状态异常的正确解决方法,亲测有效!!! 目录 问题分析 场景描述 报错原因 解决思路 解决方法 检查线程状态 正确管理线程生命周期 异常处理 总结 博主v&#xff1a…

STM32中断实现旋转编码器计数

系列文章目录 STM32单片机系列专栏 C语言理论和实践总结专栏 文章目录 1. 旋转编码器 2. 中断代码编写 2.1 Interrupt.c 2.2 Interrupt.h 2.3 完整工程文件 1. 旋转编码器 旋转编码器主要用于测量轴的旋转位置、速度或者是角度的变化,它能够将转动的角度或者…

LeetCode57. 插入区间

LeetCode57.插入区间 题目思路: 代码 /* 前置知识&#xff1a; vector<vector<int>> a,b; 二维vector数组是可以将二维中的一维vector数组给push_back的&#xff0c; 不是只有单个元素才可以&#xff0c;整个一维的vector数组也可以 b[0] {1,2,3},b[1] {4,5,6}…

积极应对半导体测试挑战 加速科技助力行业“芯”升级

在全球半导体产业高速发展的今天&#xff0c;中国“芯”正迎来前所未有的发展机遇。AI、5G、物联网、自动驾驶、元宇宙、智慧城市等终端应用方兴未艾&#xff0c;为测试行业带来新的市场规模突破点&#xff0c;成为测试设备未来重要的增量市场。新兴领域芯片产品性能不断提升、…

如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题

&#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e; 文章目录 &#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e;摘要引言正文&#x1f4d8; 识别问题&#x1f4d9; 内存配置调整步骤1: 定位vmoptions文件步骤2: 修改…

企业年度规划:你的未来,我们帮你“画”出来!

亲爱的朋友们&#xff0c;您是不是常常觉得企业运营就像一场没有剧本的戏&#xff0c;时而高歌猛进&#xff0c;时而摸黑前行&#xff1f;别慌&#xff0c;今天我们就来科普一下&#xff0c;如何给企业来一场精心策划的“年度大戏”——年度规划&#xff01; 首先&#xff0c;…

qt实现方框调整

效果 在四周调整 代码 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QWidget>class MainWindow : public QWidget {Q_OBJECT public:explicit MainWindow(QWidget *parent 0);~MainWindow();void paintEvent(QPaintEvent *event);void updateRect();void re…

每年首版次测试报告的要求有哪些?

每年首版次测试报告的要求可能因不同的地区、行业或产品而有所差异&#xff0c;但一般而言&#xff0c;它们通常遵循一些基本的标准和原则。以下是一些常见的首版次测试报告要求&#xff1a; 完整性&#xff1a;测试报告应包含所有必要的测试内容&#xff0c;包括但不限于测试…

git merge 和 git rebese的区别

git merge 和 git rebese的区别 拉取分支和合并代码会涉及两种选择&#xff0c;git merge 和 git rebase&#xff1a; rebase&#xff1a;变基&#xff0c;会有一个干净的分支&#xff0c;但是对于记录来源不够清楚merge&#xff1a;合并&#xff0c;git 分支看起来比较混乱&…