【算法与设计】期末总结

文章目录

  • 第一章 概述
    • 算法与程序
    • 时间复杂性
    • 求上界
  • 第二章 递归与分治
    • 双递归函数——Ackerman函数
    • 分治策略
      • 大整数乘法
        • 两位×两位
        • 四位x四位
      • 三位x三位
        • 两位x六位
  • 第三章 动态规划
    • 矩阵连乘
    • 基本要素
      • 最优子结构
      • 子问题重叠
    • 备忘录
  • 第四章 贪心算法
    • 活动安排问题
    • 基本要素
      • 贪心选择性质
      • 最优子结构性质
      • 与动态规划的区别
    • 背包问题
      • 物体可分
      • 物体不可分
  • 第五章 回溯法
    • **问题的解空间**
    • 0-1背包
    • 迭代回溯
    • 0-1背包问题(树结构)
  • 期末考点

第一章 概述

算法与程序

算法:解决问题的一种方式或者一种过程。算法有若干个指令组成的有穷序列。
程序:算法用某种程序设计语言的具体实现

算法的4种性质:

  • 输入
  • 输出
  • 确定性
  • 有限性

程序可以不满足“有限性”

时间复杂性

算法复杂度的高低体现在运行该算法所需要的计算机资源的多少上。资源的多少依赖于要解决问题的规模(N)、算法的输入(I)和算法本身的函数(A)

关于时间复杂性,分为三种情况:最坏情况、最好情况和平均情况。
可操作性最好且最有实际价值的是最坏情况的时间复杂度

求上界

当N>=N0时有f(N)<=Cg(N),称为函数f(N)的一个上界是Cg(N),记作f(N)=O(g(N))
这个上界的阶越低,则评估越精确,结果越有价值

如何求上界?
1.把f(N)函数中的所有阶放大到最高阶,合并后并记为Cg(N)
2.此时f(N)<=Cg(N),把这两个函数去化简即可得条件,即n值。

例子:f(n)=3n2+10n
最高阶是n2,所有阶放大到最高阶得3n2+10n2=13n2,记为Cg(N)
此时,C=13,g(N)=n2
当3n2+10n <= 3n2+10n2时,即10n <= 10n2时,条件成立。
故n0>=1
综上,当n0=1时,C=13,f(n)=O(n2)

注意:放大方向不变,方式可以改变(即可以增大阶层且缩小系数),如3n2+10n <= 3n2+n2,此时结果的C和n0都不一样,但f(n)始终一样。

第二章 递归与分治

递归:代码效率好,但是空间效率和时间效率差

如何改进??
消除递归,有两种方式:阶乘(循环)和阶加(循环、通项公式)

双递归函数——Ackerman函数

定义:一个函数及它的一个变量由函数自身定义时

分治策略

基本思想:将问题分解为k个小规模的子问题,这些子问题相互独立且原问题相同。递归地解这些子问题,将个子问题的解合并得到原问题的解。

大整数乘法

普通乘法的时间复杂度是O(n2)
通过分支策略可达到O(n1.59)

两位×两位

步骤:
1.两位数分出高低位
2.套用公式求p,q,r

遇到负数,高低位都带符号
如-23:高位-2,低位-2。至此,-23=(-2)*10+(-3)

最简的分治(递归出口):一位x一位

四位x四位

一直递归,直到满足出口

三位x三位

往前补0,公式不变

两位x六位

补零或者把六位拆成3个两位

第三章 动态规划

动态规划分治
分解子问题分解子问题
子问题相互依赖子问题相互独立

基本思想:
分解成子问题求解时,有些子问题被重复计算许多次。用一个记录所有已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量的重复计算。

步骤:
1.找到最优解,刻画其结构性质
2.递归地定义最优值
3.以自底向上的方式计算最优值
4.根据计算最优值时得到的信息,构造最优解

矩阵连乘

题目背景:
若两矩阵相乘,需满足第一矩阵的行=第二矩阵的列
即Amxn X Bpxq的条件为n==p
此时,乘法次数为=m x n x q

连乘次序会影响乘法次数

按照上述步骤:
1.最优解及其结构性质:最小乘法次数 及 最小乘法次数的断开处
记A[i:j]是AiAi+1…Aj
问题:A[1:n],可以在k=1,2,⋯n−1处断开,若A[1:n]最优,则A[1:k]与A[k+1:n]也最优

2.建立递归关系
记A[i:j],其中1≤i≤j≤n,最少乘法次数记m[i][j]
(1)当i=j时→ A[i:i] →指A[i] 本身→乘法次数为0,即 m[i][j]=0
(2)当i<j时, 在k处断开, k可以取值i, i+1, ∙∙∙, j−1,在某k处乘法次数最少

在这里插入图片描述
定义数组p存储矩阵信息
p[0]为第1矩阵的行
p[1]为第1矩阵列(也为第2矩阵行)
p[2]为第2矩阵列(也为第3矩阵行)
p[3]为第3矩阵列(也为第4矩阵行)

p[n]为第n矩阵列

3.计算最优值
对于结果的存储,使用m表存储最小乘法次数(即最优值),用s表存储k值(即最优解)

代码实现:

//构造最优值
void MatrixChain(int *p, int n, int **m, int **s)//P一维数组记下标;n矩阵个数;m表;s记分段
{for(int i=1;i<=n;i++)m[i][i]=0;//对角线上都填0for(int r=2;r<=n;r++)//在m表中,从第2条填到第n条(对角线)for(int i=1;i<=n-r+1;i++)//i是行下标,从第1行开始填一个倒三角的表{int j=i+r-1;//列下标m[i][j]=0+m[i+1][j]+p[i-1]*p[i]*p[j];//实现递归计算,先初始化第1项,省略了m[i][i]s[i][j]=i;//s记分段点,此为s的初值for(int k=i+1;k<j;k++)//递归式从k=i+1到j-1,找最小{int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];//递归式计算 if(t<m[i][j]){m[i][j]=t;//记入最小值s[i][j]=k;//记入划分位置}}}
}

4.构造最优解
算法MatrixChain只是计算出了最优值,并未给出最优解。但是MatrixChain已记录了构造最优解所需要的全部信息。s[i][j]中的数表明,最佳方式应在矩阵的何处断开。

//构造最优解
void Traceback(int i,int j,int **s)//求A[i:j]的最优解构造,利用s[][],设已知s[i][j]=k
{if(i==j)return ;//A[i:i]不必构造,递归出口Traceback(i,s[i][j],s);//求A[i:k]的构造,记1Traceback(s[i][j]+1,j,s);//求A[k+1:j]的构造,记2cout<<"Multiply A["<<i<<":"<<s[i][j]<<"]and A["<<(s[i][j]+1)<<":"<<j<<"]"<<endl;//输出Ai,k And Ak+1,j,表明在k处断开,记3
}

基本要素

最优子结构

设计动态规划算法的第一步通常是要刻画最优解的结构。
当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。

子问题重叠

在用递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。

备忘录

动态规划的变形——备忘录

动态规划:保存所有子问题的解
变形:动态规划是自底向上;备忘录是自顶向下

第四章 贪心算法

工作量:贪心算法 < 动态规划
但是贪心算法的结果可能不是最优结果,因为贪心算法并不是从整体最优上加以考虑,它所做出的选择只是某种意义上的局部最优选择

所以,贪心算法的关键是贪心策略的选择

活动安排问题

该问题要求高效地安排一系列争用某一个公共资源的活动。有n个活动,开始和结束的时间si≤fi,如何安排最多个活动?

贪心策略:按结束时间递增排序,从前向后能安排则安排

例题:当前有4个活动。

i1234
s[i]1305
f[i]4567

若选择最早结束优先,能使选入活动最多
若最早开始优先,仅能安排这一个活动
若最短占用优先,则能安排这一个活动

推广:
假设要在足够多的的会场里安排一批活动,即每个活动都要被安排,并希望使用尽可能少的会场。
(1)贪心策略思路1:先在第1会场安排最多活动,其次在第2会场安排最多,……,依此类推 。
(2)贪心策略思路2:视为区间重叠问题。时间点:起点和终点。
按时间点排序起点分配1个会场,终点回收,保证此会场可重复利用
在这里插入图片描述
在这里插入图片描述

基本要素

贪心选择性质

贪心选择性质是指所求问题的整体最优解是可以通过局部最优的选择,即贪心选择达到的。
动态规划算法中,每步所做的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能做出选择。
而在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择。然后再去解做出这个选择后产生的相应子问题。

最优子结构性质

最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

与动态规划的区别

**贪心算法:**先依据贪心策略选择并解一个子问题,再进行下一步。
**动态规划算法:**先解决所有的子问题,比较得出一个最优子问题,再进行下一步。

背包问题

问题描述:容量为c的背包,有n种物品,每种物品重w_i,价值为v_i,其中1≤i≤n,
物品不可(可以)分开。
问:如何装入使价值最大?

cnw1w2w3v1v2v3
50310203060100120

物体可分

c>0,wi>0,vi>0,1≤i≤n。找(x1,x2,⋯,xn),0≤xi≤1,可为分数,即仅取一部分,
使 ∑ i = 1 n w i ∗ x i < = c \sum_{i=1}^{n} wi*xi<= c i=1nwixi<=c 达到最大
∑ i = 1 n v i ∗ x i \sum_{i=1}^{n} vi*xi i=1nvixi

//物品可分:贪心算法 
#include <iostream>
#include <iomanip> 
using namespace std;void Knapsack(int n, int c, int*v, int *w, double *x);int main() 
{	int n=3;//物品数量 int c=50;//背包容量 int *v=new int[n+1];//价值 int *w=new int[n+1];//重量 int i;double *x=new double[n+1];	for(i=1;i<=n;i++)x[i]=0;	//将数据按贪心策略排序 v[1]=60;v[2]=100;v[3]=120;w[1]=10;w[2]=20;w[3]=30;Knapsack(n,c,v,w,x); for(i=1;i<=n;i++){		if(x[i]>0)cout<<"物品"<<i<<"装入"<<setiosflags(ios::fixed)<<setprecision(2)<<x[i]<<endl;elsecout<<"物品"<<i<<"不装入"<<endl;}return 0;
}void Knapsack(int n, int c, int*v, int *w, double *x)
{int i;for(i=1;i<=n;i++){if(w[i]>c)break;else{x[i]=1;c=c-w[i]; }			}	if(i<=n)	x[i]=(double)c/w[i];		
}

step1:准备
按单位价格递减排序,x[ ]初值为0,先都没选
step2:循环
按递减装入物品至不可装为止,从1检查到n
物品装入置x[i]=1,c=c−w[i]
step3:最后
将当前i物品分开,送入c/w[i]

物体不可分

其中,c>0,wi>0,vi>0,1≤i≤n,
找(x1,x2,⋯,xn),xi∈{0,1},
(物品没装xi=0,装入xi=1)
使 ∑ i = 1 n w i ∗ x i < = c \sum_{i=1}^{n} wi*xi<= c i=1nwixi<=c 达到最大
∑ i = 1 n v i ∗ x i \sum_{i=1}^{n} vi*xi i=1nvixi

根据上述步骤:
1.最优子结构性质
若(y_1,y_2,⋯,y_n)是最优解,则(y_2,⋯,y_n)是子问题的最优解

2.递归关系
m(i,j)记背包容量j,可选物品为i,i+1,⋯,n时,0-1背包问题的最优解
在这里插入图片描述
3.计算最优值

template <class Type>
void Knapsack(Type *v, int *w, int n, Type **m)
{int jMax=min(w[n]-1,c);//找<w[n]的临界值,并避免物品n比背包容量还要大的情况 //最小子问题,填写最后一行m[n][j] for(int j=0;j<=jMax;j++)m[n][j]=0;for(int j=w[n];j<=c;j++)m[n][j]=v[n];for(int i=n-1;i>1;i--){jMax=min(w[i]-1,c);for(int j=0;j<=jMax;j++)m[i][j]=m[i+1][j];//物品i装不进去for(int j=w[i];j<=c;j++)m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);//能装但不装,装进去,两个值中取较大值 }//填最后一行 m[1][c]=m[2][c];//若物品1装不进去 if(c>=w[1])//若物品1可以装 m[1][c]=max(m[2][c],m[2][c-w[1]]+v[1]); 
}
 step1:实现递归出口,填矩阵m的第n行(前3行)step2:循环,实现递归式,填矩阵m的第(n−1)行到第2行step3:填m[1][c]

4.构造最优解

template <class Type>
void Traceback(Type **m, int *w, int c, int n, int *x)//m表已经填好,已知w、c、n,输出x[],0不装,1装入
{for(int i=1;i<n;i++){if(m[i][c]==m[i+1][c])x[i]=0;//相同则不装else{x[i]=1;c-=w[i];}}x[n]=(m[n][c])?1:0;		}

第五章 回溯法

溯法有“通用的解题法”之称。
用它可以系统地搜索一个问题的所有解或任意解
它在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该点为根的子树的搜索,逐层向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。

问题的解空间

 用回溯法解问题时,应明确定义问题的解空间。
指包含解的“集合”,结构常为树或者图。
问题的解空间至少应包含问题的一个(最优)解。

0-1背包

迭代回溯

有两种方案:
第一种是保存所有子集
第二种是添加剪枝函数

3个状态:左子树、右子树、回溯
在左、右子树添加约束函数、限界函数

两种剪枝函数:
约束函数:在扩展结点处剪去不满足约束的子树;
限界函数:剪去得不到最优解的子树。

0-1背包问题(树结构)

期末考点

1.熟练求出上界的n0,C,g(N)
2.清楚Ackerman函数的代码实现
3.熟练掌握大整数相乘的p,q,r;掌握其求解过程
4.清楚大整数乘法的代码实现,尤其是递归出口
5.掌握动态规划中0-1背包的代码实现、m表、s表、及其求最优值的解
6.在动态规划中0-1背包的代码中,可能会考察代码填空,变量的各阶段的值
7.掌握备忘录代码的具体实现
8.回溯法中的旅行售货员内容 及 整本书的定义内容不会考察。

掌握的意思是必考清楚代表可能重点考察

期末在头歌上考,有代码填空及代码分析两种题型

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

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

相关文章

pg表空间和mysql表空间的区别

一、表空间的定义 1、在pg中表空间实际上是为表指定一个存储的目录。并且在创建数据库时可以为数据库指定默认的表空间。创建表和索引时可以指定表空间&#xff0c;这样表和索引就可以存储到表空间对应的目录下了。 在pg中一个库中可以有多个表空间&#xff0c;一个表空间可以…

6月17(信息差)

1.马斯克最新预测&#xff1a;未来不再需要手机 将被脑机芯片替代 当地时间6月17日&#xff0c;马斯克高仿号“Not Elon Musk”发帖称&#xff1a;“你会在你的大脑上安装一个Neuralink接口&#xff0c;让你通过思考来控制你的新X手机吗&#xff1f;”对此&#xff0c;马斯克本…

yolov10--C#接口

一、前言 本章主要讲解yolov10的C#接口&#xff0c;主要是使用微软开发的openvinocsharp工具加载yolov10模型&#xff0c;并做推理。 二、yolov10模型转换 这里为了演示&#xff0c;使用官方yolov10m模型&#xff08;其他大小的模型同理&#xff09;做演示&#xff0c;可从下方…

游戏服务器研究一:bigworld 开源代码的编译与运行

1. 前言 bigworld 已经开源了它的代码&#xff0c;而我对于大世界的 scale 很感兴趣&#xff0c;所以就尝试把代码跑起来研究。但是&#xff0c;整个过程比我原先预想的复杂得多。 虽然能找到一些官方的帮助文档&#xff0c;但这些文档要么过旧&#xff0c;要么过于详尽&…

【护眼知识】护眼台灯真的有用吗?带你看台灯怎么选对眼睛好

在数字化时代&#xff0c;我们的眼睛无疑承受着前所未有的压力。无论是长时间盯着电脑屏幕&#xff0c;还是沉浸在书本的海洋中&#xff0c;眼睛的健康都成为了我们不容忽视的问题。中国现有约500万盲人&#xff0c;占总人口的0.4%&#xff0c;是世界上盲和视力损伤严重的国家之…

浏览器加速播放视频技巧

当我们看网页中的视频时&#xff0c;想加速播放&#xff0c;但是选项最高只能2倍速时&#xff0c;还想再加快播放如何操作&#xff1f; 此时我们可以按F12打开浏览器开发者选项&#xff0c;然后点击控制台&#xff0c;在浏览器输入如下代码&#xff1a; document.querySelecto…

月薪没到20K,必啃的WebGIS系统技术栈,你练到哪一步了?

WebGIS&#xff08;网络地理信息系统&#xff09;是目前地理信息系统&#xff08;GIS&#xff09;开发的主流&#xff0c;它利用互联网技术来发布、共享和交互地理空间数据。 一个完整的WebGIS项目通常涉及以下几个主要环节&#xff1a;具备一定的理论知识&#xff0c;数据生产…

MAGs培养有线索了?宏组学中未培养微生物表型与培养条件预测

宏基因组测序技术让人们对地球上微生物的多样性有了更深入的了解&#xff0c;但分离培养是研究微生物的生理代谢功能并解析其生态作用的关键。2023年11月的世界微生物数据中心&#xff08;WDCM&#xff09;年会中&#xff0c;全面启动了全球“未培养微生物培养组”计划&#xf…

毕业回家寄大量衣服裤子省钱技巧分享

很多宝子们问我&#xff0c;怎么寄快递更加便宜划算&#xff0c;特别是当你有很多的衣服裤子这类型的衣物的时候&#xff0c;怎么寄件最便宜。 今天分享几个寄快递的省钱方法以及经验分享。 1、惠发快递 像寄包裹快递&#xff0c;可以找快递平台进行下单&#xff0c;这样会更…

【机器学习300问】124、什么是LSTM?LSTM的基本结构是怎样的?

长短期记忆网络&#xff08;LSTM&#xff09;是一种解决隐变量模型长期信息保存和短期输入缺失问题的方法&#xff0c;有趣的是&#xff0c;长短期记忆网络的设计比门控循环单元稍微复杂一些&#xff0c; 却比门控循环单元早诞生了近20年。 一、什么是LSTM&#xff1f; LSMT全…

M41T00串行实时时钟-国产兼容RS4C1339

RS4C1340是一种实时时钟&#xff08;RTC&#xff09;/日历&#xff0c;与ST M41T00引脚兼容&#xff0c;功能等效&#xff0c;包括软件时钟校准。该器件还提供VBAT引脚上的涓流充电能力、较低的计时电压和振荡器STOP标志。寄存器映射的块访问与ST设备相同。涓流充电器和标志需要…

vue+springboot导入Excel表格

1.创建一个excel表格,与数据库需要的表头对应 2.(前端)导入excel的按钮 <template class"importExcel"><el-button type"primary" click"chooseFile">导入<i class"el-icon-upload el-icon--right"></i><…

短路是怎么形成的

1. 短路分为电源短路和用电器短路。 电源短路&#xff1a;电流不经过任何用电器&#xff0c;直接由正极经过导线流向负极&#xff0c;由于电源内阻很小&#xff0c;导致短路电流很大&#xff0c;特别容易烧坏电源。 用电器短路&#xff1a;也叫部分电路短路&#xff0c;即一根…

利用AI云防护实现高效负载均衡

在当今高度数字化的世界里&#xff0c;保证网站和应用的高可用性和响应速度对企业的业务连续性和用户体验至关重要。传统的负载均衡技术虽然能够分发流量&#xff0c;但在面对突发流量、DDoS攻击或资源动态调整时往往力不从心。本文将探讨如何借助AI云防护服务&#xff0c;不仅…

搭贝低代码开发平台:高效、灵活、经济的软件开发解决方案

在当今快速发展的数字化时代&#xff0c;企业对于快速、灵活且成本效益高的软件开发需求日益增长。搭贝低代码开发平台以其强大的功能和用户友好的体验&#xff0c;正在成为众多企业&#xff0c;特别是中小企业&#xff0c;软件开发的首选工具。 &#x1f4c8; 什么是低代码开发…

中力股份注册获批复:“重营销轻研发”明显,屡屡因违规被罚

《港湾商业观察》施子夫 王璐 冲刺上交所主板即将满两年&#xff0c;浙江中力机械股份有限公司&#xff08;以下简称&#xff0c;中力股份&#xff09;于4月24日宣布&#xff0c;首次公开发行股票的注册申请已获证监会同意。 不出意外的话&#xff0c;预计不久的数月内中力股…

电子期刊制作秘籍:如何让你的出版物脱颖而出?

​如何让你的电子期刊在众多出版物中脱颖而出&#xff0c;吸引读者的目光呢&#xff1f;在微信公众号这个平台上&#xff0c;让你的电子期刊内容更具吸引力、专业性和创新性&#xff0c;是至关重要的。下面&#xff0c;我将教你制作电子期刊一些方法&#xff0c;助你打造出一本…

【Pepper机器人开发与应用】二、Pepper机器人图形化开发:医疗服务机器人程序设计

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f4d1;上期文章&#xff1a;『【Pepper机器人开发与应用】一、教你如何使用图形化开发软件高效开发pepper机器人&#xff08;Pepper SDK for LabVIEW&#xff09…

卷积神经网络 convolution neural network

1.数学卷积&#xff1a;滑动窗口 2.图像具有局部相关性和平移不变性&#xff0c;有许多冗余的特征点&#xff0c;如果用全连接的神经网络会很浪费时间。 3.卷积nn&#xff1a;减少参数&#xff0c;滑动提取特征&#xff0c;特征作为下层卷积的输入&#xff0c;然后放到全连接…

VM4.3 二次开发03 小技巧

VM4.3 二次开发03 小技巧 1.查看SDK帮助文档。 SDK帮助文档路径&#xff1a;安装目录下的路径&#xff0c;注意自己安装时的盘符&#xff0c;我是安装在D盘的。 D:\Program Files\VisionMaster4.3.0\Development\V4.x\Documentations\CH 示例程序目录 D:\Program Files\Visi…