算法分析考试题
算法分析复习题目及答案.

一、选择题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、动态规划法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.下列算法中通常以深度优先方式系统搜索问题解的是( 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 )。
数据结构与算法分析考试试题

数据结构与算法分析考试试题一、选择题(共 20 小题,每小题 3 分,共 60 分)1、在一个具有 n 个元素的顺序表中,查找一个元素的平均时间复杂度为()A O(n)B O(logn)C O(nlogn)D O(n²)2、以下数据结构中,哪一个不是线性结构()A 栈B 队列C 二叉树D 线性表3、一个栈的入栈序列是 1,2,3,4,5,则栈的不可能的出栈序列是()A 5,4,3,2,1B 4,5,3,2,1C 4,3,5,1,2D 1,2,3,4,54、若一棵二叉树的先序遍历序列为 ABCDEFG,中序遍历序列为CBDAEGF,则其后序遍历序列为()A CDBGFEAB CDBFGEAC CDBAGFED BCDAGFE5、具有 n 个顶点的无向完全图的边数为()A n(n 1)B n(n 1) / 2C n(n + 1) / 2D n²6、以下排序算法中,在最坏情况下时间复杂度不是O(n²)的是()A 冒泡排序B 选择排序C 插入排序D 快速排序7、在一个长度为 n 的顺序表中,删除第 i 个元素(1≤i≤n)时,需要向前移动()个元素。
A n iB iC n i + 1D n i 18、对于一个具有 n 个顶点和 e 条边的有向图,其邻接表表示中,所有顶点的边表中边的总数为()A eB 2eC e/2D n(e 1)9、以下关于哈夫曼树的描述,错误的是()A 哈夫曼树是带权路径长度最短的二叉树B 哈夫曼树中没有度为 1 的节点C 哈夫曼树中两个权值最小的节点一定是兄弟节点D 哈夫曼树中每个节点的权值等于其左右子树权值之和10、用邻接矩阵存储一个具有 n 个顶点的无向图时,矩阵的大小为()A nB n²C (n 1)²D (n + 1)²11、下列关于堆的描述,正确的是()A 大根堆中,每个节点的值都大于其左右子节点的值B 小根堆中,每个节点的值都小于其左右子节点的值C 堆一定是完全二叉树D 以上都对12、在一个具有 n 个单元的顺序存储的循环队列中,假定 front 和rear 分别为队头指针和队尾指针,则判断队满的条件是()A (rear + 1) % n == frontB (front + 1) % n == rearC rear == frontD rear == 013、已知一个图的邻接表如下所示,从顶点 1 出发,按深度优先搜索法进行遍历,则得到的一种可能的顶点序列为()|顶点|邻接顶点|||||1|2, 3||2|4, 5||3|5||4|6||5|6||6| |A 1, 2, 4, 6, 5, 3B 1, 2, 5, 3, 4, 6C 1, 2, 3, 5, 4, 6D 1, 3, 2, 4, 5, 614、对线性表进行二分查找时,要求线性表必须()A 以顺序方式存储,且元素按值有序排列B 以顺序方式存储,且元素按值无序排列C 以链式方式存储,且元素按值有序排列D 以链式方式存储,且元素按值无序排列15、以下算法的时间复杂度为 O(nlogn)的是()A 顺序查找B 折半查找C 冒泡排序D 归并排序16、若某链表最常用的操作是在最后一个节点之后插入一个节点和删除最后一个节点,则采用()存储方式最节省时间。
《算法分析与设计》期末试题及参考答案

《算法分析与设计》期末试题及参考答案一、简要回答下列问题:1.算法重要特性是什么?2.算法分析的目的是什么?3.算法的时间复杂性与问题的什么因素相关?4.算法的渐进时间复杂性的含义?5.最坏情况下的时间复杂性和平均时间复杂性有什么不同?6.简述二分检索(折半查找)算法的基本过程。
7.背包问题的目标函数和贪心算法最优化量度相同吗?8.采用回溯法求解的问题,其解如何表示?有什么规定?9.回溯法的搜索特点是什么?10.n皇后问题回溯算法的判别函数place的基本流程是什么?11.为什么用分治法设计的算法一般有递归调用?12.为什么要分析最坏情况下的算法时间复杂性?13.简述渐进时间复杂性上界的定义。
14.二分检索算法最多的比较次数?15.快速排序算法最坏情况下需要多少次比较运算?16.贪心算法的基本思想?17.回溯法的解(x1,x2,……x n)的隐约束一般指什么?18.阐述归并排序的分治思路。
19.快速排序的基本思想是什么。
20.什么是直接递归和间接递归?消除递归一般要用到什么数据结构?21.什么是哈密顿环问题?22.用回溯法求解哈密顿环,如何定义判定函数?23.请写出prim算法的基本思想。
二、复杂性分析1、MERGESORT(low,high)if low<high;then mid←(low,high)/2;MERGESORT(low,mid);MERGESORT(mid+1,high);MERGE(low,mid,high);endifend MERGESORT2、procedure S1(P,W,M,X,n)i←1; a←0while i≤ n doif W(i)>M then return endifa←a+ii←i+1 ;repeatend3.procedure PARTITION(m,p)Integer m,p,i;global A(m:p-1)v←A(m);i←mlooploop i←i+1 until A(i) ≥v repeatloop p←p-1 until A(p) ≤v repeatif i<pthen call INTERCHANGE(A(i),A(p))else exitendifrepeatA(m) ←A(p);A(p) ←vEnd PARTITION4.procedure F1(n)if n<2 then return(1)else return(F2(2,n,1,1))endifend F1procedure F2(i,n,x,y)if i≤nthen call F2(i+1,n,y,x+y)endifreturn(y)end F25.procedure MAX(A,n,j)xmax←A(1);j←1for i←2 to n doif A(i)>xmax then xmax←A(i); j←i;endif repeatend MAX6.procedure BINSRCH(A,n,x,j)integer low,high,mid,j,n;low←1;high←nwhile low≤high domid←|_(low+high)/2_|case:x<A(mid):high←mid-1:x>A(mid):low←mid+1:else:j ←mid; returnendcase repeat j ←0 end BINSRCH三、算法理解1、写出多段图最短路经动态规划算法求解下列实例的过程,并求出最优值。
设计与算法分析考试题库

设计与算法分析考试题库一、选择题(每题2分,共20分)1. 在算法分析中,时间复杂度用来衡量算法的什么?A. 可读性B. 执行速度C. 资源消耗D. 可维护性2. 以下哪个排序算法的时间复杂度为O(n^2)?A. 快速排序B. 归并排序C. 选择排序D. 堆排序3. 动态规划与分治算法的主要区别是什么?A. 递归使用B. 子问题重叠C. 问题分解方式D. 算法效率4. 递归算法的基本原理是什么?A. 循环调用B. 重复执行C. 问题分解D. 迭代求解5. 在图算法中,深度优先搜索(DFS)和广度优先搜索(BFS)的主要区别在于?A. 搜索顺序B. 搜索深度C. 使用的数据结构D. 搜索效率6. 哈希表的冲突解决方法中,开放定址法和链地址法的主要区别是什么?A. 存储方式B. 冲突处理机制C. 访问速度D. 空间利用率7. 贪心算法在解决优化问题时,其选择的策略是?A. 随机选择B. 局部最优C. 全局最优D. 动态选择8. 以下哪个算法是解决最近公共祖先问题的?A. 二分查找B. 欧拉路径C. 弗洛伊德算法D. 树的深度优先搜索9. 算法的时间复杂度为O(1)表示该算法的执行时间与输入规模的大小?A. 成正比B. 成反比C. 无关D. 指数关系10. 在大O符号中,O(1)、O(log n)、O(n)、O(n log n)、O(n^2)、O(2^n),按算法效率从高到低排序正确的是?A. O(1), O(log n), O(n), O(n log n), O(n^2), O(2^n)B. O(2^n), O(n^2), O(n log n), O(n), O(log n), O(1)C. O(1), O(log n), O(n log n), O(n), O(n^2), O(2^n)D. O(1), O(n), O(log n), O(n log n), O(n^2), O(2^n)二、简答题(每题10分,共30分)11. 简述二分查找算法的基本思想及其时间复杂度。
算法分析考试题

1. )(n T 给定数组a[0:n-1],试设计一个算法,在最坏情况下用n+[logn]-2次比较找出a[0:n-1] 中的元素的最大值和次大值. (算法分析与设计习题 2.16 ) (分治法)a 、 算法思想用分治法求最大值和次大值首先将问题划分,即将划分成长度相等的两个序列,递归求出左边的最大值次大值,再求出右边的的最大值次大值,比较左右两边,最后得出问题的解。
b 、复杂度分析:把问题划分为左右两种的情况,需要分别递归求解,时间复杂度可如下计算:有递推公式为:T(n)=1 n=1T(n)= 2T(n/2)+1 n>1所以,分治算法的时间复杂度是n+[logn]-2,当n 为奇数时,logn 取上线,当n 为偶数时,logn 取下线。
//不知道为什么会-2!C 、代码实现:#include <stdio.h>int a[100]; void maxcmax(int i,int j,int &max,int &cmax){int lmax,lcmax,rmax,rcmax;int mid;if (i==j){ max=a[i];cmax=a[i];}else if (i==j-1)if (a[i]<a[j]){max=a[j];cmax=a[i];}else{max=a[i];cmax=a[j];}else{mid=(i+j)/2;maxcmax(i,mid,lmax,lcmax);maxcmax(mid+1,j,rmax,rcmax);if(lmax>rmax)if(lcmax>rmax){max=lmax;。
cmax=lcmax;}else{max=lmax;cmax=rmax;}elseif(rcmax>lmax){if(rmax==rcmax){max=rmax;cmax=lmax;}else{max=rmax;cmax=rcmax;}}。
算法考试试题及答案

一、填空题(本题10分,每空1分)1、算法的复杂性是的度量,是评价算法优劣的重要依据。
2、设n为正整数,利用大“O(·)”记号,将下列程序段的执行时间表示为n的函数,则下面程序段的时间复杂度为。
i=1; k=0;while(i<n) { k=k+10*i;i++; }3、计算机的资源最重要的是和资源。
因而,算法的复杂性有和之分。
4、f(n)= 6×2n+n2,f(n)的渐进性态f(n)= O( )5、递归是指函数或者通过一些语句调用自身。
6、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相且和原问题相同。
二、选择题(本题20分,每小题2分)1、分支限界法和回溯法都是在问题的解空间树T上搜索问题的解,二者( )。
A.求解目标不同,搜索方式相同B.求解目标不同,搜索方式也不同C.求解目标相同,搜索方式不同D.求解目标相同,搜索方式也相同2、回溯法在解空间树T上的搜索方式是( )。
A.深度优先B.广度优先C.最小耗费优先D.活结点优先3、在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( )。
A.回溯法B.分支限界法C.回溯法和分支限界法D.回溯法求解子集树问题4、以下关于判定问题难易处理的叙述中正确的是( )。
A.可以由多项式时间算法求解的问题是难处理的B.需要超过多项式时间算法求解的问题是易处理的C.可以由多项式时间算法求解的问题是易处理的D.需要超过多项式时间算法求解的问题是不能处理的5、设f(N),g(N)是定义在正数集上的正函数,如果存在正的常数C和自然数N0,使得当N≥N0时有f(N)≤Cg(N),则称函数f(N)当N充分大时有上界g(N),记作f(N)=O(g(N)),即f(N)的阶( )g(N)的阶。
A.不高于B.不低于C.等价于D.逼近6、对于含有n个元素的子集树问题,最坏情况下其解空间的叶结点数目为( )。
《算法设计与分析》考试题目及答案

《算法分析与设计》期末复习题一、选择题1.应用Johnson法则的流水作业调度采用的算法是(D)A. 贪心算法B. 分支限界法C.分治法D. 动态规划算法2.Hanoi塔问题如下图所示。
现要求将塔座A上的的所有圆盘移到塔座B上,并仍按同样顺序叠置。
移动圆盘时遵守Hanoi塔问题的移动规则。
由此设计出解Hanoi塔问题的递归算法正确的为:(B)Hanoi塔4. 算法分析中,记号O表示(B),记号Ω表示(A),记号Θ表示(D)。
A.渐进下界B.渐进上界C.非紧上界D.紧渐进界E.非紧下界5. 以下关于渐进记号的性质是正确的有:(A)A.f(n)(g(n)),g(n)(h(n))f(n)(h(n))=Θ=Θ⇒=ΘB. f(n)O(g(n)),g(n)O(h(n))h(n)O(f(n))==⇒=C. O(f(n))+O(g(n)) = O(min{f(n),g(n)})D. f(n)O(g(n))g(n)O(f(n))=⇔=6.能采用贪心算法求最优解的问题,一般具有的重要性质为:(A)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用7. 回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。
广度优先 B. 活结点优先 C.扩展结点优先 D. 深度优先8. 分支限界法在问题的解空间树中,按(A)策略,从根结点出发搜索解空间树。
A.广度优先 B. 活结点优先 C.扩展结点优先 D. 深度优先9. 程序块(A)是回溯法中遍历排列树的算法框架程序。
A.B.C.D.10.x[k]的个数。
11. 常见的两种分支限界法为(D)A. 广度优先分支限界法与深度优先分支限界法;B. 队列式(FIFO)分支限界法与堆栈式分支限界法;C. 排列树法与子集树法;D. 队列式(FIFO)分支限界法与优先队列式分支限界法;12. k带图灵机的空间复杂性S(n)是指(B)A.k带图灵机处理所有长度为n的输入时,在某条带上所使用过的最大方格数。
算法分析与设计试题及答案

算法分析与设计试题及答案一、选择题1. 下列哪个是属于分治算法的例子?A. 冒泡排序B. 归并排序C. 顺序查找D. 选择排序答案:B2. 在排序算法中,时间复杂度最优的是:A. 冒泡排序B. 插入排序C. 归并排序D. 快速排序答案:C3. 哪个不是动态规划的特点?A. 具有重叠子问题B. 通过递归求解C. 需要保存子问题的解D. 具有最优子结构答案:B4. 在图的广度优先搜索算法中,使用的数据结构是:A. 栈B. 队列C. 数组D. 堆栈答案:B5. 在最小生成树算法中,下列哪个不属于贪心策略?A. Kruskal算法B. Prim算法C. Dijkstra算法D. Prim-Kruskal混合算法答案:C二、简答题1. 请简述分治算法的思想和应用场景。
答案:分治算法的思想是将原问题分解成若干个规模较小且类似的子问题,然后解决子问题,最后将子问题的解合并得到原问题的解。
其应用场景包括排序算法(如归并排序、快速排序)、搜索算法(如二分查找)等。
2. 什么是动态规划算法?请给出一个动态规划算法的示例。
答案:动态规划算法是一种通过将问题分解成子问题并解决子问题来解决复杂问题的方法。
它的特点是具有重叠子问题和最优子结构性质。
以斐波那契数列为例,可以使用动态规划算法求解每一项的值,而不需要重复计算。
3. 图的深度优先搜索和广度优先搜索有什么区别?答案:图的深度优先搜索(Depth First Search,DFS)是一种先访问子节点再访问兄弟节点的遍历算法,通常使用递归或者栈实现。
而广度优先搜索(Breadth First Search,BFS)则是以层次遍历的方式展开搜索,使用队列来实现。
DFS更适合用于搜索路径,BFS则适用于寻找最短路径等。
4. 请简述贪心算法的特点及其应用场景。
答案:贪心算法的特点是每一步都采取当前状态下最优的选择,以期望得到全局最优解。
然而,贪心算法并不一定能求解所有问题的最优解,但对于一些特定问题,贪心算法往往能得到近似最优解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T(n)=1n=1
T(n)= 2T(n/2)+n-1n>1
所以,分治算法的时间复杂度是O(nlogn)
c、代码实现
#include<iostream.h>
#define m 10
int MaxSubSum(int a[],int left,int right)
{
int sum=0;
if(left==right) sum=a[left]>0?a[left]:0;
#define d 10
int median(int x[],int y[],int xLeft,int xRight,int yLeft,int yRight){
if(xLeft==xRight)
{
return (x[xLeft]+y[yLeft])/2;
}
int xm=(xLeft+xRight)/2;
{
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
void LCS(int i,int j,int *x,int b[m][m])
{
if(i<0||j<0)
return;
if(b[i][j]==1)
{
LCS(i-1,j-1,x,b);
{
int i,j;
for(i=0;i<n;i++)
{
c[0][i]=0;
c[i][0]=0;
}
for(i=0;i<n;i++)
for(j=0;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])
cout<<x[i]<<" ";
}
else if(b[i][j]==2)
LCS(i-1,j,x,b);
else
LCS(i,j-1,x,b);
}
void main()
{
int x[m],y[m],d;
cout<<"请输入元素个数"<<endl;
cin>>d;
cout<<"请输入元素"<<endl;
for(int i=0;i<d;i++)
试设计-O(n*V)时间的动态规划算法,使得|a-b|达到最小,并求出礼物的分割集合
(P77页)(动态规划算法)
8.(4.7)多处最优服务问题P131页(贪婪算法) (与十人打水的问题一样)
a、算法思想:
贪心策略如下:首先对所有服务先按服务时间从小到大进行排序,然后按照排序结果,选出最小的服务站点时间,依次安排服务。
printf("次大数为%d\n",cmax);
return 0;
}
C、运行结果为
2.求数列的最大子段和(要求时间复杂为nlogn) (算法设计与分析吕国英清华大学出版社135页4..3.3二分法变异)(分治法)(也可用动态规划算法参看递归王晓东计算机算法设计与分析第三版p61页)
a、基本思想:
用分治法求最大子段和首先将问题划分,即将一直序列划分成长度相等的两个序列,
b、复杂度分析:
把问题划分为左右两种的情况,需要分别递归求解,时间复杂度可如下计算:
有递推公式为:
T(n)=1n=1
T(n)= 2T(n/2)+1n>1
所以,分治算法的时间复杂度是n+[logn]-2,当n为奇数时,logn取上线,当n为偶数时,logn取下线。//不知道为什么会-2!
C、代码实现:
{
median(x,y,xm+1,xRight,yLeft,ym);
}
else
{
median(x,y,xLeft,xm,ym+1,yRight);
}
}
}
int main()
{
int m;int a[d],b[d];
cout<<"Enter dimension m:"<<endl;
cin>>m;
cout<<"Enter array a:"<<endl;
}
}
void main()
{
int a[m],d;
cout<<"请输入元素个数"<<endl;
cin>>d;
cout<<"请输入元素"<<endl;
for(int i=0;i<d;i++)
cin>>a[i];
cout<<"最大子段和为:"<<MaxSubSum(a,0,d-1)<<endl;
}
运行结果为:
#include <vector>
#include<algorithm>
using namespace std;
using std::vector;
double greedy(vector<int>x,int s)
{
int minx;
{
cin>>x[i];
y[i]=x[i];
}
int c[m][m]={0},b[m][m]={0};
QuickSort(x,0,d-1);
LCSLength(x,y,d,c,b);
cout<<"最长单调递增子序列为:"<<endl;
LCS(d-1,d-1,x,b);
}
结果为:
7.礼物分配问题.两兄弟Alan和Bob,共同分配n个礼物.每个礼物只能分给其中的一个人,且不能分成两个.每个礼物i的价值为vi,为正整数.设a和b分别表示Alan和Bob所收到的礼物的总价值, V= ,为所有礼物的总价值.为使两兄弟高兴,我们希望尽可能地均分这些礼物,即|a-b|打到最小
}
}
}
int main()
{
int n;
int max,cmax;
printf("输入数组长度");
scanf("%d",&n);
printf("输入数组:\n");
for(int i=0;i<n;i++)
{scanf("%d",&a[i]);}
maxcmax(0,n-1,max,cmax);
printf("最大数为%d\n",max);
1. 给定数组a[0:n-1],试设计一个算法,在最坏情况下用n+[logn]-2次比较找出a[0:n-1]中的元素的最大值和次大值. (算法分析与设计习题2.16 )(分治法)
a、算法思想
用分治法求最大值和次大值首先将问题划分,即将划分成长度相等的两个序列,递归求出左边的最大值次大值,再求出右边的的最大值次大值,比较左右两边,最后得出问题的解。
#include <stdio.h>
int a[100];
void maxcmax(int i,int j,int &max,int &cmax)
{
int lmax,lcmax,rmax,rcmax;
int mid;
if (i==j)
{
max=a[i];
cmax=a[i];
}
else if (i==j-1)
{
max=lmax;
cmax=lcmax;
}
else
{
max=lmax;
cmax=rmax;
}
else
if(rcmax>lmax)
{
if(rmax==rcmax)
{
max=rmax;
cmax=lmax;
}
else
{
max=rmax;
cmax=rcmax;
}
}
else
{
max=rmax;
cmax=lmax;
for(int i=0;i<m;i++)
cin>>a[i];
cout<<"Enter array b:"<<endl;
for(int j=0;j<m;j++)
cin>>b[j];
int mid=median(a,b,0,m-1,0,m-1);
cout<<"The median is:"<<mid<<endl;
j--;
R[i]=R[j];
while(i<j&&R[i]<=tmp)
i++;