1、1、二分搜索算法是利用(A )实现的算法。A、分治策略 B、动态规划法 C、贪心法 D、回溯法2、下列不是动态规划算法基本步骤的是(A )。A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解3、最大效益优先是(A )的一搜索方式。A、分支界限法 B、动态规划法 C、贪心法 D、回溯法4、在下列算法中有时找不到问题解的是(B )。A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 D、数值概率算法5. 回溯法解旅行售货员问题时的解空间树是(A )。A、子集树B、排列树C、深度优先生成树D、广度优先生成树6下列算法中通常以自底向上的方式求解最优解的是(B )。A、备忘录法B、动
2、态规划法C、贪心法D、回溯法7、衡量一个算法好坏的标准是(C )。A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短8、以下不可以使用分治法求解的是(D )。A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题9. 实现循环赛日程表利用的算法是(A )。A、分治策略B、动态规划法C、贪心法D、回溯法10、下列随机算法中运行时有时候成功有时候失败的是(C )A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法11下面不是分支界限法搜索方式的是(D )。A、广度优先B、最小耗费优先C、最大效益优先D、深度优先12下列算法中通常以深度优先方式系统搜索问题解的是
3、(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 )。A、重叠子问题B、构造最
4、优解C、贪心选择性质D、定义最优解19.回溯法的效率不依赖于下列哪些因素( D )A.满足显约束的值的个数 B. 计算约束函数的时间 C. 计算限界函数的时间 D. 确定解空间的时间20.下面哪种函数是回溯法中为避免无效搜索采取的策略(B )A递归函数B.剪枝函数 C。随机数函数D.搜索函数21、下面关于NP问题说法正确的是(B )A NP问题都是不可能解决的问题 B P类问题包含在NP类问题中C NP完全问题是P类问题的子集 D NP类问题包含在P类问题中22、蒙特卡罗算法是(B )的一种。A、分支界限算法 B、概率算法 C、贪心算法 D、回溯算法23.下列哪一种算法不是随机化算法(C )A
5、. 蒙特卡罗算法B. 拉斯维加斯算法C.动态规划算法D.舍伍德算法24. (D )是贪心算法与动态规划算法的共同点。A、重叠子问题B、构造最优解C、贪心选择性质D、最优子结构性质25. 矩阵连乘问题的算法可由(B)设计实现。A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法26. 分支限界法解旅行售货员问题时,活结点表的组织形式是(A )。A、最小堆B、最大堆 C、栈D、数组27、Strassen矩阵乘法是利用(A )实现的算法。A、分治策略 B、动态规划法 C、贪心法 D、回溯法29、使用分治法求解不需要满足的条件是(A )。A 子问题必须是一样的 B 子问题不能够重复C 子问题
6、的解可以合并 D 原问题和子问题使用相同的方法解30、下面问题(B )不能使用贪心法解决。A 单源最短路径问题 B N皇后问题 C 最小花费生成树问题 D 背包问题31、下列算法中不能解决0/1背包问题的是(A )A 贪心法 B 动态规划 C 回溯法 D 分支限界法32、回溯法搜索状态空间树是按照(C )的顺序。A 中序遍历 B 广度优先遍历 C 深度优先遍历 D 层次优先遍历33、下列随机算法中运行时有时候成功有时候失败的是(C )A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法34实现合并排序利用的算法是(A )。A、分治策略B、动态规划法C、贪心法D、回溯法35下列
7、是动态规划算法基本要素的是(D )。A、定义最优解B、构造最优解C、算出最优解D、子问题重叠性质36下列算法中通常以自底向下的方式求解最优解的是(B )。A、分治法B、动态规划法C、贪心法D、回溯法37采用广度优先策略搜索的算法是(A )。A、分支界限法B、动态规划法C、贪心法D、回溯法38、合并排序算法是利用(A )实现的算法。A、分治策略 B、动态规划法 C、贪心法 D、回溯法39、在下列算法中得到的解未必正确的是(B )。A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 D、数值概率算法40、背包问题的贪心算法所需的计算时间为(B )A、O(n2n) B、O(nlogn) C、O(2
8、n) D、O(n)41实现大整数的乘法是利用的算法(C )。A、贪心法B、动态规划法C、分治策略D、回溯法420-1背包问题的回溯算法所需的计算时间为(A )A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)43采用最大效益优先搜索方式的算法是(A )。A、分支界限法B、动态规划法C、贪心法D、回溯法44贪心算法与动态规划算法的主要区别是(B )。A、最优子结构B、贪心选择性质C、构造最优解D、定义最优解45. 实现最大子段和利用的算法是(B )。A、分治策略B、动态规划法C、贪心法D、回溯法46.优先队列式分支限界法选取扩展结点的原则是(C )。A、先进先出B、后进先出 C、结点
9、的优先级D、随机47.背包问题的贪心算法所需的计算时间为(B )。A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)48、广度优先是(A )的一搜索方式。A、分支界限法 B、动态规划法 C、贪心法 D、回溯法49、舍伍德算法是(B )的一种。A、分支界限算法 B、概率算法 C、贪心算法 D、回溯算法50、在下列算法中有时找不到问题解的是(B )。A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 D、数值概率算法51下列哪一种算法是随机化算法(D )A. 贪心算法B. 回溯法C.动态规划算法D.舍伍德算法52. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的(B )。A
10、、重叠子问题B、最优子结构性质C、贪心选择性质D、定义最优解53采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为 ( B ) 。A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)54. 以深度优先方式系统搜索问题解的算法称为 ( D ) 。A、分支界限算法 B、概率算法 C、贪心算法 D、回溯算法55. 实现最长公共子序列利用的算法是(B )。A、分治策略B、动态规划法C、贪心法D、回溯法二、 填空题 1.算法的复杂性有 时间 复杂性和 空间 复杂性之分。2、程序是 算法用某种程序设计语言的具体实现。3、算法的“确定性”指的是组成算法的每
11、条 指令 是清晰的,无歧义的。4.矩阵连乘问题的算法可由 动态规划 设计实现。5、拉斯维加斯算法找到的解一定是 正确解。6、算法是指解决问题的 一种方法 或 一个过程 。7、从分治法的一般设计模式可以看出,用它设计出的程序一般是 递归算法 。8、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特征。9、以深度优先方式系统搜索问题解的算法称为 回溯法 。10、数值概率算法常用于 数值问题 的求解。11、计算一个算法时间复杂度通常可以计算 循环次数 、 基本操作的频率 或计算步。12、利用概率的性质计算近似值的随机算法是数值概率算法,运行时以一定的概率得到正确解的随机算法是_蒙
12、特卡罗算法_。14、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是 动态规划 ,需要排序的是 回溯法 ,分支限界法 。15、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是 0/1背包问题 ,只使用约束条件进行裁剪的是 N皇后问题 。17、矩阵连乘问题的算法可由 动态规划 设计实现。18、拉斯维加斯算法找到的解一定是 正确解。19.贪心算法的基本要素是 贪心选择 质和 最优子结构 性质 。21. 动态规划算法的基本思想是将待求解问题分解成若干 子问
13、题 ,先求解 子问题 ,然后从这些 子问题 的解得到原问题的解。算法是由若干条指令组成的有穷序列,且要满足输入,输出 、确定性和 有限性 四条性质。23、大整数乘积算法是用 分治法 来设计的。24、以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。25、舍伍德算法总能求得问题的 一个解 。贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法主要区别。27.快速排序算法是基于 分治策略 的一种排序算法。28.动态规划算法的两个基本要素是. 最优子结构性质和 重叠子问题 性质 。 30.回溯法是一种既带有 系统性 又带有 跳跃性 的搜索算法。 31.分支限界法主要有
14、队列式(FIFO) 分支限界法和 优先队列式 分支限界法。32分支限界法是一种既带有 系统性 又带有 跳跃性 的搜索算法。33回溯法搜索解空间树时,常用的两种剪枝函数为 约束函数 和 限界函数 。34.任何可用计算机求解的问题所需的时间都与其 规模 有关。35.快速排序算法的性能取决于 划分的对称性 。1.背包问题的贪心算法 2.最大子段和: 动态规划算法 3.贪心算法求装载问题4.贪心算法求活动安排问题 5.快速排序 6.排列问题1分治法的基本思想时将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。2
15、设计动态规划算法的主要步骤为:(1)找出最优解的性质,并刻划其结构特征(2)递归地定义最优值(3)以自底向上的方式计算出最优值(4)根据计算最优值时得到的信息,构造最优解。3. 分治法与动态规划法的相同点是:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。两者的不同点是:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。4. 分支限界法与回溯法的相同点是:都是一种在问题的解空间树T中搜索问题解的算法。不同点:(1)求解目标不同;(2)搜索方式不同;(3)对扩展结点的扩展方式不同;(4
16、)存储空间的要求不同。5用回溯法搜索子集树的算法为:6. 分治法所能解决的问题一般具有的几个特征是:(1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)原问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。7. 用分支限界法设计算法的步骤是:(1)针对所给问题,定义问题的解空间(对解进行编码);分(2)确定易于搜索的解空间结构(按树或图组织解) ; (3)以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数
17、避免无效搜索。8. 常见的两种分支限界法的算法框架(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 (2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。9. 回溯法中常见的两类典型的解空间树是子集树和排列树。当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。这类子集树通常有2n个叶结点,遍历子集树需O(2n)计算时间 。当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。这类排列树通常有n!个叶结点。遍历排列树需要O(n!)计算时间。10. 分支限界法
18、的搜索策略是: 在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一扩展结点,加速搜索的进程,在每一个活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。 五)掌握分治算法实例:二分查找、合并排序、冒泡排序、矩阵乘法1、二分查找:例4 二分搜索问题给定排好序的线性表a0:n-1 二分搜索递归算法Binarysearch(a,n1,n2,x) if (n1n2) return(-1); m=(n1+n2)/2; if(x=am) r
19、eturn(m); else if(xam )Binarysearch(a,n1,m-1,x); else Binarysearch(a,m+1,n2,x); 复杂度O(logn)2、合并排序:例6 合并排序问题设线性表a1:n,将其按从小到大排序。基本思路: 1 将a1:n分为a1:n/2和an/2+1:n两个表 2 各自单独排序, 3 再将排好序的两个表合并为一个表合并排序算法Mergesort(a,left,right) if (leftright) i=(left+right)/2; Mergesort(a,left,i); Mergesort(a,i+1,right); Merge(
20、a,b,left,i,right); copy(a,b,left,right); 合并排序算法中合并算法Merge(a,b,left,I,right) k=left; k1=left; k2=i+1; while(k1=I and k2=right) if(ak1a k2) bk=ak1; k1+; k+; else bk=ak2; k2+; k+; if(k1=i) for(l=k2; l=right; l+) bk=a l; k+; else for(l=k1; l1解方程得:T(n)=n+6nlog2n=O(nlog2n)3、矩阵乘法:C11=A11B11+A12B21 C12=A11B
21、12+A12B22C21=A21B11+A22B21 C22=A21B12+A22B22成为8个n/2阶矩阵乘积,4个n/2阶矩阵加法。如果以数的乘法作为基本运算,则可得到分块矩阵乘法的递归方程 8 ( O(1) ) n=2 T(n)= 8T(n/2) n2 代入递归方程得 T(n)= n320世纪60年代末期。Strassen 给出了以下算法:M1=A11(B12-B22)M2=(A11+ A12) B22M3=(A21+ A22) B11M4=A22(B21-B11)M5=(A11+ A22)(B11+B22 )M6=(A12- A22) (B21+B22 )M7=(A11- A21) (
22、B11+B12 )C11=M5+M4- M2 + M6C12=M1+M2C12=M3+M4C11=M5+M1- M3 M7使用了7个n/2阶矩阵乘积,18个n/2阶矩阵加法,其算法复杂度为O(n2.81)2.81 =log27算法procedure STRASSEN(n,A,B,C);beginif n=2 then MATRIX-MULTIPLY(A,B,C)else begin将矩阵A和B依(1)式分块;STRASSEN(n/2,A11,B12-B22,M1);STRASSEN(n/2,A11+A12,B22,M2);STRASSEN(n/2,A21+A22,B11,M3);STRASSE
23、N(n/2,A22,B21-B11,M4);STRASSEN(n/2,A11+A22,B11+B22,M5);STRASSEN(n/2,A12-A22,B21+B22,M6);STRASSEN(n/2,A11-A21,B11+B12,M7); end; end;3、快速排序:例7 快速排序对输入的数组ap:r按以下三个步骤进行:(1) 分解(Divide),以ap为基准元素将ap:r划分为三部分: ap:q-1 ,aq ,aq+1:r,使得ap:q-1 中的元素小于aq , aq+1:r中的元素大于aq .(2) 递归求解(Conquer),通过递归调用快速排序算法分别对ap:q-1 ,aq+
24、1:r排序。(3) 合并(merge), 由于已排好序, 合并不需作什么.快速排序递归算法:Quicksort(a,p,r) if(p1解方程得: T(n)=n+nlog2n=O(nlog2n)最坏情况,每次q=p 或 q=r O(1) n=1 T(n)= T(n-1) +n n1解方程得: T(n)=O(n2)第三章(六)、掌握贪心策略基本思想及基本性质,并能证明贪心选择性质1、贪心策略基本思想:和动态规划类似, 贪心法用于多阶段的决策过程,每个阶段都有可供选择的多种决策,各个阶段的决策构成一个决策序列.贪心法的目标是选取一个最优的决策序列.2、基本性质:贪心法选择决策的原则是局部最优,而不
25、是全局最优。如果一个问题的整体最优解可以通过一系列局部最优选择来实现, 称该问题具有贪心选择性质.贪心选择性质是贪心法可行的一个基本要素.它是保证贪心法的求解结果为最优解的条件.最优子结构性质3、证明:(七)、掌握贪心策略实例:最小生成树、背包问题、作业调度问题1、背包问题:给定n个重量为(w1,w2,wn),价值为(v1,v2,vn)的物品和一个容量为C的背包,要求选择部分物品装进背包,使得背包内物品价值总和最大.1) 问题的解 (x1,x2,xn) 0 xi 12) 约束条件 xi wi C3) 目标函数 xi vi 达到最大解题思路:1) 尽可能多选择价值大的物品.2) 尽可能多选择重量
26、轻的物品.3) 尽可能多选择价值/重量比大的物品.贪心法的一般过程1) 根据题意选取一种度量标准或贪心策略.2) 按度量标准对n个输入排序.3) 按序做出贪心选择.4) 检查该选择是否与前面的选择构成可行解.5) 如果可行,则将该选择加入解中, 否则不加入.6) 继续做下一步选择.Greedy-knapsack( ) 将物品按v/w从大到小排序 for (i=1; i=n; i+) xi=0; for (i=1; i=n; i+) if (wic) xi=1; c=c-wi else xi=cu/wi; break; output x1xn 第四章(八)掌握动态规划的基本思想及解题步骤1、动态
27、规划的基本思想:动态规划是和过程最优化概念紧密联系的.在过程进行中,在客观条件允许范围内选择最好的措施控制过程的发展,以期最好的完成任务. 动态规划用于多阶段的决策过程,每个阶段都有可供选择的多种决策,各个阶段的决策构成一个决策序列.动态规划的目标是选取一个最优的决策序列2、解题步骤:动态规划法设计步骤 找出最优解的性质,并刻画其结构 (最优子结 构) 特征. 递归地定义最优值, 导出递推公式. 以自底向上的方式计算最优值. 根据计算最优值时得到的信息,构造最优解.形式:如:1 )问题的解: 边的序列, 每一步决策选择一条边 , , 2) 约束条件: 两个顶点之间有边存在3) 可行解: 满足约
28、束条件的解4) 目标函数: 解中边的权值和达到最小 5) 最优解: 使目标函数取极值的可行解(九)、掌握动态规划实例:投资分配问题、货币分配问题、0-1背包问题1、投资分配问题:总资源数为a,工程个数为n。给每个工程投资不同,所获得的利润也不同。现给定各个工程的资源利润表和资源总数,问:如何分配资源,才能获得最大利润。记Fn(a)为给n个工程投资资源数为a时可获得的最大利润,则有: Fn(a)=maxG1(x1)+G2(x2)+Gn(xn) x1+x2+xn=a如果给第n项工程投资x,给前n-1项工程投资a-x,则 Fn(a)=max Fn-1(a-x)+ Gn(x) X(0,1,a)记 Fk
29、(z)为给k个工程投资总资源数为z时可以获得的最大利润,则有递推公式: Fk(z)= max Fk-1(z-x)+ Gk(x) Z(0,1,a) X(0,1,z) F1(z)= G1(z)利用这一递推公式,我们可以得出该问题的算法。投资问题算法Investing( m,n,gij) for(j=0; j=m; j=j+1) f1j=g1j ; d1j=j for (i=2; i=n; i=i+1) for(j=0; j=m; j=j+1) fij=0 ; for( k=0; kfij) fij=s; dij=k 构造最优解 m 总投资数额。n 工程总项数。 gIJ 存放资源利润表,I为工程号,
30、J为投资数额构造最优解 s=m xn=dnm for (k=n-1; k0; k=k-1) s=s-xk+1 ; xk=dks; for(k=1; k=n; k=k+1) output xk output fnmdIJ 给前I项工程投资额为J,获最大利润时第I项的投资额2 0/1背包问题:给定n个重量为(w1,w2,wn),价值为(v1,v2,vn)的物品和一个容量为C的背包,要求选择部分物品装进背包,使得背包内物品价值总和最大.1) 问题的解 (x1,x2,xn) xi=0,12) 约束条件 xi wi= C3) 目标函数 xi vi 达到最大0/1背包问题的特征第一步决策第n种物品是否装入
31、背包.剩余问题是给定n-1个重量为(w1,w2,wn-1),价值为(v1,v2,vn-1)的物品和一个容量为C-wn*xn的背包的0/1背包问题.递归地定义最优值, 导出递推公式. V(n,c)=maxV(n-1,C), V(n-1, C-wn)+vn 0 i=0 V(i,j)= V(i-1,j) j=wi0/1背包问题的算法Knapsack( ) for(i=1; i=n; i+) vi0=0 for(j=1; j=C; j+) v0j=0 for(i=1; i=n; i+) for(j=1; j=C; j+) if(j=1; i-) if(vijvi-1j ) xi=1; j=j-wi e
32、lse xi=0; output xi; 第五、六章(十)、掌握回溯法和分支限界法的基本思想和搜索策略1、回溯法:从开始结点(根结点)出发,以深度优先方式搜索整个解空间。这个开始结点成为活结点,如果当前扩展节点处不能纵深方向移动,则当前扩展结点成为死结点。此时往回移动至最近的一个活结点处,并使这个活结点成为当前扩展结点,否则向纵深方向移至一个新结点,并成为新的活结点。直到找到所要求的解或空间中已无活结点时为止。(回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,)2、回溯法搜索策略
33、:以深度优先方式3、分支限界法:分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。4、分置限界法搜索策略:以广度优先或以最小耗费(最大效益)优先的方式(十一)、掌握实例:回溯法-n后问题,图的m着色。分支限界任务分配问题,旅行售-货员问题1、 n后问题:Eightqueen( ) x1=1; k=1; do if(xk=8) die=0 for (i=1; ik; i+) if (xi=xk) die=1; break if (xk-xi)=abs(k-i) die=1; break if(die=1) xk=xk+1 elsek=k+1; xk=1 else xk=1; k=k-1; xk=xk+1; while(k0) if(k8) output xi.x8 else output no solve 2、 图的m着色mcoloring( ) x1=1; k=1; do if(xk=m) die=0 for (i=1; ik; i+) if (xi=xk and cik=1) die=1; break if(die=1) xk=xk+1 elsek=k+1; xk=1 else xk=1; k=k-1; xk=xk+1; while(k0) if(kn) output xi.xn else output no solve