ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:90.12KB ,
资源ID:12572283      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12572283.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机算法设计与分析期末试题4套.docx)为本站会员(b****0)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机算法设计与分析期末试题4套.docx

1、计算机算法设计与分析期末试题4套(1)用计算机求解问题的步骤: 1问题分析2、数学模型建立3、算法设计与选择4、算法指标5、算法分析6、算法实现7、 程序调试8、结果整理文档编制(2) 算法定义:算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程(3) 算法的三要素1操作2、控制结构3、数据结构算法具有以下5个属性:有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。确定性:算法中每一条指令必须有确切的含义。 不存在二义性。只有一个入口和一个出口可行性:一个算法是可行的就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。输入:一个算法有零个

2、或多个输入,这些输入取自于某个特定对象的集合。 输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。算法设计的质量指标:正确性:算法应满足具体问题的需求;可读性:算法应该好读,以有利于读者对程序的理解;健壮性:算法应具有容错处理, 当输入为非法数据时,算法应对其作出反应, 而不是产生莫名其妙的输出结果。效率与存储量需求:效率指的是算法执行的时间; 存储量需求指算法执行过程中所需要的最大存储空间。一般这两者与问题的规模有关。经常采用的算法主要有迭代法、分而治之法、贪婪法、动态规划法、回溯法、分支限界法迭代法 也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方 法。利用

3、迭代算法解决问题,需要做好以下三个方面的工作:一、 确定迭代模型。在可以用迭代算法解决的问题中, 至少存在一个直接或 间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。二、 建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下 一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以 使用递推或倒推的方法来完成。三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必 须考虑的问题。不能让迭代过程无休止地重复执行下去。 迭代过程的控制通常可 分为两种情况:一种是所需的迭代次数是个确定的值, 可以计算出来;另一种是 所需的迭代次数无法确定。对于前一种情况,

4、可以构建一个固定次数的循环来实 现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的 条件。编写计算斐波那契(Fibonacci)数列的第n项函数fib (n)斐波那契数列为:0、1、1、2、3、,即: fib(O)=O;fib(1)=1;fib(n)=fib(n-1)+fib(n-2) (当 n1 时)。写成递归函数有:int fib(i nt n) if (n=0) retur n 0;if (n=1) retur n 1;if (n 1) return fib( n-1)+fib( n-2);一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始, 每月新生

5、一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到 第12个月时,该饲养场共有兔子多少只?分析:这是一个典型的递推问题。我们不妨假设第1个月时兔子的只数为 u 1 ,第2个月时兔子的只数为u 2 ,第3个月时兔子的只数为u 3, 根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有x=1for i=2 to 12 y=x*2 x=y n ext i print yendu 1 = 1 , u2 = u 1 + u 1 X 1 = 2 , u3 = u 2 + u 2 X 1 = 4,根据这个规律,可以归纳出下面的递 推公式:u n= u n 1 X 2 (n 2)对应u

6、 n和u n 1 ,定义两 个迭代变量y和x,可将上面的递 推公式转换成如下迭代关系:y=x*2x=y让计算机对这个迭代关系重复执 行11次,就可以算出第12个月时 的兔子数。参考程序如下:cis分而治之法1、分治法的基本思想任何一个可以用计算机求解的问题所需的计算时间都与其规模 N有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于 n个元素的排序问题,当 n=1时,不需任何计算; n=2时,只要作一次比较即可排好序; n=3时只要作3次比较即可,。而当 n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。分治法的设计思想是, 将一个难以

7、直接解决的大问题, 分割成一些规模较小的相同问题,以便各个击破,分而治之。分治法所能解决的问题一般具有以下几个特征:(1)该问题的规模缩小到一定的程度就可以容易地解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结 构性质;(3)禾9用该问题分解出的子问题的解可以合并为该问题的解;(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共 的子子问题。3、分治法的基本步骤分治法在每一层递归上都有三个步骤:(1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同 的子问题;(2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子 问题;(3

8、)合并:将各个子问题的解合并为原问题的解。快速排序在这种方法中, n个元素被分成三段(组):左段I e f t,右段r i g h t和中段m i d d l e。中段仅包含一个元素。左段中各元素都小于等于中段元素, 右段中各元素都大于等于中段元素。因此I e f t和r i g h t中的元素可以独立排序, 并且不必对I e f t和r i g h t的排序结果进行合 并。m i d d I e中的元素被称为支点(p i v o t )。图1 4 - 9中给出了快速排序的伪代码。/ /使用快速排序方法对 a 0 :n- 1 排序从a 0 :n- 1 中选择一个元素作为 m i d d l e

9、,该元素为支点把余下的元素分割为两段 left和r i g h t,使得I e f t中的元素都小于等于支点, 而right中的元素都大于等于支点递归地使用快速排序方法对 left进行排序递归地使用快速排序方法对 right进行排序所得结果为 I e f t + m i d d I e + r i g h t考察元素序列4,8,3,7 , 1 , 5,6,2 。假设选择元素6作为支点,则6位于m i d d I e ; 4, 3, 1, 5, 2位于I e f t ; 8, 7位于r i g h t。当left排好序后,所得结果为 1, 2, 3, 4,5;当r i g h t排好序后,所得结

10、果为 7, 8。把right中的元素放在支点元素之后, I e f t中的元素放在支点元素之前,即可得到最终的结果 1 , 2,3,4,5,6,7,8 。把元素序列划分为I e f t、m i d d I e和r i g h t可以就地进行(见程序 1 4 - 6 )。在程序1 4 - 6中,支点总是取位置1中的元素。也可以采用其他选择方式来提高排序性能,本章稍 后部分将给出这样一种选择。程序14-6快速排序templatevoid QuickSort(T*a, i nt n)/对a0:n-1进行快速排序/要求an必需有最大关键值 quickSort(a, 0, n-1);templatevo

11、id quickSort(T a, i nt l, i nt r)/ 排序 a l : r , ar+1有大值if (l = r) return;int i = l, /从左至右的游标j = r + 1; /从右到左的游标T pivot = al;/把左侧=pivot的元素与右侧 =pivot的元素i = i + 1;贪婪法 while (a pivot);do /在右侧寻找 pivot);if (i = j) break; / 未发现交换对象Swap(a, aj);/ 设置 p i v o tal = aj;aj = pivot;quickSort(a, l, j-1); / 对左段排序 q

12、uickSort(a, j+1, r); / 对右段排序它采用逐步构造最优解的思想,在问题求解的每一个阶段,都作出一个在一 定标准下看上去最优的决策;决策一旦作出,就不可再更改。制定决策的依据称为贪婪准则。贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到 满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。 贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回溯。背包问题问题描述:有不同价值、不同重量的物品 n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。动

13、态规划的基本思想前文主要介绍了动态规划的一些理论依据, 我们将前文所说的具有明显的阶段划分和状态转移方程的动态规划称为标准动态规划,这种标准动态规划是在研究多阶段决策问题时推导出 来的,具有严格的数学形式,适合用于理论上的分析。在实际应用中, 许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦。 一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理) ,则可以考虑用动态规划解决。动态规划的实质是 分治思想和解决冗余,因此,动态规划 是一种将问题实例分解为更小的、 相似的子问题,并存储子问题的解而避免计算重复的子问题, 以解决最优

14、化问题的算法策略。由此可知,动态规划法与分治法和贪心法类似, 它们都是将问题实例归纳为更小的、 相似的子问题,并通过求解子问题产生一个全局最优解。贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择;而分治法中的各个子问题是独立的(即不包含公共的子问题) ,因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。不足之处:如果当前选择可能要依赖子问题的解时, 则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作, 重复地解公共的子问题。解决上述问题的办法是利用动态

15、规划。 该方法主要应用于最优化问题, 这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。若存在若干 个取最优值的解的话, 它只取其中的一个。 在求解过程中,该方法也是通过求解局部子问题 的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立, (亦即各子问题可包含公共的子问题) 也允许其通过自身子问题的解作出选择, 该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。因此,动态规划法所针对的问题有一个显著的特征, 即它所对应的子问题树中的子问题呈现大量的重复。动态规划法的关键就在于, 对于重复出现的子问题, 只

16、在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。3、动态规划算法的基本步骤 设计一个标准的动态规划算法,通常可按以下几个步骤进行:(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。注意这若干个阶段 一定要是有序的或者是可排序的(即无后向性) ,否则问题就无法用动态规划求解。(2 )选择状态:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。 当然,状态的选择要满足无后效性。(3 )确定决策并写出状态转移方程:之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。 所以,如果

17、我们确定了决策,状态转移方程也就写出来了。但事实上,我们常常是反过来做, 根据相邻两段的各状态之间的关系来确定决策。(4)写出规划方程(包括边界条件):动态规划的基本方程是规划方程的通用形式化表达式。 一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。动态规划的 主要难点在于理论上的设计, 一旦设计完成,实现部分就会非常简单。 根据动态规划的基本方程可以直接递归计算最优值,但是一般将其改为递推计算,实现的大体上的框架如下: 标准动态规划的基本框架1.对fn+1(Xn+1)初始化;边界条件for k:=n dow nto 1 dofor 每一个 Xk Xk dofor 每一个

18、 Uk 5(xk) dobeginfk(Xk):= 一个极值; g或 a Xk+1 :=T k(Xk,Uk); 状态转移方程t:= fk+1(Xk+1),Vk(Xk,Uk); 基本方程(9)式if t 比 fk(xk)更优 then fk(xk):=t; 计算 fk(xk)的最优值en d;t:=一个极值; g或g for 每一个 X1 X1 doif f 1(x1)比t更优then t:=f 1(x1); 按照10式求出最优指标输出t;但是,实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行:(1)分析最优解的性质,并刻划其结构特征。(2)递归地定义最优值。(3 )以自

19、底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。(4 )根据计算最优值时得到的信息,构造一个最优解。步骤(1)(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤( 4)可以省略,若需要求出问题的一个最优解,则必须执行步骤( 4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤( 4)中,根据所记录的信息,快速地构造出一个最优解。总结:动态规划实际上就是最优化的问题, 是指将原问题的大实例等价于同一最优化问题的较小实例,自底向上的求解最小实例, 并将所求解存放起来,存放的结果就是为了准备数据。与递归相比,递归是不断的调用子程序求解,是自顶向下的调用和求

20、解。回溯法回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。 当发现当前候选解不可能是解时, 就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外, 满足所有其他要求时, 继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时, 该候选解就是问题的一个解。在回溯法中,放弃当前候选解, 寻找下一个候选解的过程称为回溯。 扩大当前候选解的规模,以继续试探的过程称为向前试探。1回溯法的一般描述可用回溯法求解的问题 P,通常要能表达为:对于已知的由 n元组(x2,,xn)组成 的一个状态空间 E= (X!, X

21、2,,Xn)l Xi Si , i=l , 2,,n,给定关于n元组中的 一个分量的一个约束集 D,要求E中满足D的全部约束条件的所有 n元组。其中Si是分量 Xi的定义域,且|引 有限,i=1 , 2,,n。我们称E中满足D的全部约束条件的任一 n元 组为问题P的一个解。解问题P的最朴素的方法就是枚举法,即对 E中的所有n元组逐一地检测其是否满足 D的全部约束,若满足,则为问题 P的一个解。但显然,其计算量是相当大的。我们发现,对于许多问题,所给定的约束集 D具有完备性,即i元组(X!, X2,,xj满足D中仅涉及到X1 , X2,Xi的所有约束意味着j (ji )元组(Xi , X2,,X

22、j)一定也满 足D中仅涉及到Xi, X2,,Xj的所有约束,i=1 , 2,n。换句话说,只要存在 0jj。因此,对于约束集 D具有完备性的问题 P, 旦检测断定某个 j元 组(Xi , X2,,Xj)违反D中仅涉及Xi, X2,,Xj的一个约束,就可以肯定,以(Xi , X2,,Xj)为前缀的任何 n元组(xi, x2,,Xj, xj+i,xn)都不会是问题 P的解,因而就不必去搜索它们、 检测它们。回溯法正是针对这类问题, 利用这类问题的上述性质而提出来的比枚举法效率更高的算法。回溯法首先将问题 P的n元组的状态空间 E表示成一棵高为n的带权有序树T,把在E中 求问题P的所有解转化为在 T

23、中搜索问题P的所有解。树T类似于检索树,它可以这样构 造:设Si中的元素可排成Xi,Xi,Xi(mi-i) , |Si| =mi, i=i , 2,,n。从根开始,让T的第I层的每一个结点都有 mi个儿子。这mi个儿子到它们的双亲的边,按从左到右的 次序,分别带权 Xi+i,xi+i,xi+i(mi) , i=0 , i, 2,n-i。照这种构造方式,E 中的一个n元组(Xi, X2,,Xn)对应于T中的一个叶子结点,T的根到这个叶子结点的 路径上依次的n条边的权分别为Xi, X2,,Xn,反之亦然。另外,对于任意的 0 i前缀2元组(xi, x2)、,前缀I元组(Xi, X2,,Xi),,直

24、到i=n为止。在回溯法中,上述引入的树被称为问题 P的状态空间树;树T上任意一个结点被称为问题P的状态结点;树T上的任意一个叶子结点被称为问题 P的一个解状态结点;树 T上满足约束集D的全部约束的任意一个叶子结点被称为问题 P的一个回答状态结点,它对应于问题P的一个解。【问题】 n皇后问题问题描述:求出在一个 nx n的棋盘上,放置n个不能互相捕捉的国际象棋皇后” 的所有布局。这是来源于国际象棋的一个问题。皇后可以沿着纵横和两条斜线 4个方向相互捕捉。如图所示,一个皇后放在棋盘的第 4行第3列位置上,则棋盘上凡打“x”的位置上的皇后 就能与这个皇后相互捕捉。123456 7 8xxxxxxxx

25、xxQxxx x xxxxxxxxxxx从图中可以得到以下启示: 一个合适的解应是在每列、 每行上只有一个皇后, 且一条斜线上也只有一个皇后。求解过程从空配置开始。在第1列至第m列为合理配置的基础上,再配置第m+1列, 直至第n列配置也是合理时,就找到了一个解。接着改变第 n列配置,希望获得下一个解。另外,在任一列上,可能有 n种配置。开始时配置在第 1行,以后改变时,顺次选择第 2行、第3行、直到第n行。当第n行配置也找不到一个合理的配置时,就要回溯,去改 变前一列的配置。得到求解皇后问题的算法如下: 输入棋盘大小值n;m=0;good=1;do if (good)if (m=n) 输出解;

26、改变之,形成下一个候选解else 扩展当前候选接至下一列;else 改变之,形成下一个候选解;good=检查当前候选解的合理性; while (m!=0);在编写程序之前,先确定边式棋盘的数据结构。比较直观的方法是采用一个二维数组, 但仔细观察就会发现,这种表示方法给调整候选解及检查其合理性带来困难。 更好的方法乃是尽可能直接表示那些常用的信息。对于本题来说, “常用信息”并不是皇后的具体位置,而是“一个皇后是否已经在某行和某条斜线合理地安置好了” 。因在某一列上恰好放一个皇后,引入一个一维数组(col),值coli表示在棋盘第i列、coli行有一个皇后。例如:col3=4,就表示在棋盘 的第

27、3列、第4行上有一个皇后。另外, 为了使程序在找完了全部解后回溯到最初位置,设定col0的初值为0当回溯到第0列时,说明程序已求得全部解,结束程序运行。为使程序在检查皇后配置的合理性方面简易方便,引入以下三个工作数组:(1) 数组a ,ak表示第k行上还没有皇后;(2) 数组b ,bk表示第k列右高左低斜线上没有皇后;(3) 数组c ,ck表示第k列左高右低斜线上没有皇后;棋盘中同一右高左低斜线上的方格, 他们的行号与列号之和相同; 同一左高右低斜线上的方格,他们的行号与列号之差均相同。初始时,所有行和斜线上均没有皇后, 从第1列的第1行配置第一个皇后开始, 在第m列colm行放置了一个合理的

28、皇后后,准备考察第 m+1列时,在数组a卜b和c中为第m列,colm行的位置设定有皇后标志;当从第 m列回溯到第 m-1列,并准备调整第 m-1列的皇后配置时,清除在数组 a卜b和c中设置的关于第 m-1列,colm-1行有皇后的标志。一个皇后在 m列, colm行方格内配置是合理的,由数组 a 、b和c对应位置的值都为 1来确定。细节见 以下程序:【程序】#in clude#in clude#defi ne MAXN 20int n, m,good;int colMAXN+1,aMAXN+1,b2*MAXN+1,c2*MAXN+1;if (m=n) printf( “列 t 行”);for (j=1;j=n ;j+)printf( “ 3d n”,j,colj);printf( “ Enter character (Q/q for exit)! n” ); scanf( “ C,&awn);if (awn= Q,|awn=,exi|t(0)while (colm=n) m-;acolm=bm+colm=c n+m-colm=1;colm+;else aco

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1