算法设计与分析复习题目及参考答案(编辑修改稿)内容摘要:

程序的理解; 健壮性:算法应具有容错处理,当输入为非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。 效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执 行过程中所需要的最大存储空间。 一般这两者与问题的规模有关。 经常采用的算法主要有迭代法、分治法、贪婪法、动态规划法、回溯法、分支限界法 6. 迭代法 : 也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。 ,需要做好以下三个方面的工作: 1)、确定迭代 模型。 在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 2)、建立迭代关系式。 所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。 迭代 关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 3)、对迭代过程进行控制。 在什么时候结束迭代过程。 这是编写迭代程序必须考虑的问题。 不能让迭代过程无休止地重复执行下去。 迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。 对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。 是: 将一个规模为 n 的问题分解为 k 个规模较小的子问题,这些子问 题互相独立且与原问题相同。 递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。 : ( 1)该问题的规模缩小到一定的程度就可以容易地解决; ( 2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; ( 3)利用该问题分解出的子问题的解可以合并为该问题的解; ( 4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 分治法的基本步骤 分治法 在每一层递归上都有三个步骤: ( 1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; ( 2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题; ( 3)合并:将各个子问题的解合并为原问题的解。 11. 动态规划的基本思想 前文主要介绍了动态规划的一些理论依据,我们将前文所说的具有明显的阶段划分和状态转移方程的动态规划称为 标准动态规划 ,这种标准动态规划是在研 究多阶段决策问题时推导出来的,具有严格的数学形式,适合用于理论上的分析。 在实际应用中,许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦。 一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决。 动态规划的实质是 分治思想 和 解决冗余 ,因此, 动态规划 是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 由此可知,动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。 贪心法 的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。 因此贪心法自顶向下,一步一步地作出贪心选择; 而分治法中的各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。 不足之处:如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。 解决上述问题的办法是利用动态规划。 该方法主要应用于最优化问题,这类问题会有多种可能的解,每个 解都有一个值,而动态规划找出其中最优(最大或最小)值的解。 若存在若干个取最优值的解的话,它只取其中的一个。 在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。 因此,动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。 动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。 1动态规划算法的基本步骤 设计一个标准的动态规划算法,通常可按以下几个步骤进行: ( 1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。 注意这若干个阶段一定要是有序的或者是可排序的(即无后向性),否则问题就无法用动态规划求解。 ( 2)选择状态:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。 当然,状态的选择要满足无后效性。 ( 3)确定决策并写出状态转移方程:之所 以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。 所以,如果我们确定了决策,状态转移方程也就写出来了。 但事实上,我们常常是反过来做,根据相邻两段的各状态之间的关系来确定决策。 ( 4)写出规划方程(包括边界条件):动态规划的基本方程是规划方程的通用形式化表达式。 一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。 动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。 根据动态规划的基本方程可以直接递归计算最优值 ,但是一般将其改为递推计算。 实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行: ( 1)分析最优解的性质,并刻划其结构特征。 ( 2)递归地定义最优值。 ( 3)以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。 ( 4)根据计算最优值时得到的信息,构造一个最优解。 步骤( 1)~( 3)是动态规划算法的基本步骤。 在只需要求出最优值的情形,步骤( 4)可以省略,若需要求出问题的一个最优解,则必须执行步骤( 4)。 此时,在步骤( 3)中计算最优值时,通常需记录更多的信息,以便在步骤 ( 4)中,根据所记录的信息,快速地构造出一个最优解。 总结: 动态规划实际上就是最优化的问题,是指将原问题的大实例等价于同一最优化问题的较小实例,自底向上的求解最小实例,并将所求解存放起来,存放的结果就是为了准备数据。 与递归相比,递归是不断的调用子程序求解,是自 顶向下的调用和求解。 13. 分治 法与动态规划法的 相同点是: 将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 两者的不同点是 :适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。 而用分治法求解的问 题,经分解得到的子问题往往是互相独立的。 14. 回溯法 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。 当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。 如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。 在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。 扩大当前候选解的规模,以继续试探的过程称为向前试探。 15. 分支限界法: 这是一种用于求解组合优化问题的排除非解的搜索算法。 类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间。 然而与回溯法不同的是,回溯算法使用深度优先方法搜索树结构,而分枝定界一般用宽度优先或最小耗费方法来搜索这些树。 因此,可以很容易比较回溯法与分枝定界法的异同。 相对而言,分枝定界算法的解空间比回溯法大得多,因此当内存容量有限时,回溯法成功的可能性更大。 算法思想: 分枝限界( branch and bound)是另一种系统地搜索解空间的方法,它与回溯法的主要区别在于对 E节点的扩充方式。 每个活节点有且仅有一次机会变成 E节点。 当一个节点变为 E节点时,则生成从该节点移动一步即可到达的所有新节点。 在生成的节点中,抛弃那些不可能导出(最优)可行解的节点,其余节点加入活节点表,然后从表中选择一个节点作为下一个 E节点。 从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过程才结 束。 有两种常用的方法可用来选择下一个 E节点 (虽然也可能存在其他的方法): 1) 先进先出( F I F O) 即从活节点表中取出节点的顺序与加入节点的顺序相同,因此活 节点表的性质与 队列相同。 2) (优先队列)最小耗费或最大收益法在这种模式中,每个节点都有一个对应的耗费或收益。 如果查找 一个具有最小耗费的解,则活节点表可用最小堆来建立,下一个 E节点就是具有最小耗费 的活节点;如果希望搜索一个具有最大收益的解,则可用最大堆来构造活节点表,下一个 E节点是具有最大收益的活节点 16. 分支限界法与回溯法的 相 同 点是: 都是一种在问题的解空间树 T 中搜索问题解的算法。 不同点: ( 1)求解目标不同; ( 2)搜索方式不同; ( 3)对扩展结点的扩展方式不同; ( 4)存储空间的要求不同。 17. 分治法所能解决的问题一般具有的几个特征是 : ( 1)该问题的规模缩小到一定的程度就可以容易地解决; ( 2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 ( 3) 利用该问题分解出的子问题的解可以合并为该问题的解; ( 4) 原问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 18. 用 分支限界法 设计算法的步骤 是: (1)针对所给问题,定义问题的解空间(对解进行编码); (2)确定易于搜索的解空间结构(按树或图组织解) ; (3)以广度优先或以最小耗费( 最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 19. 常见的两种分支限界法 的算法框架 : ( 1)队列式 (FIFO)分支限界法: 按照队列先进先出( FIFO)原则选取下一个节点为扩展节点。 ( 2)优先队列式分。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。