贪心算法在对问题求解时

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