使用递归算法的思路分析问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如第三层的1只能走第四层 的3或1
问能否找到一条路径,使 得路径上的权值之和最大 ?
贪心法求解的算法设计
使用文件保存三角形的层数和所有数据
描述一个n层的三角形,需要(n*(n+1))/2个 数据和一个描述层次的数据;
使用二维数组a[],保存数字三角形的所有 数据
二维数组的大小为N*N,当然,其中有一半的 元素为空值0;
(3.8)
0-1背包问题求解
设有物件n项,重量为w(5,3,2), 价值v(9,7,8),如果背包 只能装5斤,求可以放背包的物品最大价值。
使用回溯算法,决策树的建树过程为:深度有限,左侧优 先,左侧分支不取东西,右侧取当前物件
i:红色,表示物品的编号 aw:绿色,当前可用空间 V:蓝色,当前物品价值
省去了为寻找最优解要穷尽所有可能而必须耗 费的大量时间
采用自顶向下,以迭代的方法做出相关的贪 心选择
每做一次贪心选择就将所求问题简化为一个规 模更小的子问题
贪心算法的特点
通过每一步贪心选择,可得到问题的一个局 部最优解
但由此得到的全局解却不一定都是是最优的
求解数字三角形
有任意一个数字三角形, 只能自第一层(顶层)向下 行走,且只能走下接的相 邻两个结点
Maxvalue是一个递归实现的子程序,其中 的主要传递参数如下:
w: 项目物体的重量数组 v: 项目物体的价值数组 length_of(w): 重量数组的长度,也是最后
一个物件下标,遍历循环的开始点,直到第一 个元素 max_weight:背包的最大容量 x:最后的返回值,即背包中物体的价值
分治法的分(Divide)是指将较大的问题划分 为若干个较小的问题,然后用递归法求解子问 题;
分治法的治(Conquer)是指从小问题的解来 构建大问题的解
分治策略
分治法算法中至少包含有两次递归过程, 只有一个递归过程的算法在严格意义上不 能算作分治算法
求用分治法进行幂运算降序求解
在公钥加密的RSA算法中将高次幂运算转换 为低次幂运算可以加快加密和解密的计算 过程,从而提高了RSA算法的运算速度
算法一:采用递推循环的方式实现类似 a**b的计算过程;
算法二:采用递归方式实现分治算法: a**b= (a*a)**(b/2) b=偶数 a**b= a*(a**(b-1)) b=奇数
分治法的计算效率
以求520为例,使用分治方法与不使用分治 方法的递归算法比较,分治法可以节省近 三分之二时间
第3章 基本算法和策略 PART B
《可视化计算》
基本策略
算法设计过程中,发现问题、分析问题及 解决问题的思路、步骤与其他学科中的方 法是一致的,就是寻找规律
计算机科学家在算法研究过程中总结了一 些具有普遍意义的算法策略和一些可循的 规律,能够帮助我们较快地找到算法
基本策略
贪心策略 分治策略 回溯策略 动态规划 将递归算法转成非递归实现
分治方法乘幂运算流程图
回溯策略
如果问题的规模(数量)是按指数速度增 加的,那么这些算法的能力将受到一定的 限制
在这种情况下,回溯法(Backtracking) 也许是一个更好的选择
回溯法也叫穷尽搜索法(Brute-Force Search ),其基本思想是尝试分步地去解决一个问题
0-1背包问题的数学描述
动态规划
计算Fibonacci数列的第n项:当项数大于2 时,F(n)=F(n-1)+F(n-2)
如果计算Fibonacci数列第n项,这需要计 算从第3项到第n-1项
随着n值的增大,递归解法的算法时间复杂性 会按几何级数增长
这类问题的关键是子问题(sub-problem )有重叠,因而分治法并不适合于此类问 题的求解
动态规划
基本思想是:如果一个较大问题可以被分 源自文库为若干个子问题,并且子问题有重叠, 那么,可以将每个子问题的解存放到一个 表中,然后通过查表来解决问题,减少不 必要的重复计算
动态规划是20世纪50年代美国数学家Richard Bellman提出的
素的顺序,但元组中的元素有严格的顺序 规定
在0-1背包问题中的决策树中的元素和重量 为w(5,3,2), 价值v(9,7,8),皆为三元组
k元组的概念在下一章的有限状态机和图灵 机中还会用到
0-1背包回溯算法的main子图
建议测试案例从简单的方案开始
0-1背包问题-回溯法求解流程图
0-1背包回溯算法说明
贪心策略
贪心算法在对问题求解时,总是做出在当 前看来是最好的选择,因此它仅仅是某种 意义上的局部最优解
但在相当广泛范围内,对许多问题它能产 生整体最优解或者是整体最优解的近似解
“鼠目寸光” 是对贪心算法的最好描述
贪心算法的特点
以当前情况为基础根据某个偏好原则作最 优选择,而不考虑各种可能的整体情况
(3,5,0)
(2,5,0) (1,5,0) (1,2,7)
(2,3,8) (1,0,15)
(1,3,8)
(-,2,7)(-,-3,16)
(-,5,0)(-,0,9)
(-,3,8) (-,-2,17)
k元组的概念
元组(tuple)是一种有穷序列,k个元素的序 列称为k元组。与集合不同,集合不考虑元
现有n种物品,对1<=i<=n,已知第i种物 品的重量为正整数Wi,价值为正整数Vi, 背包能承受的最大载重量为正整数W
现要求找出这n种物品的一个子集,使得子
集中物品的总重量不超过W且总价值尽量
大
n
wi xi
W
i1
xi {0,1}(1 i n)
(3.7)
n
max vi xi i 1
贪心法求解的算法设计
使用line,colum 两个变量在二维数组中 ,作为数字定位的指针;
x作为保存权值累计的变量; line的值同时用来控制路径行走的循环
流程图
分治策略
分治法(Divide and Conquer)的基本 思想是,将一个较大规模的问题分解为若 干个较小规模的子问题,找出子问题的解 ,然后把各个子问题的解合并,从而得到整 个问题的解
问能否找到一条路径,使 得路径上的权值之和最大 ?
贪心法求解的算法设计
使用文件保存三角形的层数和所有数据
描述一个n层的三角形,需要(n*(n+1))/2个 数据和一个描述层次的数据;
使用二维数组a[],保存数字三角形的所有 数据
二维数组的大小为N*N,当然,其中有一半的 元素为空值0;
(3.8)
0-1背包问题求解
设有物件n项,重量为w(5,3,2), 价值v(9,7,8),如果背包 只能装5斤,求可以放背包的物品最大价值。
使用回溯算法,决策树的建树过程为:深度有限,左侧优 先,左侧分支不取东西,右侧取当前物件
i:红色,表示物品的编号 aw:绿色,当前可用空间 V:蓝色,当前物品价值
省去了为寻找最优解要穷尽所有可能而必须耗 费的大量时间
采用自顶向下,以迭代的方法做出相关的贪 心选择
每做一次贪心选择就将所求问题简化为一个规 模更小的子问题
贪心算法的特点
通过每一步贪心选择,可得到问题的一个局 部最优解
但由此得到的全局解却不一定都是是最优的
求解数字三角形
有任意一个数字三角形, 只能自第一层(顶层)向下 行走,且只能走下接的相 邻两个结点
Maxvalue是一个递归实现的子程序,其中 的主要传递参数如下:
w: 项目物体的重量数组 v: 项目物体的价值数组 length_of(w): 重量数组的长度,也是最后
一个物件下标,遍历循环的开始点,直到第一 个元素 max_weight:背包的最大容量 x:最后的返回值,即背包中物体的价值
分治法的分(Divide)是指将较大的问题划分 为若干个较小的问题,然后用递归法求解子问 题;
分治法的治(Conquer)是指从小问题的解来 构建大问题的解
分治策略
分治法算法中至少包含有两次递归过程, 只有一个递归过程的算法在严格意义上不 能算作分治算法
求用分治法进行幂运算降序求解
在公钥加密的RSA算法中将高次幂运算转换 为低次幂运算可以加快加密和解密的计算 过程,从而提高了RSA算法的运算速度
算法一:采用递推循环的方式实现类似 a**b的计算过程;
算法二:采用递归方式实现分治算法: a**b= (a*a)**(b/2) b=偶数 a**b= a*(a**(b-1)) b=奇数
分治法的计算效率
以求520为例,使用分治方法与不使用分治 方法的递归算法比较,分治法可以节省近 三分之二时间
第3章 基本算法和策略 PART B
《可视化计算》
基本策略
算法设计过程中,发现问题、分析问题及 解决问题的思路、步骤与其他学科中的方 法是一致的,就是寻找规律
计算机科学家在算法研究过程中总结了一 些具有普遍意义的算法策略和一些可循的 规律,能够帮助我们较快地找到算法
基本策略
贪心策略 分治策略 回溯策略 动态规划 将递归算法转成非递归实现
分治方法乘幂运算流程图
回溯策略
如果问题的规模(数量)是按指数速度增 加的,那么这些算法的能力将受到一定的 限制
在这种情况下,回溯法(Backtracking) 也许是一个更好的选择
回溯法也叫穷尽搜索法(Brute-Force Search ),其基本思想是尝试分步地去解决一个问题
0-1背包问题的数学描述
动态规划
计算Fibonacci数列的第n项:当项数大于2 时,F(n)=F(n-1)+F(n-2)
如果计算Fibonacci数列第n项,这需要计 算从第3项到第n-1项
随着n值的增大,递归解法的算法时间复杂性 会按几何级数增长
这类问题的关键是子问题(sub-problem )有重叠,因而分治法并不适合于此类问 题的求解
动态规划
基本思想是:如果一个较大问题可以被分 源自文库为若干个子问题,并且子问题有重叠, 那么,可以将每个子问题的解存放到一个 表中,然后通过查表来解决问题,减少不 必要的重复计算
动态规划是20世纪50年代美国数学家Richard Bellman提出的
素的顺序,但元组中的元素有严格的顺序 规定
在0-1背包问题中的决策树中的元素和重量 为w(5,3,2), 价值v(9,7,8),皆为三元组
k元组的概念在下一章的有限状态机和图灵 机中还会用到
0-1背包回溯算法的main子图
建议测试案例从简单的方案开始
0-1背包问题-回溯法求解流程图
0-1背包回溯算法说明
贪心策略
贪心算法在对问题求解时,总是做出在当 前看来是最好的选择,因此它仅仅是某种 意义上的局部最优解
但在相当广泛范围内,对许多问题它能产 生整体最优解或者是整体最优解的近似解
“鼠目寸光” 是对贪心算法的最好描述
贪心算法的特点
以当前情况为基础根据某个偏好原则作最 优选择,而不考虑各种可能的整体情况
(3,5,0)
(2,5,0) (1,5,0) (1,2,7)
(2,3,8) (1,0,15)
(1,3,8)
(-,2,7)(-,-3,16)
(-,5,0)(-,0,9)
(-,3,8) (-,-2,17)
k元组的概念
元组(tuple)是一种有穷序列,k个元素的序 列称为k元组。与集合不同,集合不考虑元
现有n种物品,对1<=i<=n,已知第i种物 品的重量为正整数Wi,价值为正整数Vi, 背包能承受的最大载重量为正整数W
现要求找出这n种物品的一个子集,使得子
集中物品的总重量不超过W且总价值尽量
大
n
wi xi
W
i1
xi {0,1}(1 i n)
(3.7)
n
max vi xi i 1
贪心法求解的算法设计
使用line,colum 两个变量在二维数组中 ,作为数字定位的指针;
x作为保存权值累计的变量; line的值同时用来控制路径行走的循环
流程图
分治策略
分治法(Divide and Conquer)的基本 思想是,将一个较大规模的问题分解为若 干个较小规模的子问题,找出子问题的解 ,然后把各个子问题的解合并,从而得到整 个问题的解