2023年8月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.以下算法常以自底向上的方式求解最优解的是( B )。
A、备忘录法B、动态规划法C、贪心法D、回溯法
6、衡量一个算法好坏的标准是(C )。
A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短
7、以下不可以使用分治法求解的是(D )。
A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题
8. 实现循环赛日程表利用的算法是( A )。
A、分治策略B、动态规划法C、贪心法D、回溯法
9.下面不是分支界限法搜索方式的是( D )。
A、广度优先B、最小耗费优先C、最大效益优先D、深度优先
10.以下算法常以深度优先方式系统搜索问题解的是( D )。
A、备忘录法B、动态规划法C、贪心法D、回溯法
11.备忘录方法是那种算法的变形。( B )
A、分治法 B、动态规划法C、贪心法D、回溯法
12.最长公共子序列算法利用的算法是( B )。
A、分支界限法B、动态规划法C、贪心法D、回溯法
13.实现棋盘覆盖算法利用的算法是( A )。
A、分治法 B、动态规划法C、贪心法D、回溯法
14.下面是贪心算法的基本要素的是( C )。
A、重叠子问题B、构造最优解C、贪心选择性质 D、定义最优解
1 / 17
15.回溯法的效率不依赖于以下哪些因素( D )
A.满足显约束的值的个数B. 计算约束函数的时间
C. 计算限界函数的时间 D. 确定解空间的时间
16.下面哪种函数是回溯法中为避免无效搜索采取的策略( B )
A.递归函数 B.剪枝函数 C.随机数函数 D.搜索函数
17.( D )是贪心算法与动态规划算法的共同点。
A、重叠子问题B、构造最优解C、贪心选择性质D、最优子结构性质
18. 矩阵连乘问题的算法可由( B)设计实现。
A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法
19. 分支限界法解旅行售货员问题时,活结点表的组织形式是( A )。
A、最小堆 B、最大堆 C、栈 D、数组
20、Strassen矩阵乘法是利用( A )实现的算法。
A、分治策略 B、动态规划法 C、贪心法 D、回溯法
21、使用分治法求解不需要满足的条件是(A )。
A 子问题必须是一样的
B 子问题不能够重复
C 子问题的解可以合并
D 原问题和子问题使用相同的方法解
22、下面问题(B )不能使用贪心法解决。
A 单源最短路径问题 B N皇后问题
C 最小花费生成树问题 D 背包问题
23、以下算法中不能解决0/1背包问题的是(A )
A 贪心法 B 动态规划 C 回溯法 D 分支限界法
24、回溯法搜索状态空间树是按照(C )的顺序。
A 中序遍历 B 广度优先遍历 C 深度优先遍历 D 层次优先遍历
25.实现合并排序利用的算法是( A )。
A、分治策略B、动态规划法C、贪心法D、回溯法
26.以下是动态规划算法基本要素的是(D )。
A、定义最优解B、构造最优解C、算出最优解D、子问题重叠性质
2 / 17
27.以下算法常以自底向下的方式求解最优解的是( B )。
A、分治法B、动态规划法C、贪心法D、回溯法
28.采用广度优先策略搜索的算法是( A )。
A、分支界限法B、动态规划法C、贪心法D、回溯法
29、合并排序算法是利用(A )实现的算法。
A、分治策略 B、动态规划法 C、贪心法 D、回溯法
30、背包问题的贪心算法所需的计算时间为( B )
A、O(n2n) B、O(nlogn) C、O(2n) D、O(n)
31.实现大整数的乘法是利用的算法(C )。
A、贪心法B、动态规划法C、分治策略D、回溯法
32.0-1背包问题的回溯算法所需的计算时间为( A )
A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)
33.采用最大效益优先搜索方式的算法是( A )。
A、分支界限法B、动态规划法C、贪心法D、回溯法
34.贪心算法与动态规划算法的主要区别是( B )。
A、最优子结构B、贪心选择性质 C、构造最优解D、定义最优解
35.优先队列式分支限界法选取扩展结点的原则是( C )。
A、先进先出 B、后进先出 C、结点的优先级 D、随机
36.背包问题的贪心算法所需的计算时间为( B )。
A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)
37、广度优先是( A )的搜索方式。
A、分支界限法 B、动态规划法 C、贪心法 D、回溯法
38. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的(B )。
A、重叠子问题B、最优子结构性质 C、贪心选择性质 D、定义最优解
39.采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为 (B) 。
A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)
40. 以深度优先方式系统搜索问题解的算法称为( D )。
A、分支界限算法B、概率算法 C、贪心算法 D、回溯算法
3 / 17
41. 实现最长公共子序列利用的算法是( B )。
A、分治策略B、动态规划法C、贪心法D、回溯法
42、算法是由若干条指令组成的有穷序列,而且满足以下性质( D)
(1) 输入:有0个或多个输入
(2) 输出:至少有一个输出
(3) 确定性:指令清晰,无歧义
(4) 有限性:指令执行次数有限,而且执行时间有限
A (1)(2)(3) B(1)(2)(4) C(1)(3)(4) D (1) (2)(3)(4)
43、函数32n+10nlogn的渐进表达式是( B ).
A. 2nB. 32nC. nlognD. 10nlogn44、大整数乘法算法是( A ).算法
A.分治 B.贪心C.动态规划 D.穷举45、解决活动安排问题,最好用(B )算法
A.分治 B.贪心C.动态规划 D.穷举
46、设f(N),g(N)是定义在正数集上的正函数,如果存在正的常数C和自然数N0,使得当N≥N0时有f(N)≤Cg(N),则称函数f(N)当N充分大时有下界g(N),记作
f(N)∈○(g(N)),即f(N)的阶( A )g(N)的阶.
A.不高于 B.不低于C.等价于 D.逼近
47、回溯法在解空间树T上的搜索方式是( A ).
A.深度优先 B.广度优先C.最小耗费优先 D.活结点优先
48、回溯算法和分支限界法的问题的解空间树不会是(D).
A.有序树 B.子集树C.排列树 D.无序树
49、在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( B ).
A.回溯法 B.分支限界法C.回溯法和分支限界法 D.回溯法求解子集树问题
50、从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( C )之外都是最常见的方式.
A.队列式分支限界法 B.优先队列式分支限界法
C.栈式分支限界法 分支限界法
二、 填空题
1.算法的复杂性有 时间 复杂性和 空间 复杂性之分。
4 / 17
2、程序是算法用某种程序设计语言的具体实现。
3、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的。
4.矩阵连乘问题的算法可由 动态规划 设计实现。
5、算法是指解决问题的 一种方法 或 一个过程 。
6、从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法 。
7、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特征。
8、以深度优先方式系统搜索问题解的算法称为 回溯法 。
9、计算一个算法时间复杂度通常可以计算循环次数 、基本操作的频率或计算步。
10、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是动态规划,需要排序的是回溯法,分支限界法。
11、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是0/1背包问题,只使用约束条件进行裁剪的是N皇后问题。
12、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
13、矩阵连乘问题的算法可由 动态规划 设计实现。
14.贪心算法的基本要素是 贪心选择 性质和 最优子结构 性质 。
15. 动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解 子问题 ,然后从这些 子问题 的解得到原问题的解。
16.算法是由若干条指令组成的有穷序列,且要满足输入、 输出 、确定性和 有限性 四条性质。
17、大整数乘积算法是用 分治法 来设计的。
18、以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。
19、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
20.快速排序算法是基于 分治策略 的一种排序算法。
21.动态规划算法的两个基本要素是最优子结构性质和重叠子问题
5 / 17
性质 。
22.回溯法是一种既带有 系统性又带有跳跃性的搜索算法。
23.分支限界法主要有队列式(FIFO)分支限界法和 优先队列式分支限界法。
24.分支限界法是一种既带有系统性又带有跳跃性 的搜索算法。
25.回溯法搜索解空间树时,常用的两种剪枝函数为约束函数 和限界函数。
26.任何可用计算机求解的问题所需的时间都与其 规模 有关。
27.快速排序算法的性能取决于 划分的对称性 。
28. Prim算法利用贪心策略求解最小生成树问题,其时间复杂度是 O(n2)。
29. 图的m着色问题可用 回溯法求解,其解空间树中叶子结点个数是mn,解空间树中每个结点的孩子数是 m。
三、算法的程序填空
1.背包问题的贪心算法
void Knapsack(int n,float M,float v[],float w[],float x[])
{
Sort(n,v,w);
int i;
for (i=1;i<=n;i++) x[i]=0;
float c=M;
for (i=1;i<=n;i++) {
if (w[i]>c) break;
x[i]=1;
c - =w[i];
}
if (i<=n) x[i]=c/w[i];
}
2.最大子段和: 动态规划算法
int MaxSum(int n, int a[])
{
int sum=0, b=0; //sum存储当前最大的b[j], b存储b[j]
6 / 17
for(int j=1; j<=n; j++) {
if (b>0) b+= a[j] ;
else b=a[i]; ;//一旦某个区段和为负,则从下一个位置累和
if(b>sum) sum=b;
}
return sum;
}
3.快速排序
template
void QuickSort (Type a[], int p, int r)
{
if (p int q=Partition(a,p,r); QuickSort (a,p,q-1); //对左半段排序 QuickSort (a,q+1,r); //对右半段排序 } } 4.排列问题 Template void perm(Type list[], int k, int m ) { //产生[list[k:m]的所有排列 if(k==m) { //只剩下一个元素 for (int i=0;i<=m;i++) cout< cout< } else //还有多个元素待排列,递归产生排列 for (int i=k; i<=m; i++) { 7 / 17 swap(list[k],list[i]); perm(list,k+1;m); swap(list[k],list[i]); } } 5.给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。 据此容易设计出二分搜索算法: template 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; } 6、合并排序描述如下:template void Mergesort(Type a[ ], int left, int right) { if (left int i=(left+right)/2; Mergesort(a, left, i ); Mergesort(a, i+1, right); Merge(a,b, left,i,right);//合并到数组b Copy(a,b, left,right );//复制到数组a } } 8 / 17 7、分治法求最大、最小元 template void SortableList { //前置条件:i和j,0≤i≤j<表长,是表的下标围的界 T min1, max1; if (i==j) max=min=l[i]; else if (i==j-1) //表中只有一个元素时 //表中有两个元素时 if (l[i] } else { } //表中多于两个元素时 //对半分割 //求前半部子表中的最大、最小元 max=l[i]; min=l[j]; max=l[j]; min=l[i]; else { } int m=(i+j)/2; MaxMin(i, m, max, min); MaxMin(m+1, j, max1, min1) //求后半部子表中的最大、最小元 if (max if (min>min1) min=min1; //两子表最小元的小者为原表最小元 四、问答题 1.用计算机求解问题的步骤: 1、问题分析2、数学模型建立3、算法设计与选择4、算法指标5、算法分析6、算法实现7、程序调试8、结果整理文档编制 2. 算法定义: 算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程 3.算法的三要素(1)操作(2)控制结构(3)数据结构 4. 算法具有以下5个属性: 9 / 17 有穷性:一个算法必须总是在执行有穷步之后完毕,且每一步都在有穷时间完成。 确定性:算法中每一条指令必须有确切的含义。不存在二义性。只有一个入口和一个出口 可行性:一个算法是可行的就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。 输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。 输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。 5. 算法设计的质量指标: 正确性:算法应满足具体问题的需求; 可读性:算法应该好读,以有利于读者对程序的理解; 健壮性:算法应具有容错处理,当输入为非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。 效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般这两者与问题的规模有关。 经常采用的算法主要有迭代法、分治法、贪婪法、动态规划法、回溯法、分支限界法 6. 迭代法: 也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。 7.利用迭代算法解决问题,需要做好以下三个方面的工作: 1)、确定迭代模型。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 2)、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 3)、对迭代过程进行控制。在什么时候完毕迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实10 / 17 现对迭代过程的控制;对于后一种情况,需要进一步分析出用来完毕迭代过程的条件。 8.分治法的基本思想是: 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。 9.分治法所能解决的问题一般具有以下几个特征: (1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 10、分治法的基本步骤 分治法在每一层递归上都有三个步骤: (1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; (2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题; (3)合并:将各个子问题的解合并为原问题的解。 11. 动态规划的基本思想 前文主要介绍了动态规划的一些理论依据,我们将前文所说的具有明显的阶段划分和状态转移方程的动态规划称为标准动态规划,这种标准动态规划是在研究多阶段决策问题时推导出来的,具有严格的数学形式,适合用于理论上的分析。在实际应用中,许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦。一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决。 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例11 / 17 分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 由此可知,动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。 贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择; 而分治法中的各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。 不足之处:如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。 解决上述问题的方法是利用动态规划。该方法主要应用于最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。若存在若干个取最优值的解的话,它只取其中的一个。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。 因此,动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。 12、动态规划算法的基本步骤 设计一个标准的动态规划算法,通常可按以下几个步骤进行: (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。注意这若干个阶段一定要是有序的或者是可排序的(即无后向性),否则问题就无法用动态规划求解。 (2)选择状态:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。 12 / 17 (3)确定决策并写出状态转移方程:之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以,如果我们确定了决策,状态转移方程也就写出来了。但事实上,我们常常是反过来做,根据相邻两段的各状态之间的关系来确定决策。 (4)写出规划方程(包括边界条件):动态规划的基本方程是规划方程的通用形式化表达式。 一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。根据动态规划的基本方程可以直接递归计算最优值,但是一般将其改为递推计算。实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行: (1)分析最优解的性质,并刻划其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。 (4)根据计算最优值时得到的信息,构造一个最优解。 步骤(1)~(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省略,若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速地构造出一个最优解。 总结:动态规划实际上就是最优化的问题,是指将原问题的大实例等价于同一最优化问题的较小实例,自底向上的求解最小实例,并将所求解存放起来,存放的结果就是为了准备数据。与递归相比,递归是不断的调用子程序求解,是自顶向下的调用和求解。 13. 分治法与动态规划法的相同点是: 将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 两者的不同点是:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。 13 / 17 14. 回溯法 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。 15. 分支限界法: 这是一种用于求解组合优化问题的排除非解的搜索算法。类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间。然而与回溯法不同的是,回溯算法使用深度优先方法搜索树结构,而分枝定界一般用宽度优先或最小耗费方法来搜索这些树。因此,可以很容易比较回溯法与分枝定界法的异同。相对而言,分枝定界算法的解空间比回溯法大得多,因此当存容量有限时,回溯法成功的可能性更大。 算法思想:分枝限界(branch and bound)是另一种系统地搜索解空间的方法,它与回溯法的主要区别在于对E-节点的扩充方式。每个活节点有且仅有一次机会变成E-节点。当一个节点变为E-节点时,则生成从该节点移动一步即可到达的所有新节点。在生成的节点中,抛弃那些不可能导出(最优)可行解的节点,其余节点加入活节点表,然后从表中选择一个节点作为下一个E-节点。从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过程才完毕。 有两种常用的方法可用来选择下一个E-节点(虽然也可能存在其他的方法): 1) 先进先出(F I F O)即从活节点表中取出节点的顺序与加入节点的顺序相同,因此活 节点表的性质与队列相同。 2) (优先队列)最小耗费或最大收益法在这种模式中,每个节点都有一个对应的耗费或收益。如果查找一个具有最小耗费的解,则活节点表可用最小堆来建立,下一个E-节点就是具有最小耗费的活节点;如果希望搜索一个具有最大收益的14 / 17 解,则可用最大堆来构造活节点表,下一个 E-节点是具有最大收益的活节点 16. 分支限界法与回溯法的相同点是:都是一种在问题的解空间树T中搜索问题解的算法。 不同点:(1)求解目标不同; (2)搜索方式不同; (3)对扩展结点的扩展方式不同; (4)存储空间的要求不同。 17.分治法所能解决的问题一般具有的几个特征是: (1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)原问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 18.用分支限界法设计算法的步骤是: (1)针对所给问题,定义问题的解空间(对解进行编码); (2)确定易于搜索的解空间结构(按树或图组织解) ; (3)以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 19. 常见的两种分支限界法的算法框架: (1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 (2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。 20. 回溯法中常见的两类典型的解空间树是子集树和排列树。 当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。这类子集树通常有2n个叶结点,遍历子集树需O(2n)计算时间 。 当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称15 / 17 为排列树。这类排列树通常有n!个叶结点。遍历排列树需要O(n!)计算时间。 21. 分支限界法的搜索策略是: 在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一扩展结点,加速搜索的进程,在每一个活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。 22. 请表达动态规划算法与贪心算法的异同。 共同点: 都需要最优子结构性质, 都用来求有优化问题。 不同点: 动态规划:每一步作一个选择---依赖于子问题的解。 贪心方法:每一步作一个选择---不依赖于子问题的解。 动态规划方法的条件:子问题的重叠性质。 可用贪心方法的条件:最优子结构性质;贪心选择性质。 动态规划:自底向上求解; 贪心方法:自顶向下求解。 可用贪心法时,动态规划方法可能不适用; 可用动态规划方法时,贪心法可能不适用。 23. 请说明动态规划方法为什么需要最优子结构性质。 答:最优子结构性质是指大问题的最优解包含子问题的最优解。 动态规划方法是自底向上计算各个子问题的最优解,即先计算子问题的最优解,然后再利用子问题的最优解构造大问题的最优解,因此需要最优子结构. 24. 请说明: (1)优先队列可用什么数据结构实现? (2)优先队列插入算法基本思想? (3)优先队列插入算法时间复杂度? 答:(1)堆。 16 / 17 (2)在小根堆中,将元素x插入到堆的末尾, 然后将元素x的关键字与其双亲的关键字比较, 若元素x的关键字小于其双亲的关键字, 则将元素x与其双亲交换,然后再将元素x与其新双亲的关键字相比,直到元素x的关键字大于双亲的关键字,或元素x到根为止。 (3)O( log n) 25. 衡量算法时间效率的方法有哪两种?请表达。 答:有事前分析法和事后分析法两种。 事后分析法:先将算法用程序设计语言实现,然后度量程序的运行时间。 事前分析法:算法的时间效率是问题规模的函数,假如,随着问题规模n的增长,算法执行时间的增长率和函数f(n)的增长率相同,则可记作: T(n)=○(f(n)) 称T(n)为算法的渐进时间复杂度。简称时间复杂度。 26. 在算法复杂性分析中,O、Ω、Θ这三个记号的意义是什么?在忽略常数因子的情况下,O、Ω、Θ分别提供了算法运行时间的什么界? 答: 如果存在两个正常数c和N0,对于所有的N≥N0,有|f(N)|≤C|g(N)|,则记作:f(N)= O(g(N))。这时我们说f(N)的阶不高于g(N)的阶。 若存在两个正常数C和自然数N0,使得当N≥N0时有|f(N)|≥C|g(N)|,记为f(N)=Ω(g(N))。这时我们说f(N)的阶不低于g(N)的阶。 如果存在正常数c1,c2和n0,对于所有的n≥n0,有c1|g(N)| ≤|f(N)| ≤ c2|g(N)| 则记作f(N)= (g,(N)) O、Ω、Θ分别提供了算法运行时间的上界、下界、平均 17 / 17 2023年8月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.以下算法常以自底向上的方式求解最优解的是( B )。 A、备忘录法B、动态规划法C、贪心法D、回溯法 6、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是( A )。 A、分治策略B、动态规划法C、贪心法D、回溯法 9.下面不是分支界限法搜索方式的是( D )。 A、广度优先B、最小耗费优先C、最大效益优先D、深度优先 10.以下算法常以深度优先方式系统搜索问题解的是( D )。 A、备忘录法B、动态规划法C、贪心法D、回溯法 11.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法C、贪心法D、回溯法 12.最长公共子序列算法利用的算法是( B )。 A、分支界限法B、动态规划法C、贪心法D、回溯法 13.实现棋盘覆盖算法利用的算法是( A )。 A、分治法 B、动态规划法C、贪心法D、回溯法 14.下面是贪心算法的基本要素的是( C )。 A、重叠子问题B、构造最优解C、贪心选择性质 D、定义最优解 1 / 17 15.回溯法的效率不依赖于以下哪些因素( D ) A.满足显约束的值的个数B. 计算约束函数的时间 C. 计算限界函数的时间 D. 确定解空间的时间 16.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数 C.随机数函数 D.搜索函数 17.( D )是贪心算法与动态规划算法的共同点。 A、重叠子问题B、构造最优解C、贪心选择性质D、最优子结构性质 18. 矩阵连乘问题的算法可由( B)设计实现。 A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法 19. 分支限界法解旅行售货员问题时,活结点表的组织形式是( A )。 A、最小堆 B、最大堆 C、栈 D、数组 20、Strassen矩阵乘法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 21、使用分治法求解不需要满足的条件是(A )。 A 子问题必须是一样的 B 子问题不能够重复 C 子问题的解可以合并 D 原问题和子问题使用相同的方法解 22、下面问题(B )不能使用贪心法解决。 A 单源最短路径问题 B N皇后问题 C 最小花费生成树问题 D 背包问题 23、以下算法中不能解决0/1背包问题的是(A ) A 贪心法 B 动态规划 C 回溯法 D 分支限界法 24、回溯法搜索状态空间树是按照(C )的顺序。 A 中序遍历 B 广度优先遍历 C 深度优先遍历 D 层次优先遍历 25.实现合并排序利用的算法是( A )。 A、分治策略B、动态规划法C、贪心法D、回溯法 26.以下是动态规划算法基本要素的是(D )。 A、定义最优解B、构造最优解C、算出最优解D、子问题重叠性质 2 / 17 27.以下算法常以自底向下的方式求解最优解的是( B )。 A、分治法B、动态规划法C、贪心法D、回溯法 28.采用广度优先策略搜索的算法是( A )。 A、分支界限法B、动态规划法C、贪心法D、回溯法 29、合并排序算法是利用(A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 30、背包问题的贪心算法所需的计算时间为( B ) A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 31.实现大整数的乘法是利用的算法(C )。 A、贪心法B、动态规划法C、分治策略D、回溯法 32.0-1背包问题的回溯算法所需的计算时间为( A ) A、O(n2n)B、O(nlogn)C、O(2n)D、O(n) 33.采用最大效益优先搜索方式的算法是( A )。 A、分支界限法B、动态规划法C、贪心法D、回溯法 34.贪心算法与动态规划算法的主要区别是( B )。 A、最优子结构B、贪心选择性质 C、构造最优解D、定义最优解 35.优先队列式分支限界法选取扩展结点的原则是( C )。 A、先进先出 B、后进先出 C、结点的优先级 D、随机 36.背包问题的贪心算法所需的计算时间为( B )。 A、O(n2n)B、O(nlogn)C、O(2n)D、O(n) 37、广度优先是( A )的搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 38. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的(B )。 A、重叠子问题B、最优子结构性质 C、贪心选择性质 D、定义最优解 39.采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为 (B) 。 A、O(n2n)B、O(nlogn)C、O(2n)D、O(n) 40. 以深度优先方式系统搜索问题解的算法称为( D )。 A、分支界限算法B、概率算法 C、贪心算法 D、回溯算法 3 / 17 41. 实现最长公共子序列利用的算法是( B )。 A、分治策略B、动态规划法C、贪心法D、回溯法 42、算法是由若干条指令组成的有穷序列,而且满足以下性质( D) (1) 输入:有0个或多个输入 (2) 输出:至少有一个输出 (3) 确定性:指令清晰,无歧义 (4) 有限性:指令执行次数有限,而且执行时间有限 A (1)(2)(3) B(1)(2)(4) C(1)(3)(4) D (1) (2)(3)(4) 43、函数32n+10nlogn的渐进表达式是( B ). A. 2nB. 32nC. nlognD. 10nlogn44、大整数乘法算法是( A ).算法 A.分治 B.贪心C.动态规划 D.穷举45、解决活动安排问题,最好用(B )算法 A.分治 B.贪心C.动态规划 D.穷举 46、设f(N),g(N)是定义在正数集上的正函数,如果存在正的常数C和自然数N0,使得当N≥N0时有f(N)≤Cg(N),则称函数f(N)当N充分大时有下界g(N),记作 f(N)∈○(g(N)),即f(N)的阶( A )g(N)的阶. A.不高于 B.不低于C.等价于 D.逼近 47、回溯法在解空间树T上的搜索方式是( A ). A.深度优先 B.广度优先C.最小耗费优先 D.活结点优先 48、回溯算法和分支限界法的问题的解空间树不会是(D). A.有序树 B.子集树C.排列树 D.无序树 49、在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( B ). A.回溯法 B.分支限界法C.回溯法和分支限界法 D.回溯法求解子集树问题 50、从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( C )之外都是最常见的方式. A.队列式分支限界法 B.优先队列式分支限界法 C.栈式分支限界法 分支限界法 二、 填空题 1.算法的复杂性有 时间 复杂性和 空间 复杂性之分。 4 / 17 2、程序是算法用某种程序设计语言的具体实现。 3、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的。 4.矩阵连乘问题的算法可由 动态规划 设计实现。 5、算法是指解决问题的 一种方法 或 一个过程 。 6、从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法 。 7、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特征。 8、以深度优先方式系统搜索问题解的算法称为 回溯法 。 9、计算一个算法时间复杂度通常可以计算循环次数 、基本操作的频率或计算步。 10、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是动态规划,需要排序的是回溯法,分支限界法。 11、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是0/1背包问题,只使用约束条件进行裁剪的是N皇后问题。 12、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。 13、矩阵连乘问题的算法可由 动态规划 设计实现。 14.贪心算法的基本要素是 贪心选择 性质和 最优子结构 性质 。 15. 动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解 子问题 ,然后从这些 子问题 的解得到原问题的解。 16.算法是由若干条指令组成的有穷序列,且要满足输入、 输出 、确定性和 有限性 四条性质。 17、大整数乘积算法是用 分治法 来设计的。 18、以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。 19、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。 20.快速排序算法是基于 分治策略 的一种排序算法。 21.动态规划算法的两个基本要素是最优子结构性质和重叠子问题 5 / 17 性质 。 22.回溯法是一种既带有 系统性又带有跳跃性的搜索算法。 23.分支限界法主要有队列式(FIFO)分支限界法和 优先队列式分支限界法。 24.分支限界法是一种既带有系统性又带有跳跃性 的搜索算法。 25.回溯法搜索解空间树时,常用的两种剪枝函数为约束函数 和限界函数。 26.任何可用计算机求解的问题所需的时间都与其 规模 有关。 27.快速排序算法的性能取决于 划分的对称性 。 28. Prim算法利用贪心策略求解最小生成树问题,其时间复杂度是 O(n2)。 29. 图的m着色问题可用 回溯法求解,其解空间树中叶子结点个数是mn,解空间树中每个结点的孩子数是 m。 三、算法的程序填空 1.背包问题的贪心算法 void Knapsack(int n,float M,float v[],float w[],float x[]) { Sort(n,v,w); int i; for (i=1;i<=n;i++) x[i]=0; float c=M; for (i=1;i<=n;i++) { if (w[i]>c) break; x[i]=1; c - =w[i]; } if (i<=n) x[i]=c/w[i]; } 2.最大子段和: 动态规划算法 int MaxSum(int n, int a[]) { int sum=0, b=0; //sum存储当前最大的b[j], b存储b[j] 6 / 17 for(int j=1; j<=n; j++) { if (b>0) b+= a[j] ; else b=a[i]; ;//一旦某个区段和为负,则从下一个位置累和 if(b>sum) sum=b; } return sum; } 3.快速排序 template void QuickSort (Type a[], int p, int r) { if (p int q=Partition(a,p,r); QuickSort (a,p,q-1); //对左半段排序 QuickSort (a,q+1,r); //对右半段排序 } } 4.排列问题 Template void perm(Type list[], int k, int m ) { //产生[list[k:m]的所有排列 if(k==m) { //只剩下一个元素 for (int i=0;i<=m;i++) cout< cout< } else //还有多个元素待排列,递归产生排列 for (int i=k; i<=m; i++) { 7 / 17 swap(list[k],list[i]); perm(list,k+1;m); swap(list[k],list[i]); } } 5.给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。 据此容易设计出二分搜索算法: template 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; } 6、合并排序描述如下:template void Mergesort(Type a[ ], int left, int right) { if (left int i=(left+right)/2; Mergesort(a, left, i ); Mergesort(a, i+1, right); Merge(a,b, left,i,right);//合并到数组b Copy(a,b, left,right );//复制到数组a } } 8 / 17 7、分治法求最大、最小元 template void SortableList { //前置条件:i和j,0≤i≤j<表长,是表的下标围的界 T min1, max1; if (i==j) max=min=l[i]; else if (i==j-1) //表中只有一个元素时 //表中有两个元素时 if (l[i] } else { } //表中多于两个元素时 //对半分割 //求前半部子表中的最大、最小元 max=l[i]; min=l[j]; max=l[j]; min=l[i]; else { } int m=(i+j)/2; MaxMin(i, m, max, min); MaxMin(m+1, j, max1, min1) //求后半部子表中的最大、最小元 if (max if (min>min1) min=min1; //两子表最小元的小者为原表最小元 四、问答题 1.用计算机求解问题的步骤: 1、问题分析2、数学模型建立3、算法设计与选择4、算法指标5、算法分析6、算法实现7、程序调试8、结果整理文档编制 2. 算法定义: 算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程 3.算法的三要素(1)操作(2)控制结构(3)数据结构 4. 算法具有以下5个属性: 9 / 17 有穷性:一个算法必须总是在执行有穷步之后完毕,且每一步都在有穷时间完成。 确定性:算法中每一条指令必须有确切的含义。不存在二义性。只有一个入口和一个出口 可行性:一个算法是可行的就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。 输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。 输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。 5. 算法设计的质量指标: 正确性:算法应满足具体问题的需求; 可读性:算法应该好读,以有利于读者对程序的理解; 健壮性:算法应具有容错处理,当输入为非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。 效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般这两者与问题的规模有关。 经常采用的算法主要有迭代法、分治法、贪婪法、动态规划法、回溯法、分支限界法 6. 迭代法: 也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。 7.利用迭代算法解决问题,需要做好以下三个方面的工作: 1)、确定迭代模型。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 2)、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 3)、对迭代过程进行控制。在什么时候完毕迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实10 / 17 现对迭代过程的控制;对于后一种情况,需要进一步分析出用来完毕迭代过程的条件。 8.分治法的基本思想是: 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。 9.分治法所能解决的问题一般具有以下几个特征: (1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 10、分治法的基本步骤 分治法在每一层递归上都有三个步骤: (1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; (2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题; (3)合并:将各个子问题的解合并为原问题的解。 11. 动态规划的基本思想 前文主要介绍了动态规划的一些理论依据,我们将前文所说的具有明显的阶段划分和状态转移方程的动态规划称为标准动态规划,这种标准动态规划是在研究多阶段决策问题时推导出来的,具有严格的数学形式,适合用于理论上的分析。在实际应用中,许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦。一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决。 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例11 / 17 分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 由此可知,动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。 贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择; 而分治法中的各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。 不足之处:如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。 解决上述问题的方法是利用动态规划。该方法主要应用于最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。若存在若干个取最优值的解的话,它只取其中的一个。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。 因此,动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。 12、动态规划算法的基本步骤 设计一个标准的动态规划算法,通常可按以下几个步骤进行: (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。注意这若干个阶段一定要是有序的或者是可排序的(即无后向性),否则问题就无法用动态规划求解。 (2)选择状态:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。 12 / 17 (3)确定决策并写出状态转移方程:之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以,如果我们确定了决策,状态转移方程也就写出来了。但事实上,我们常常是反过来做,根据相邻两段的各状态之间的关系来确定决策。 (4)写出规划方程(包括边界条件):动态规划的基本方程是规划方程的通用形式化表达式。 一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。根据动态规划的基本方程可以直接递归计算最优值,但是一般将其改为递推计算。实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行: (1)分析最优解的性质,并刻划其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。 (4)根据计算最优值时得到的信息,构造一个最优解。 步骤(1)~(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省略,若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速地构造出一个最优解。 总结:动态规划实际上就是最优化的问题,是指将原问题的大实例等价于同一最优化问题的较小实例,自底向上的求解最小实例,并将所求解存放起来,存放的结果就是为了准备数据。与递归相比,递归是不断的调用子程序求解,是自顶向下的调用和求解。 13. 分治法与动态规划法的相同点是: 将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 两者的不同点是:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。 13 / 17 14. 回溯法 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。 15. 分支限界法: 这是一种用于求解组合优化问题的排除非解的搜索算法。类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间。然而与回溯法不同的是,回溯算法使用深度优先方法搜索树结构,而分枝定界一般用宽度优先或最小耗费方法来搜索这些树。因此,可以很容易比较回溯法与分枝定界法的异同。相对而言,分枝定界算法的解空间比回溯法大得多,因此当存容量有限时,回溯法成功的可能性更大。 算法思想:分枝限界(branch and bound)是另一种系统地搜索解空间的方法,它与回溯法的主要区别在于对E-节点的扩充方式。每个活节点有且仅有一次机会变成E-节点。当一个节点变为E-节点时,则生成从该节点移动一步即可到达的所有新节点。在生成的节点中,抛弃那些不可能导出(最优)可行解的节点,其余节点加入活节点表,然后从表中选择一个节点作为下一个E-节点。从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过程才完毕。 有两种常用的方法可用来选择下一个E-节点(虽然也可能存在其他的方法): 1) 先进先出(F I F O)即从活节点表中取出节点的顺序与加入节点的顺序相同,因此活 节点表的性质与队列相同。 2) (优先队列)最小耗费或最大收益法在这种模式中,每个节点都有一个对应的耗费或收益。如果查找一个具有最小耗费的解,则活节点表可用最小堆来建立,下一个E-节点就是具有最小耗费的活节点;如果希望搜索一个具有最大收益的14 / 17 解,则可用最大堆来构造活节点表,下一个 E-节点是具有最大收益的活节点 16. 分支限界法与回溯法的相同点是:都是一种在问题的解空间树T中搜索问题解的算法。 不同点:(1)求解目标不同; (2)搜索方式不同; (3)对扩展结点的扩展方式不同; (4)存储空间的要求不同。 17.分治法所能解决的问题一般具有的几个特征是: (1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)原问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 18.用分支限界法设计算法的步骤是: (1)针对所给问题,定义问题的解空间(对解进行编码); (2)确定易于搜索的解空间结构(按树或图组织解) ; (3)以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 19. 常见的两种分支限界法的算法框架: (1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 (2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。 20. 回溯法中常见的两类典型的解空间树是子集树和排列树。 当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。这类子集树通常有2n个叶结点,遍历子集树需O(2n)计算时间 。 当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称15 / 17 为排列树。这类排列树通常有n!个叶结点。遍历排列树需要O(n!)计算时间。 21. 分支限界法的搜索策略是: 在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一扩展结点,加速搜索的进程,在每一个活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。 22. 请表达动态规划算法与贪心算法的异同。 共同点: 都需要最优子结构性质, 都用来求有优化问题。 不同点: 动态规划:每一步作一个选择---依赖于子问题的解。 贪心方法:每一步作一个选择---不依赖于子问题的解。 动态规划方法的条件:子问题的重叠性质。 可用贪心方法的条件:最优子结构性质;贪心选择性质。 动态规划:自底向上求解; 贪心方法:自顶向下求解。 可用贪心法时,动态规划方法可能不适用; 可用动态规划方法时,贪心法可能不适用。 23. 请说明动态规划方法为什么需要最优子结构性质。 答:最优子结构性质是指大问题的最优解包含子问题的最优解。 动态规划方法是自底向上计算各个子问题的最优解,即先计算子问题的最优解,然后再利用子问题的最优解构造大问题的最优解,因此需要最优子结构. 24. 请说明: (1)优先队列可用什么数据结构实现? (2)优先队列插入算法基本思想? (3)优先队列插入算法时间复杂度? 答:(1)堆。 16 / 17 (2)在小根堆中,将元素x插入到堆的末尾, 然后将元素x的关键字与其双亲的关键字比较, 若元素x的关键字小于其双亲的关键字, 则将元素x与其双亲交换,然后再将元素x与其新双亲的关键字相比,直到元素x的关键字大于双亲的关键字,或元素x到根为止。 (3)O( log n) 25. 衡量算法时间效率的方法有哪两种?请表达。 答:有事前分析法和事后分析法两种。 事后分析法:先将算法用程序设计语言实现,然后度量程序的运行时间。 事前分析法:算法的时间效率是问题规模的函数,假如,随着问题规模n的增长,算法执行时间的增长率和函数f(n)的增长率相同,则可记作: T(n)=○(f(n)) 称T(n)为算法的渐进时间复杂度。简称时间复杂度。 26. 在算法复杂性分析中,O、Ω、Θ这三个记号的意义是什么?在忽略常数因子的情况下,O、Ω、Θ分别提供了算法运行时间的什么界? 答: 如果存在两个正常数c和N0,对于所有的N≥N0,有|f(N)|≤C|g(N)|,则记作:f(N)= O(g(N))。这时我们说f(N)的阶不高于g(N)的阶。 若存在两个正常数C和自然数N0,使得当N≥N0时有|f(N)|≥C|g(N)|,记为f(N)=Ω(g(N))。这时我们说f(N)的阶不低于g(N)的阶。 如果存在正常数c1,c2和n0,对于所有的n≥n0,有c1|g(N)| ≤|f(N)| ≤ c2|g(N)| 则记作f(N)= (g,(N)) O、Ω、Θ分别提供了算法运行时间的上界、下界、平均 17 / 17
发布评论