① 自顶向下的语法分析和自底向上的语法分析解决的核心问题分别是什么
备忘录方法是动态规划方法的变形。与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上的。
如: 求LCS的问题:
当xi=yj时,求C[i,j]只需知道C[i-1,j-1],而无需用到C[i,0]~C[i,j-1]及C[i-1,j]~C[i-1,n]。
∴ 当只需求出一个LCS时,可能有一些C[p,q]在整个求解过程中都不会用到。
一般地,当某个问题可以用动态规划法求解,但二维数组中有相当一部分元素在整个计算中都不会被用到。我们就不需要以递推方式逐个计算二维数组中元素。
而采用备忘录方法:数组中的元素只是在需要计算时才去计算,计算采用递归方式,值计算出来之后将其保存起来以备它用。
如:求LCS的问题:
首先将C[i,0](0≤i≤m)与C[0,j](1≤j≤n)初始化为0。其余m×n个C[i,j]全部初始化为-1。
计算C[i,j]的递归算法LCS_L2(X,Y, i,j,C)(备忘录方法):
若x[i]=y[j],则去检查C[i-1,j-1],若C[i-1,j-1]> -1(已经计算出来),就直接把C[i-1,j-1]+1赋给C[i,j],返回。
若C[i-1,j-1]=-1(尚未计算出来),就递归调用LCS_L2(X,Y, i-1,j-1,C) 计算出C[i-1,j-1],然后再把C[i-1,j-1]+1赋给C[i,j] ,返回。
若x[i] 1 y[j],则要检查C[i-1,j]和C[i,j-1]。
若两者均 > -1(已经计算出来),则把max{ C[i-1,j], C[i,j-1]} 赋给C[i,j],返回。
若C[i-1,j], C[i,j-1] 两者中有一个等于-1(尚未计算出来),或两者均等于-1,就递归调用LCS_L2将其计算出来,然后再把max{ C[i-1,j], C[i,j-1]} 赋给C[i,j]。
∴若有大量的子问题无需求解时,用备忘录方法较省时。
但当无需计算的子问题只有少部分或全部都要计算时,用递推方法比备忘录方法要好(如矩阵连乘,最优二分搜索树)
② 自底向上和自顶向下语法分析方法要解决的核心问题是什么
首先两种程序设计析
自顶向:种主旨给定输入符号串应文始符号根结点发自顶向输入符号串建立棵析树
自底向:种移进-归约种程看作:归约输入符号串文始程换句说析输入符号串始逐步进行归约直至归约文始符号
③ 使用自顶向下方法与自底向上方法分层有何差异,哪些类型的项目能最佳的匹配每种方法
自顶向下方法与自底向上方法分层是两种程序设计的分析方法:
自顶向下:这种方法的主旨是,对给定的输入符号串,从对应文法开始符号的根结点出发,自顶向下地为输入符号串建立一棵分析树。
自底向上:是一种“移进-归约”法。将这种过程看作为:归约一个输入符号串到文法开始的过程。换句话说,这样的分析法是从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。
项目的学习需要持续不断的自顶向下的学习与自底向上的学习。何谓自顶向下的学习,即先着手系统架构,然后逐层进入业务模块,最后进入细粒度功能模块的开发。所谓自底向上的学习,就是先从一行代码,一个Bug,一个模块做起,然后在做一个流程,一个业务模块,最后熟悉整个系统的架构。
自顶向下的学习与自底向上的学习是离不开的,没有自顶向下的学习,你就不能很好的理解业务,在开发过程中就会很被动。没有自底向上的学习,你就不能建立起自己的技术优势,无法去攻坚。在项目初期,通常系统架构师会讲解项目的架构,主要是业务架构。通过了解业务架构,熟悉整个系统的业务,便于在后续系统中根据业务进行开发,这就是所谓的自顶向下的学习。
有时候开发的新项目是自己之前未接触过的类型,在理解项目的业务时,就会有一定的难度,而每一个项目的开发时间又不是那么充裕,所以项目上不会给你那么多的时间来理解系统的业务架构(也包含其它的架构,如逻辑架构等),这时候就需要在项目开发中进行自底向上的学习。如果不是时间特别紧的话,通常会给你一定的时间去了解一个模块,熟悉系统框架之间各层次间的调用。以此为基础点,逐步深入,在开发过程中逐渐熟悉系统的架构。
当我们在开发中以模块为单位开发的乐此不疲时,一定要记得时不时的回头看看我们的系统架构,无论是业务架构,还是逻辑架构,甚至物理架构,这些都是我们深入理解一个项目的基本。如果我们不满足于当前的工作状况,更要记得时时学习系统架构,以整体为单位,进行全面的学习。
无论是作为一名现在的或未来的开发人员或者架构师,我们都不应该止步于当前的学习,时时刻刻切记自顶向下的学习与自底向上的学习是分不开的。自顶向下的学习需要自底向上的学习来完善,自底向上的学习需要自顶向下的学习来指导。
④ 结构化系统分析主要通过什么进行分析
结构化系统分析主要通过处理功能分解进行分析。
结构化系统分析方法是运用系统工程原理于大型软件开发的产物,就是采用“自顶向下,由外到内,逐层分解”的思想对复杂的系统进行分解化简,从而有效地控制了系统分析每一步的难度,并运用数据流图、加工说明和数据字典作为表达工具的一种系统分析技术。
结构化分析一般包括以下工具:数据流图(Data Flow Diagram,DFD)、数据字典、结构化语言、判定表、判定树。在接下来的部分将对它们一一做简单介绍。结构化系统做丛分析方法从总体上来看是一种强粗胡虚烈依赖数据流图的自顶向下的建模方法。它不仅是需求分析技术,也是完成需求规格化的有效技术手段。
采用结构化的思想、系统工程的观点和工程化的方法,按照“自岩燃上而下,逐步求精”的原则,从全局出发,全面规划分析,从而确定简明的、易于导向的系统方式,是管理信息系统建设的主流方法。经过多次逐层分解,每个最底层的问题都是足够简单、容易解决的,于是复杂的问题也就迎刃而解了。这个过程就是分解过程。
⑤ 结构化分析方法
结构化分析方法(Structured Method,结构化方法)是一种软件开发方法,一般利用图形表达用户需求,强调开发方法的结构合理性以及所开发软件的结构合理性。
主要用于分析需求,形成需求规约结构化分析方法是以自顶向下,逐步求精为基点,以一系列经过实践的考验被认为是正确的原理和技术为支撑,以数据流图,数据字典,结构化语言,判定表,判定树等图形表达为主要手段,强调开发方法的结构合理性和系统的结构合理性的软件分析方法。
其基本思想主要是把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内。而它的基本要点是自顶向下、逐步求精、模块化设计、结构化编码。