算法设计与分析期末复习(二)

news/2024/5/9 21:11:23/文章来源:https://blog.csdn.net/Caramel_biscuit/article/details/128281315

动态规划

基本思想:把求解的问题分成许多阶段或多个子问题,然后按顺序求解各个子问题。**前一个子问题的解为后一个子问题的求解提供了有用的信息。**在求解任何一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它局部解,依次解决各子问题,最后一个子问题就是问题的解。

对于一个多阶段过程问题,最优策略是否存在,不仅依赖于该问题是否有最优子结构性质,而能否采取动态规划的方法,还要看该问题的子问题是否具有重叠性质。
最优子结构性质:原问题的最优解包含了其子问题的最优解。
子问题重叠性质:每次产生的子问题并不总是新问题,有些子问题被反复计算多次。

动态规划基本步骤

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

矩阵连乘问题

  • 穷举法
  • 动态规划法
    将矩阵连乘积Ai Ai+1Aj,简记为A[i:j],i≤j,考虑计算A[i:j]的最优计算次序。
for(int *p,int n,int **t,int **s){for(int i = 1; i <= n; i++) m[i][i] = 0;for(int r = 2; r<= n; r++){for(int i=1; i <= n-r+1; i++){int j = i+r-1;m[i][j] = m[i][i] + m[i+1][j] + p[i-1]*p[i]*p[j];s[i][j] = i;for(int k=i+1; k < j; k++){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;}}}}
}

算法的计算时间上界O(n3),所占用的空间为O(n2)

最长公共子序列

由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系,用c[i][j]记录最长公共子序列的长度。
当i=0或j=0时,空序列是A和B的最长公共子序列。因此C[i][j]=0。
在这里插入图片描述
由于在所考虑的子问题空间中,总有θ(mn)个不同的子问题,因此用动态规划自底向上计算最优值能提高算法的效率。

void LCSLength(int m,int n,char *x,char *y,int **c,int **b){int i,j;for(i=1; i<=m; i++)	c[i][0]=0;for(i=1; i<=n; i++) c[0][i]=0;for(i=1; i<=m; i++){for(j=1; j<=n; j++){if(x[i]==y[j]){c[i][j] = x[i-1][j-1] + 1;b[i][j] = 1;}else if(c[i-1][j] >= c[i][j-1]){c[i][j] = c[i-1][j];b[i][j] = 2;}else{c[i][j] = c[i][j-1];b[i][j] = 3;}}}
}

构造最长公共子序列

void LCS(int i,int j,char *x,int **b){if(i==0 || j==0) return;if(b[i][j] == 1){LCS(i-1,j-1,x,b);printf("%d ",x[i]);}else if(b[i][j] == 2){LCS(i-1,j,x,b);}else{LCS(i,j-1,x,b);}
}

根据序列x,y,建立两个(m+1)x(n+1)的二维表C和二维表B,分别存放搜索过程中得到的子序列的长度和状态。
在这里插入图片描述
在这里插入图片描述

动态规划求解0-1背包问题

在这里插入图片描述
令V(i,j)表示前i个物品,能够装入容量为j的背包中的物品最大值。
V(i,0) = 0; 背包容量为0
V(0,j) = 0; 没有物品

  • 如果当前物品i重量大于背包容量wi>j,V(i,j) = V(i-1,j);
  • 如果当前物品重量小于等于背包容量wi≤j,V(i,j) = max{V(i-1,j) , V(i-1,j-wi)+vi};
void KnapSack(int n,int w[],int v[][]){int i,j;for(i=0; i<=n; i++)	v[i][0] = 0;for(j=0; j<=c; j++) v[0][j] = 0;for(i=1; i<=n; i++){for(j=1; j<=c; j++){if(w[i] > j){v[i][j] = v[i-1][j];}else{v[i][j] = max{v[i-1][j] , v[i-1][j-w[i]]+v[i]};}}}// 求装入背包的物品j = c;for(i=n;i>=0;i--){if(v[i][j] > v[i-1][j]){x[i] = 1;j = j - w[i];}else{x[i] = 0;}}return v[n][c];
}

贪心算法

贪心算法总是做出在当前看来最好的选择,即所作的选择是局部最优解。
希望从局部的最优解得到整体最优解
采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的策略(在一定的标准下)。决策一旦做出,就不可以再更改。

贪心算法求解问题的基本要素

  • 最优子结构性质:原问题的最优解包含了子问题的最优解。
  • 贪心选择性质:原问题的最优解可以由一系列局部最优的选择来获得。

贪心算法与动态规划算法之间的差异

  • 相同点:都具有最优子结构性质
  • 区别:动态规划算法每步所做出的选择往往依赖于相关子问题的解,只有解除相关子问题才能做出选择。 贪心算法仅在当前状态下做出最好选择,即局部最优选择,但不依赖于子问题的解。
  • 贪心:自顶向下
  • 动态规划:自底向上

活动安排问题

已知n个活动E={1,2,…,n}要求使用同一资源,第k个活动要求的开始时间和结束时间为sk和fk,其中sk<fk,活动k与活动j相容,sk≥fj或sj≥fk
活动安排问题就是在所给的活动集合中选出最大的相容活动子集。

基本思路
在安排时将结束时间早的活动尽量往前安排,好给后面的活动安排留出更多的空间,从而达到安排最多活动的目标。
贪心准则:在未安排的活动中挑选结束时间最早的活动安排

首先将安排的11个活动的开始时间和结束时间按结束时间的非减次序列排序:
在这里插入图片描述
在这里插入图片描述

各活动的开始时间和结束时间已经按结束时间的非减序排列了。
public static void greedySelector(int s[], int f[], bool a[]){int n = s.length - 1;a[0] = true;int j = 0; //已经安排的最后一个活动int count = 1;for(int i=1; i<=n; i++){if(s[i] >= f[j]){a[i] = true;j = i;count++;}else{a[i] = false;}}return count;
}

0-1背包问题不能用贪心算法求解,因为0-1背包问题无法保证最终能将背包装满,部分闲置的背包空间使单位背包空间的价值降低了。

用贪心算法解决背包问题

在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包。
在这里插入图片描述
用贪心算法解决背包问题的基本思想:

  1. 计算每种物品单位重量的价值vi/wi,然后依贪心选择策略,尽可能多的将单位重量价值最高的物品装入背包。若这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直进行下去,直到使背包装满为止,若最后一个物品不能全部装入,仅装其一部分即可。
void Knapsack(int n, float M,float v[], float w[], float x[]){sort(n,v,w);//将物品按单位重量价值排序int i;for(i=1; i<=n; i++) x[i] = 0;float c = M;for(i=1; i<=n; i++){if(w[i] > c){break;}x[i] = 1;c = c-w[i];}if(i<=n){x[i] = c/w[i];}
}

该算法的主要计算时间在于将各种物品依此按单位重量价值从大到小排序,因此算法的计算时间上界为O(nlogn)

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

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

相关文章

通过xfsdump和xfsrestore命令实现RHEL7 xfs文件系统误删除文件的恢复

在linux系统中&#xff0c;我们有时会“不小心”误删除一些文件&#xff0c;如果是自己是测试环境服务器可能“无所谓”。但是一旦发生在客户的生产环境&#xff0c;那就是“重大安全事故”。 我们能不能提前对一些重要的文件系统进行备份&#xff0c;以便当我们真的误删除一些…

chatgpt赋能python:Python程序员必知的Geany配置技巧

Python程序员必知的Geany配置技巧 如果你是一名Python程序员&#xff0c;并且正在寻找一个简单易用的代码编辑器&#xff0c;那么Geany是一个非常不错的选择。Geany是一款轻量级的集成开发环境&#xff08;IDE&#xff09;&#xff0c;除了Python&#xff0c;还支持许多其他编…

PRL:上海交大张文涛团队实现量子材料相关突破

来源&#xff1a;上海交通大学 近期&#xff0c;上海交通大学物理与天文学院张文涛研究组利用自行研制的高能量和高时间分辨率角分辨光电子能谱系统对量子材料1T-TiSe₂电子结构进行了超快激光操控研究。利用超快光激发与电荷密度波相有关的相干声子&#xff0c;引起晶格内原子…

【教程】两种免费更新iOS17测试版的方法

苹果iOS17系统已经发布&#xff0c;目前所有用户都可以免费注册成为开发者&#xff0c;升级iOS17开发者测试版 注意&#xff0c;现在不是通过描述文件来更新系统了&#xff0c;给大家带来两种更新升级方法&#xff0c;看下文操作 方法一 苹果官网注册 按照下图发消息“更新” …

Leetcode刷题笔记--Hot01-10

1--两数之和 讲解参考&#xff1a;LeetCode 最热门 100 题 主要思路&#xff1a; 对数组进行从小到大的排序&#xff0c;使用两个指针指向第一个元素和最后一个元素&#xff0c;即左指针指向第一个元素A[l]&#xff0c;右指针指向最后一个元素A[R]&#xff1b; 判断两个指针当前…

chatgpt赋能python:Python安装gym:入门指南

Python安装gym: 入门指南 如果您是一位正在学习强化学习的学生&#xff0c;或者是一位研究者、开发人员&#xff0c;那么您一定会对OpenAI出品的gym库感兴趣。该库为编写和比较强化学习算法提供了一组标准环境。但是&#xff0c;在使用gym之前&#xff0c;您需要将其安装到您的…

聊聊那些奇葩的代码规范 —— 所有 IntelliJ 的警告必须要处理

因为有些要求感觉实是太过奇葩&#xff0c;收集下来娱乐下大家。 代码规范要求 如果代码在 IntelliJ 出现了警告提示&#xff0c;所有的警告必须要在提交之前处理完成&#xff0c;否则 PR 合并全部被拒绝&#xff0c;不管有些警告是不是有点奇葩&#xff0c; 同时&#xff0…

智能路由器开发之创建一个procd init脚本示例

智能路由器开发之创建一个procd init脚本示例 Procd init脚本默认提供了许多好用的功能&#xff0c;例如重启策略和能够从UCI系统中存储和读取配置。 设置 举个例子&#xff0c;假设我们想创建一个作为服务的Shell脚本&#xff0c;并且这个服务可以通过消息和超时时间进行配…

chatgpt赋能python:Python定义未知变量的方法及注意事项

Python定义未知变量的方法及注意事项 在Python编程中&#xff0c;我们经常需要定义变量来存储数据&#xff0c;但有时候我们需要先创建一个变量&#xff0c;但不想立即给它赋值&#xff0c;或者我们想定义一个未知变量。本文将介绍Python中定义未知变量的方法及注意事项。 什…

chatgpt赋能python:Python安装和打开教程

Python安装和打开教程 Python作为一种高效、灵活、易学易用的编程语言&#xff0c;越来越受到广大程序员的青睐&#xff0c;越来越多的人想要学习Python。在学习Python之前&#xff0c;首先要进行Python的安装和打开。那么&#xff0c;本篇文章将为您介绍如何安装和打开Python…

READ-自动驾驶大场景神经渲染

这是一个针对自动驾驶场景的神经渲染方案&#xff0c;提出了一种大规模神经渲染方法来合成自动驾驶场景&#xff08;READ&#xff09;&#xff0c;这使得通过各种采样方案在PC上合成大规模驾驶场景成为可能。 疑问&#xff1a;文中提到基于nerf的方法和神经渲染方法&#xff0…

BOOST 恒压控制驱动芯片,外围电路简单

应用说明 Hi8000 是一款外围电路简单的 BOOST 升压恒压控制驱动芯片&#xff0c;适用于 2.7-40V 输入电压范围的升压恒压电源应用领域&#xff0c;启动电压可以低至 2.5V&#xff0c;可以广泛应用 于太阳能、便携式数码产品&#xff0c;锂电升压应用等供电领域。 应用领域 移…

第六十七天学习记录:对陈正冲编著《C 语言深度解剖》中关于变量命名规则的学习

最近开始在阅读陈正冲编著的《C 语言深度解剖》&#xff0c;还没读到十分之一就感觉收获颇多。其中印象比较深刻的是其中的变量的命名规则。 里面提到的不允许使用拼音正是我有时候会犯的错。 因为在以往的工作中&#xff0c;偶尔会遇到时间紧迫的情况。 而对于新增加的变量不知…

无条件抽奖和条件抽奖(互动功能发起端JS-SDK)

无条件抽奖功能概述 允许开始前对抽奖进行奖品、中奖人数、中奖人员等设置&#xff0c;完成设置后可以开始抽奖。 本功能只支持讲师、嘉宾、助教、管理员这四种角色进行抽奖的发起和停止。支持自定义设置中奖用户信息采集字段。支持设置预设中奖用户。支持设置定时开奖可查看…

java设计模式(十六)命令模式

目录 定义模式结构角色职责代码实现适用场景优缺点 定义 命令模式&#xff08;Command Pattern&#xff09; 又叫动作模式或事务模式。指的是将一个请求封装成一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开&#xff0c;然后可以使用不同的请求把客户端参数化&a…

【SpinalHDL快速入门】4.6、复合类型之Vec

文章目录 1.1、描述1.2、声明1.2.1、实例 1.3、运算符1.3.1、比较&#xff08;Comparison&#xff09;1.3.2、类型转换&#xff08;Type cast&#xff09;1.3.3、杂项&#xff08;Misc&#xff09;1.3.4、Lib辅助函数&#xff08;Lib helper functions&#xff09; 1.1、描述 …

2023/6/6总结

CSS 如果想要实现背景颜色渐变效果&#xff1a; left是从左边开始&#xff0c;如果想要对角线比如&#xff0c;左上角就是left top&#xff0c;渐变效果始终是沿着一条线来实现的。 下面是跟着视频教学用flex布局写的一个移动端网页&#xff1a; html代码&#xff1a; <!…

Day_42哈希表

目录 一. 关于哈希表 二. 如何实现哈希表 1. 散列函数 2. 散列表 3. 散列函数的构造方法 4. 处理冲突的方法 三. 代码实现 1. 构造函数构造哈希表 2. 哈希表的查找 四. 代码展示 五. 数据测试​编辑 六. 总结 一. 关于哈希表 在前面介绍的线性表的查找中,记录在表中的位置…

kali 2023.2安装、换源、更新、SSH

kali2023版本已经更新了&#xff0c;为了体验新版&#xff0c;下载试用了一下。记录初始的安装过程&#xff0c;以备复习用&#xff0c;不足之处欢迎批评指正。 一、下载 1、官网下载&#xff0c;地址&#xff1a;https://www.kali.org/&#xff0c;因为我准备在VM虚拟机中使用…

二叉搜索树(Binary Seach Tree)模拟实现

目录 二叉搜索树的性质 二叉搜索树的实现 结点类 接口类(BSTree) 二叉搜索树的插入(insert) 二叉搜索树的查找(find) 二叉搜索树删除(erase) 第二种、删除的结点右子树为空 第三种、删除的结点左子树为空 第四种、删除的结点左右都不为空 实现 二叉搜索树模拟实现代…