网站大量收购闲置独家精品文档,联系QQ:2885784924

数据结构与算法Java版课件作者罗文劼第8章节扩展应用举例.pptVIP

数据结构与算法Java版课件作者罗文劼第8章节扩展应用举例.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
尚辅网 / 第8章 扩展应用举例 * 1.教学内容 求最大子段和、表达式树的构造、由等价关系求划分 2.教学目的 理解穷举的思想,能够应用穷举思想设计算法以及进行算法分析的。理解分治策略的思想,以及分治与递归的关系;并能举出在数据结构课程中应用分治策略的算法。理解动态规划策略的思想,以及其求解过程与分治策略的不同之处。理解表达式与二叉树的对应关系;巩固对字符串、栈和二叉树存储和遍历知识的掌握。掌握用树表示集合的方法,理解其便利之处和存在的问题与解决思路。 3.教学重点 穷举法、分治策略和动态规划策略在算法设计中的应用。表达式与二叉树的对应关系。采用树结构表达集合的应用。 4.教学难点 动态规划的策略思想 * 8.1 求最大子段和 问题的描述 给定有n个整数(可能为负整数)组成的序列a1,a2,...,an,求该序列连续的子段和的最大值;如果这个最大值是负整数,则定义其最大子段和为0。即根据下面的公式进行求解。 例如: (a1,a2,a3,a4,a5)=(-5,11,-4,13,-4-2) 最大子段和为11+(-4)+13=20。 * 问题分析与解决 1.数据的存储 这个应用要处理的数据是线性结构,由于要对不确定长度的数据进行求和,因此采用顺序存储比较方便,这里用一维数组List存放数据,每个数据元素为整型。 2.简单穷举法 【算法8-1】简单穷举法求解最大子段和 * 3.改进的穷举法 通过分析,可以看到,从位置i到位置j的子列和等于从位置i到位置j-1的子列和加上List[j],即 * 4.分治法 所谓分治法就是将一个难以解决的问题拆分成若干小问题或规模较小的相同问题,分别解决后原问题便得到解决,即所谓各个击破分而治之。 本问题采用的是类似归并排序的递归算法的拆分方法,简要描述如下。 步骤1:将所给序列List[0]~List[n-1]分为两段List[0]~List[n/2-1]和List[n/2]~List[n-1]; 步骤2:分别递归求得两段的最大子列和MaxLeftSum和MaxRightSum; 步骤3:从中分点分别向左、右两边扫描,找出中间跨分界线的最大子列和MaxMidSum; 步骤4:MaxSum=max{MaxLeftSum,MaxMidSum,MaxRightSum}。 * * 5.动态规划法 动态规划方法是一种自底向上的求解方法,即根据得到的递归式,按照递归返回的顺序计算所要求的值。 从上述基于分治思想的求解分析中可看出,若记 则所求的最大子段和为: 由b[j]的定义知,当b[j-1]0时,b[j]=b[j-1]+a[j],否则b[j]=a[j]。由此可得计算b[j]的动态规划递归式: * * 问题描述 可以用二叉树的形式表示表达式,这样就可以通过对二叉树的遍历完成表达式的计算,那么如何将一串字符构成的算术表达式转换为二叉树形式的存储就是首先要解决的问题。 假设一串字符构成的算术表达式是仅含有二目运算的前缀、中缀和后缀表达式,考虑如何将它们转换成二叉树的表示形式。 8.2 表达式树的构造 * 问题分析与解决 本问题的输入数据是一串字符,在转换过程中,该串字符不需要改变,只需要顺次读取,因此可采用一维字符数组存储。本问题的输出是棵二叉树,二叉树中每个结点的数据域为一个运算对象或运算符。 将顺序存储的前缀表达式转换为表达式的二叉树存储时,需要借助一个栈空间帮助实现,用于暂存构造二叉树存储过程中形成的子树的根结点。 * 1.顺序存储的前缀表达式转换为表达式的二叉树存储 步骤1:读取表达式串的第一个字符。 步骤2:如果当前读入的字符是运算符,则将其作为单个结点构造一棵二叉树,并将这棵二叉树结点压入堆栈。 步骤3:如果当前读入的字符是运算对象,则将其作为单个结点构造一棵二叉树,然后读取栈顶元素,根据如下判断进行处理: 如果当前栈顶元素为运算符结点,则将构造的运算对象结点二叉树入栈; 如果当前栈顶元素为运算对象结点,则弹出栈顶的前两个元素,第二个弹出的结点必为运算符结点,将弹出的第一个结点和构造的结点分别作为运算符结点的左子树和右子树,此时形成了一棵以运算符结点为根的二叉树,再准备将该二叉树的根结点作为运算对象入栈

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档