算法复习题
- 格式:doc
- 大小:82.50 KB
- 文档页数:6
算法与程序设计一、选择题部分(100题)一章一节:了解计算机解决问题的过程1.用计算机解决问题时,首先应该确定程序“做什么?”,然后再确定程序“如何做?”请问“如何做?”是属于用计算机解决问题的哪一个步骤?()A、分析问题B、设计算法C、编写程序D、调试程序答案:B2.学校要举行运动会,请你设计一个能够对运动员分数自动排序的软件,如果要设计此软件,以下最好的方法和步骤是()。
A、分析问题,编写程序,设计算法,调试程序B、设计算法,编写程序,提出问题,调试程序C、提出问题,设计算法,编写程序,调试程序D、设计算法,提出问题,编写程序,调试程序答案:C3.下列步骤不属于软件开发过程的是()。
A、任务分析与系统设计B、软件的销售C、代码编写与测试D、软件测试与维护答案:B4.用计算机解决问题的步骤一般为()①编写程序②设计算法③分析问题④调试程序。
A.①②③④ B.③④①② C.②③①④ D.③②①④答案:D5.以下描述中最适合用计算机编程来处理的是()。
A、确定放学回家的路线B、计算某个同学期中考试各科成绩总分C、计算100以内的奇数平方和D、在因特网上查找自己喜欢的歌曲答案:C6.以下问题中最适合用计算机编程处理的是()。
A、制定本学期的学习计划B、计算正方形的周长C、创作一首歌曲D、求1000以内的所有素数答案:D7.由“上车—掏钱—投币”所描述的问题是()。
A、无人售票车投币过程B、乘公交车过程C、上车过程D、下车过程答案:A一章二节:算法和算法描述8.下面说法正确的是()。
A、算法+数据结构=程序B、算法就是程序C、数据结构就是程序D、算法包括数据结构答案:A9.算法描述可以有多种表达方法,下面哪些方法不可以描述“水仙花数问题”的算法()。
A.自然语言B.流程图C.伪代码D.机器语言答案:D10.下面关于算法的说法错误的是()。
A、算法必须有输出B、算法就是程序C、算法不一定有输入D、算法必须在有限步执行后能结束答案:B11.算法的三种基本控制结构是顺序结构、分支结构和()。
平均情况:设待查找的元素在数组中的概率为P,不在数组中的概率为1-P,若出现在数组中每个位置的概率是均等的为p/nT(n)=P1D1+P2D2+...+PiDi+(1-P)Dn+1=p/2+n(1-p/2)1.叙述分治算法和动态规划算法的基本思想,并比较两种算法的异同。
答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解. 动态规划将待求解的问题分解成若干的子问题,自底向上地通过求解子问题的解得到原问题的解。
动态规划将每个子问题只求解一次并将其解保存在一个表格中,当需要再次求解此子问题时,只是简单的通过查表过的该子问题的解,避免了大量的重复计算.异同:分治法求解的问题分解后的子问题都是独立的,而使用动态规划求解的问题分解后得到的子问题往往不是相互独立的。
分治法是自顶向下用递归的方法解决问题,而动态规划则是自底向上非递归解决问题。
1.简述分治算法求解过程的三个阶段。
答:(1)划分:既然是分治,当然需要把规模为n的原问题划分为k个规模较小的子问题,并尽量使这k个子问题的规模大致相同。
(2)求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。
(3)合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。
2.叙述分治法的基本思想,并分析分治法与减治法二者的区别。
答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解.区别:分治法是把一个大问题划分成若干个子问题,分别求解各个子问题,然后把子问题的解进行合并并得到原问题的解。
减治法同样是把一个大问题划分成若干个子问题,但是这些子问题不需要分别求解,只需求解其中的一个子问题,因而也无需对子问题的解进行合并。
算法复习试题一、名词解释:1、算法:就是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。
2、贪心算法:能够得到某种量度意义下的最优解的分级处理方法称为贪心算法。
3、分治法:分治法的求解思想就是把整个问题分成若干个小问题后分的治之4、递归过程:一个递归过程的执行类似于多个子程序的嵌套调用,递归过程是自己调用自己本身代码。
递归算法的特点:思路清晰,算法的描述简洁且易理解。
5、集合:在研究某一类对象时,可把这类对象的整体称为集合。
6、生成树:设G=(V,E)是一个无向连通图。
如果G的生成子图T=(V,E')是一棵树,则称T是G的一棵生成树。
7、算法具有以下5个属性:有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:算法中每一条指令必须有确切的含义。
不存在二义性。
只有一个入口和一个出口可行性:就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。
8、迭代法:称辗转法,是一种不断用变量的旧值递推出新值的解决问题的方法。
9、贪婪法: 是一种不追求最优解,只希望得到较为满意解的方法。
贪婪法不要回溯10、动态规划:是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。
11、分支限界法:是一种用于求解组合优化问题的排除非解的搜索算法。
12、树:树是一个或多个结点的有限集合。
12、二元树:它是结点的有限集合,它或者为空,或者由一个根和两棵树(左子树和右子树)的不相交的二元树所组成。
13、二分检索树:T是一棵二元树,它或者为空,或者其每个结点含有一个可比较大小的数据元素。
14、图:图是数据结构,一个图G是由称之为结点V和边E的两个集合组成的15、最优解:使目标函数取极值(极大值或极小值)的可行解。
填空题:1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:确定性有穷性可行性 0个或多个输入一个或多个输出2.算法的复杂性有时间复杂性和空间复杂性之分,衡量一个算法好坏的标准是时间复杂度高低。
3.某一问题可用动态规划算法求解的显著特征是该问题具有最优子结构性质。
5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解6.动态规划算法的基本思想是将待求解问题分解成若干子问题_,先求解子问题,然后从这些子问题的解得到原问题的解。
7.以深度优先方式系统搜索问题解的算法称为回溯法。
8.0-1背包问题的回溯算法所需的计算时间为o(n*2n),用动态规划算法所需的计算时间为o(min{nc,2n})。
9.动态规划算法的两个基本要素是最优子结构和重叠子问题。
10.二分搜索算法是利用动态规划法实现的算法。
11.一个算法复杂性的高低体现在计算机运行该算法所需的时间和存储器资源上,因此算法的复杂性有时间复杂性和空间复杂性之分。
12.出自于“平衡子问题”的思想,通常分治法在分割原问题,形成若干子问题时,这些子问题的规模都大致相同。
13.动态规划算法有一个变形方法备忘录方法。
这种方法不同于动态规划算法“自底向上”的填充方向,而是“自顶向下”的递归方向,为每个解过的子问题建立了备忘录以备需要时查看,同样也可避免相同子问题的重复求解。
14、这种不断回头寻找目标的方法称为回溯法。
15、直接或间接地调用自身的算法称为递归算法。
16、 记号在算法复杂性的表示法中表示渐进确界或紧致界。
17、由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
18、建立计算模型的目的是为了使问题的计算复杂性分析有一个共同的客观尺度。
19、下列各步骤的先后顺序是②③④①。
①调试程序②分析问题③设计算法④编写程序。
20、最优子结构性质的含义是问题的最优解包含其子问题的最优解。
分治法1、二分搜索算法是利用(分治策略)实现的算法。
9. 实现循环赛日程表利用的算法是(分治策略)27、Strassen矩阵乘法是利用(分治策略)实现的算法。
34.实现合并排序利用的算法是(分治策略)。
实现大整数的乘法是利用的算法(分治策略)。
17.实现棋盘覆盖算法利用的算法是(分治法)。
29、使用分治法求解不需要满足的条件是(子问题必须是一样的)。
不可以使用分治法求解的是(0/1背包问题)。
动态规划下列不是动态规划算法基本步骤的是(构造最优解)下列是动态规划算法基本要素的是(子问题重叠性质)。
下列算法中通常以自底向上的方式求解最优解的是(动态规划法)备忘录方法是那种算法的变形。
(动态规划法)最长公共子序列算法利用的算法是(动态规划法)。
矩阵连乘问题的算法可由(动态规划算法B)设计实现。
实现最大子段和利用的算法是(动态规划法)。
贪心算法能解决的问题:单源最短路径问题,最小花费生成树问题,背包问题,活动安排问题,不能解决的问题:N皇后问题,0/1背包问题是贪心算法的基本要素的是(贪心选择性质和最优子结构性质)。
回溯法回溯法解旅行售货员问题时的解空间树是(排列树)。
剪枝函数是回溯法中为避免无效搜索采取的策略回溯法的效率不依赖于下列哪些因素(确定解空间的时间)分支限界法最大效益优先是(分支界限法)的一搜索方式。
分支限界法解最大团问题时,活结点表的组织形式是(最大堆)。
分支限界法解旅行售货员问题时,活结点表的组织形式是(最小堆)优先队列式分支限界法选取扩展结点的原则是(结点的优先级)在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( 分支限界法).从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( 栈式分支限界法)之外都是最常见的方式.(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。
算法分析复习题⼀、单项选择题:1、算法的五⼤特征是确定性、有穷性、输⼊、输出和可⾏性。
其输⼊⾄少是( A )个。
A、0B、1C、n D、-12、⼤整数的乘法是利⽤的算法( C )。
A、贪⼼法B、动态规划法C、分治策略D、回溯法3、采⽤贪⼼算法的最优装载问题的主要计算量在于将集装箱依其重量从⼩到⼤排序,故算法的时间复杂度为( B )。
A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)4、⼀个问题可⽤动态规划算法或贪⼼算法求解的关键特征是问题的( B )。
A、重叠⼦问题B、最优⼦结构性质C、贪⼼选择性质D、定义最优解5、设⼀个算法的输⼊规模为n,Dn是所有输⼊的集合,任⼀输⼊I∈Dn,P(I)是I出现的概率,有=1,T(I)是算法在输⼊I下所执⾏的基本语句次数,则该算法的平均执⾏时间为(D)。
A、B、C、D、6、把递归算法转化为⾮递归算法有如下两种基本⽅法:(1)直接⽤循环结构的算法替代递归算法。
(2)⽤( A )模拟系统的运⾏过程,通过分析只保存必须保存的信息,从⽽⽤⾮递归算法替代递归算法。
A、栈B、队列C、顺序表D、链表7、算法分析中,记号表⽰(A)。
A、渐进下界B、渐进上界C、⾮紧上界D、紧渐进界9、贪⼼算法与动态规划算法的主要区别是(B )。
A、最优⼦结构B、贪⼼选择性质C、构造最优解D、定义最优解10、回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。
A、⼴度优先B、活结点优先C、扩展结点优先D、深度优先11. 回溯法的问题的解空间树是(B),并不需要在算法运⾏时构造⼀棵真正的树结构,然后再在该解空间树中搜索问题的解,⽽是只存储从根结点到当前结点的路径。
A、顺序⽅式的⼆叉树B、虚拟的树C、满⼆叉树D、完全⼆叉树12. 应⽤回溯法求解问题时,⾸先应该明确问题的解空间。
解空间中满⾜约束条件的决策序列称为(C)。
A、最优解B、局部最优解C、可⾏解D、最优⼦序列解13. ⼀个问题的最优解包含其⼦问题的最优解,则称此问题具有(D)性质。
填空题动态规划算法的基本要素为:最优子结构性质与重叠子问题性质1)算法分析中,记号O表示渐进上界,记号Ω表示渐进下界,记号Θ表示紧渐进界。
2)回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。
3)分支限界法在问题的解空间树中,按广度优先策略,从根结点出发搜索解空间树。
所谓贪心选择性质是指(所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到)。
所谓最优子结构性质是指(问题的最优解包含了其子问题的最优解)。
回溯法是指(具有限界函数的深度优先生成法)。
回溯法的算法框架按照问题的解空间一般分为(子集树)算法框架与(排列树)算法框架。
4)二分搜索算法是利用分治策略实现的算法。
5)衡量一个算法好坏的标准是时间复杂度低6)最长公共子序列算法利用的算法是动态规划法7)Strassen矩阵乘法是利用分治策略实现的算法8)回溯法搜索状态空间树是按照深度优先遍历的顺序。
9)算法中通常以自底向下的方式求解最优解的是动态规划法10)背包问题的贪心算法所需的计算时间为O(nlogn)11)0-1背包问题的回溯算法所需的计算时间为O(n2n)12)用动态规划算法解决最大字段和问题,其时间复杂性为n13)一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_有穷性,确定性,可行性,输入,输出。
1.算法的复杂性有时间复杂性和空间复杂性之分。
2、程序是算法用某种程序设计语言的具体实现。
3、算法的“确定性”指的是组成算法的每条指令是清晰的,无歧义的。
4.矩阵连乘问题的算法可由动态规划设计实现。
6、算法是指解决问题的一种方法或一个过程。
7、从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法。
8、问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
9、以深度优先方式系统搜索问题解的算法称为回溯法。
10、数值概率算法常用于数值问题的求解。
一。
选择题1、二分搜索算法是利用( A )实现的算法。
A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是( D )。
A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是( A )的一搜索方式。
A、分支界限法B、动态规划法C、贪心法D、回溯法5. 回溯法解旅行售货员问题时的解空间树是()。
A、子集树B、排列树C、深度优先生成树D、广度优先生成树6.下列算法中通常以自底向上的方式求解最优解的是( B )。
A、备忘录法B、动态规划法C、贪心法D、回溯法注意:动态规划采用的是自底向上的方式求解,而贪心算法采用的是自顶向下的方式来求解问题。
7、衡量一个算法好坏的标准是(C )。
A 运行速度快B 占用空间少C 时间复杂度低D 代码短8、以下不可以使用分治法求解的是(D )。
A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题9. 实现循环赛日程表利用的算法是( A )。
A、分治策略B、动态规划法C、贪心法D、回溯法11.下面不是分支界限法搜索方式的是( D )。
A、广度优先B、最小耗费优先C、最大效益优先D、深度优先12.下列算法中通常以深度优先方式系统搜索问题解的是( D )。
A、备忘录法B、动态规划法C、贪心法D、回溯法13.备忘录方法是那种算法的变形。
( B )A、分治法B、动态规划法C、贪心法D、回溯法注意:备忘录是动态规划方法的一个步骤。
14.哈弗曼编码的贪心算法所需的计算时间为( B )。
A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)15.分支限界法解最大团问题时,活结点表的组织形式是( B )。
A、最小堆B、最大堆C、栈D、数组16.最长公共子序列算法利用的算法是( B )。
A、分支界限法B、动态规划法C、贪心法D、回溯法17.实现棋盘覆盖算法利用的算法是( A )。
A、分治法B、动态规划法C、贪心法D、回溯法18.下面是贪心算法的基本要素的是( C )。
一、选择题1、衡量一个算法好坏的标准是( )。
(A )运行速度快 (B )占用空间少 (C )时间复杂度低 (D )代码短2、函数n n 1032 的渐进表达式是( )。
(A )O(23n ) (B )O(3) (C )O(n 10) (D )O(2n )3、以下不可以使用分治法求解的是( )。
(A )棋盘覆盖问题 (B )选择问题 (C )归并排序 (D ) 0/1背包问题4、二分搜索算法是利用( )实现的算法。
(A )分治策略 (B )动态规划法 (C )贪心法 (D )回溯法5、二分搜索算法的时间复杂性为( )。
(A )O(2n ) (B )O(n ) (C )O(n log ) (D )O(n n log )6、快速排序算法的时间复杂性为( )。
(A )O(2n ) (B )O(n ) (C )O(n log ) (D )O(n n log )7、实现大整数的乘法是利用( )的算法。
(A )分治策略 (B )动态规划法 (C )贪心法 (D )回溯法8、矩阵连乘问题的算法可由( )设计实现。
(A )分支界限算法 (B )动态规划算法 (C )贪心算法 (D )回溯算法9、实现循环赛日程表利用的算法是( )。
(A )分治策略 (B )动态规划法 (C )贪心法(D )回溯法10、下列是动态规划算法基本要素的是( )。
(A )定义最优解 (B )构造最优解 (C )算出最优解 (D )子问题重叠性质11、最长公共子序列算法利用的算法是( )。
(A )分治法 (B )动态规划法 (C )贪心法 (D )回溯法12、下列算法中通常以自底向上的方式求解最优解的是( )。
(A )备忘录法 (B )动态规划法 (C )贪心法 (D )回溯法13、以下不可以使用分治法求解的是( )。
(A )棋盘覆盖问题 (B )选择问题 (C )归并排序 (D )0/1背包问题14、下列算法中不能解决0/1背包问题的是( )(A )贪心法 (B )动态规划 (C )回溯法 (D )分支限界法15、算法是由若干条指令组成的有穷序列,而且满足以下性质( )(A )输入:有0个或多个输入 (B )输出:至少有一个输出(C )确定性:指令清晰,无歧义 (D )有限性:指令执行次数有限,而且执行时间有限A (1)(2)(3) B(1)(2)(4) C(1)(3)(4) D (1) (2)(3)(4)16、函数32n +10nlog n 的渐进表达式是( ).A. 2nB. 32nC. nlog nD. 10nlog n17、能采用贪心算法求最优解的问题,一般具有的重要性质为:( )(A )最优子结构性质与贪心选择性质 (B )重叠子问题性质与贪心选择性质(C )最优子结构性质与重叠子问题性质 (D )预排序与递归调用18、回溯法在问题的解空间树中,按()策略,从根结点出发搜索解空间树。
一、选择题1、衡量一个算法好坏的标准是( )。
(A )运行速度快 (B )占用空间少 (C )时间复杂度低 (D )代码短2、函数n n 1032 的渐进表达式是( )。
(A )O (23n ) (B)O (3) (C )O (n 10) (D )O(2n )3、以下不可以使用分治法求解的是( )。
(A )棋盘覆盖问题 (B )选择问题 (C )归并排序 (D) 0/1背包问题4、二分搜索算法是利用( )实现的算法。
(A)分治策略 (B )动态规划法 (C)贪心法 (D )回溯法5、二分搜索算法的时间复杂性为( )。
(A )O(2n ) (B )O (n ) (C )O (n log ) (D)O (n n log )6、快速排序算法的时间复杂性为( )。
(A )O (2n ) (B)O (n ) (C )O(n log ) (D)O(n n log )7、实现大整数的乘法是利用( )的算法.(A )分治策略 (B)动态规划法 (C)贪心法 (D )回溯法8、矩阵连乘问题的算法可由( )设计实现。
(A )分支界限算法 (B)动态规划算法 (C)贪心算法 (D )回溯算法9、实现循环赛日程表利用的算法是( )。
(A )分治策略 (B )动态规划法 (C )贪心法(D )回溯法10、下列是动态规划算法基本要素的是( ).(A )定义最优解 (B )构造最优解 (C )算出最优解 (D )子问题重叠性质11、最长公共子序列算法利用的算法是( )。
(A )分治法 (B )动态规划法 (C )贪心法 (D)回溯法12、下列算法中通常以自底向上的方式求解最优解的是( )。
(A)备忘录法 (B )动态规划法 (C )贪心法 (D )回溯法13、以下不可以使用分治法求解的是( ).(A)棋盘覆盖问题 (B )选择问题 (C )归并排序 (D )0/1背包问题14、下列算法中不能解决0/1背包问题的是( )(A)贪心法 (B )动态规划 (C)回溯法 (D)分支限界法15、算法是由若干条指令组成的有穷序列,而且满足以下性质( )(A )输入:有0个或多个输入 (B)输出:至少有一个输出(C )确定性:指令清晰,无歧义 (D)有限性:指令执行次数有限,而且执行时间有限A (1)(2)(3)B (1)(2)(4)C (1)(3)(4)D (1) (2)(3)(4)16、函数32n +10nlog n 的渐进表达式是( ).A. 2n B 。
32n C. nlog n D. 10nlog n17、能采用贪心算法求最优解的问题,一般具有的重要性质为:( )(A)最优子结构性质与贪心选择性质 (B )重叠子问题性质与贪心选择性质(C)最优子结构性质与重叠子问题性质 (D )预排序与递归调用18、回溯法在问题的解空间树中,按( )策略,从根结点出发搜索解空间树。
(A)广度优先(B)活结点优先(C)扩展结点优先(D)深度优先19、下面哪种函数是回溯法中为避免无效搜索采取的策略( )(A)递归函数(B)剪枝函数(C)随机数函数(D)搜索函数(A)运行速度快(B)占用空间少(C)时间复杂度低(D)代码短20、备忘录方法是那种算法的变形()。
21、下列算法中通常以深度优先方式系统搜索问题解的是( )。
(A)备忘录法(B)动态规划法(C)贪心法(D)回溯法22、回溯法解旅行售货员问题时的解空间树是( )。
(A)子集树(B)排列树(C)深度优先生成树 (D)广度优先生成树23、Strassen矩阵乘法是利用()实现的算法。
(A)分治策略 (B)动态规划法(C)贪心法 (D)回溯法24.采用广度优先策略搜索的算法是( )。
(A)分支界限法(B)动态规划法 (C)贪心法 (D)回溯法25、背包问题的贪心算法所需的计算时间为( )(A) O(n2n) (B)O(nlogn) (C)O(2n)(D)O(n)二、填空题1、程序是算法用某种程序设计语言的具体实现。
2、算法的“确定性”指的是组成算法的每条指令是清晰的,无歧义的。
3.算法是由若干条指令组成的有穷序列,且要满足输入、输出、确定性和有限性四条性质。
4、计算一个算法时间复杂度通常可以计算循环次数、基本操作的频率或计算步.5.算法的复杂性有时间复杂性和空间复杂性之分。
6、从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法 .7。
动态规划算法的两个基本要素是最优子结构和重叠子问题。
8、问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
9、贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
10. 动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些问题得到原问题的解。
11。
快速排序算法是基于分治策略的一种排序算法。
12.任何可用计算机求解的问题所需的时间都与其规模有关。
13.快速排序算法的性能取决于划分的对称性。
14.回溯法搜索解空间树时,常用的两种剪枝函数为约束函数和限界函数 .15、以深度优先方式系统搜索问题解的算法称为回溯法。
16、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是 0/1背包问题,只使用约束条件进行裁剪的是 N皇后问题。
三、算法填空1、以下是计算xm的值的过程int power ( x, m ){//计算xm的值并返回。
y=( 1 );i=m;while(i- - 〉0)y=y*x;return y;}2、给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x的二分搜索算法template〈class Type〉int BinarySearch(Type a[], const Type& x, int l, int r){ while (l〈=r ){int m = ((l+r)/2);if (x == a[m]) return m;if (x < a[m]) r = m—1; else l = m+1;}return -1;}3、速排序template<class <Type>void QuickSort (Type a[], int p, int r){ if (p〈r) {int q=Partition(a,p,r);QuickSort (a,p,q—1); //对左半段排序QuickSort (a,q+1,r); //对右半段排序}}4、快速排序中的划分函数Partition确定以基准元素a[p]对子数组a[p:r]进行划分template〈class 〈Type〉void Partition(Type a[],int p, int r){ int i = p, j = r + 1; Type x=a[p];while (true) {while (a[++i] <x && i<r );while (a[--j] >x);if (i 〉= j) break;Swap(a[ i ], a[ j ]);}a[ p ] = a[ j ] ;a[ j ] = x;return j;}5、合并排序描述如下:template<class Type>void Mergesort(Type a[ ], int left, int right){ if (left〈right){int i=( left+right)/2;Mergesort(a, left, i ); //对左半段排序Mergesort(a, i+1, right); //对右半段排序算法复习题Merge(a,b, left,i,right);//合并到数组bCopy(a,b, left,right ); //复制到数组a}}6、函数Merge合并两个排好序的数组段到一个新的数组b中.void Merge(Type c[],Type d[], int l, int m, int r){ int i=l, j=m+1, k=l;while (( i<=m )&& (j<=r))if (c[i]<=c[j]) d[k++]=c[i++];else d[k++]=c[j++];if (i〉m) for(int q=j; q〈=r; q++) d[k++]=c[q];else for(int q=i; q<=m; q++) d[k++]=c[q];}7、计算最长公共子序列的算法如下:void LCSLength (int m, int n, char *x,char *y,int c,int **b){ int i,j;for (i = 1; i 〈= m; i++) c[i][0];for (i = 1; i <= n; i++) c[0][i];for (i = 1; i <= m; i++)for (j = 1; j <= n; j++);{if (x[i]==y[j]){ c[i][j]=c[i-1][j—1]+1; b[i][j]=1;}else if (c[i-1][j]〉=c[i][j-1] ){ c[i][j]=c[i—1][j]; b[i][j]=2;}else { c[i][j]=c[i][j—1]; b[i][j]=3;}}}8、列问题Template 〈class Type>void perm(Type list[], int k, int m ){ //产生[list[k:m]的所有排列if(k==m){ //只剩下一个元素for (int i=0;i〈=m;i++) cout〈<list[i];cout〈<endl;}else //还有多个元素待排列,递归产生排列for (int i=k; i〈=m; i++){swap(list[k],list[i]);perm(list,k+1;m);swap(list[k],list[i]);}}9、0—1背包问题template<class Type〉void knapsack(Type v,int w,int c, int n,Type **m){ int jMax=min(w[n]-1,c);for( int j=0; j<=jMax; j++) m[n][j]=0;for( int j=w[n]; j<=c; j++) m[n][j]=v[n];for( int i=n—1; i〉1; i--){ jMax=min(w[i]-1,c);for( int j=0; j<=jMax; j++)m[i][j]=m[i+1][j];for(int j=w[i]; j<=c; j++)m[i][j]=max(m[i+1][j], m[i+1][j—w[i]]+v[i]);}m[1][c]=m[2][c];if (c〉=w[1]) m[1][c]=max(m[2][c], m[2][c-w[1]]+v[1]);}10、按上述算法knapsack计算后,m[1][c]给出所求的0—1背包问题的最优值。