算法分析期末考试集答案套.docx

上传人:b****6 文档编号:7257464 上传时间:2023-05-11 格式:DOCX 页数:36 大小:214.22KB
下载 相关 举报
算法分析期末考试集答案套.docx_第1页
第1页 / 共36页
算法分析期末考试集答案套.docx_第2页
第2页 / 共36页
算法分析期末考试集答案套.docx_第3页
第3页 / 共36页
算法分析期末考试集答案套.docx_第4页
第4页 / 共36页
算法分析期末考试集答案套.docx_第5页
第5页 / 共36页
算法分析期末考试集答案套.docx_第6页
第6页 / 共36页
算法分析期末考试集答案套.docx_第7页
第7页 / 共36页
算法分析期末考试集答案套.docx_第8页
第8页 / 共36页
算法分析期末考试集答案套.docx_第9页
第9页 / 共36页
算法分析期末考试集答案套.docx_第10页
第10页 / 共36页
算法分析期末考试集答案套.docx_第11页
第11页 / 共36页
算法分析期末考试集答案套.docx_第12页
第12页 / 共36页
算法分析期末考试集答案套.docx_第13页
第13页 / 共36页
算法分析期末考试集答案套.docx_第14页
第14页 / 共36页
算法分析期末考试集答案套.docx_第15页
第15页 / 共36页
算法分析期末考试集答案套.docx_第16页
第16页 / 共36页
算法分析期末考试集答案套.docx_第17页
第17页 / 共36页
算法分析期末考试集答案套.docx_第18页
第18页 / 共36页
算法分析期末考试集答案套.docx_第19页
第19页 / 共36页
算法分析期末考试集答案套.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

算法分析期末考试集答案套.docx

《算法分析期末考试集答案套.docx》由会员分享,可在线阅读,更多相关《算法分析期末考试集答案套.docx(36页珍藏版)》请在冰点文库上搜索。

算法分析期末考试集答案套.docx

算法分析期末考试集答案套

《算法分析与设计》

一、解答题

1.机器调度问题。

问题描述:

现在有n件任务和无限多台的机器,任务可以在机器上得到处理。

每件任务的开始时间为si,完成时间为fi,si

[si,fi]为处理任务i的时间范围。

两个任务i,j重叠指两个任务的时间范围区间有重叠,而并非指i,j的起点或终点重合。

例如:

区间[1,4]与区间[2,4]重叠,而与[4,7]不重叠。

一个可行的任务分配是指在分配中没有两件重叠的任务分配给同一台机器。

因此,在可行的分配中每台机器在任何时刻最多只处理一个任务。

最优分配是指使用的机器最少的可行分配方案。

问题实例:

若任务占用的时间范围是{[1,4],[2,5],[4,5],[2,6],[4,7]},则按时完成所有任务最少需要几台机器?

(提示:

使用贪心算法)

画出工作在对应的机器上的分配情况。

2.已知非齐次递归方程:

,其中,b、c是常数,g(n)是n的某一个函数。

则f(n)的非递归表达式为:

现有Hanoi塔问题的递归方程为:

,求h(n)的非递归表达式。

解:

利用给出的关系式,此时有:

b=2,c=1,g(n)=1,从n递推到1,有:

3.单源最短路径的求解。

问题的描述:

给定带权有向图(如下图所示)G=(V,E),其中每条边的权是非负实数。

另外,还给定V中的一个顶点,称为源。

现在要计算从源到所有其它各顶点的最短路长度。

这里路的长度是指路上各边权之和。

这个问题通常称为单源最短路径问题。

解法:

现采用Dijkstra算法计算从源顶点1到其它顶点间最短路径。

请将此过程填入下表中。

 

 

 

4.请写出用回溯法解装载问题的函数。

装载问题:

有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且

装载问题要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。

如果有,找出一种装载方案。

解:

voidbacktrack(inti)

{//搜索第i层结点

if(i>n)//到达叶结点

更新最优解bestx,bestw;return;

r-=w[i];

if(cw+w[i]<=c){//搜索左子树

x[i]=1;

cw+=w[i];

backtrack(i+1);

cw-=w[i];}

if(cw+r>bestw){

x[i]=0;//搜索右子树

backtrack(i+1);}

r+=w[i];

}

5.用分支限界法解装载问题时,对算法进行了一些改进,下面的程序段给出了改进部分;试说明斜线部分完成什么功能,以及这样做的原因,即采用这样的方式,算法在执行上有什么不同。

 

//检查左儿子结点

Typewt=Ew+w[i];//左儿子结点的重量

if(wt<=c){//可行结点

if(wt>bestw)bestw=wt;

//加入活结点队列

if(i

}

//检查右儿子结点

if(Ew+r>bestw&&i

Q.Add(Ew);//可能含最优解

Q.Delete(Ew);//取下一扩展结点

 

 

解答:

斜线标识的部分完成的功能为:

提前更新bestw值;

这样做可以尽早的进行对右子树的剪枝。

具体为:

算法Maxloading初始时将bestw设置为0,直到搜索到第一个叶结点时才更新bestw。

因此在算法搜索到第一个叶子结点之前,总有bestw=0,r>0故Ew+r>bestw总是成立。

也就是说,此时右子树测试不起作用。

为了使上述右子树测试尽早生效,应提早更新bestw。

又知算法最终找到的最优值是所求问题的子集树中所有可行结点相应重量的最大值。

而结点所相应得重量仅在搜索进入左子树是增加,因此,可以在算法每一次进入左子树时更新bestw的值。

7.最长公共子序列问题:

给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。

用c[i][j]记录序列Xi和Yj的最长公共子序列的长度。

其中,Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}。

当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。

故此时C[i][j]=0。

其它情况下,由最优子结构性质可建立递归关系如下:

在程序中,b[i][j]记录C[i][j]的值是由哪一个子问题的解得到的。

(1)请填写程序中的空格,以使函数LCSLength完成计算最优值的功能。

voidLCSLength(intm,intn,char*x,char*y,int**c,int**b)

{

inti,j;

for(i=1;i<=m;i++)c[i][0]=0;

for(i=1;i<=n;i++)c[0][i]=0;

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;}

elseif(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;}

}

}

 

(2)函数LCS实现根据b的内容打印出Xi和Yj的最长公共子序列。

请填写程序中的空格,以使函数LCS完成构造最长公共子序列的功能(请将b[i][j]的取值与

(1)中您填写的取值对应,否则视为错误)。

 

voidLCS(inti,intj,char*x,int**b)

{

if(i==0||j==0)return;

if(b[i][j]==1){

LCS(i-1,j-1,x,b);

cout<

}

elseif(b[i][j]==2)LCS(i-1,j,x,b);

elseLCS(i,j-1,x,b);

}

 

 

8.对下面的递归算法,写出调用f(4)的执行结果。

voidf(intk)

{if(k>0)

{printf("%d\n",k);

f(k-1);

f(k-1);

}

}

 

二、复杂性分析

1、MERGESORT(low,high)

iflow

thenmid←(low,high)/2;

MERGESORT(low,mid);

MERGESORT(mid+1,high);

MERGE(low,mid,high);

endif

endMERGESORT

答:

1、递归方程

 

设n=2k

解递归方程:

2、procedureS1(P,W,M,X,n)

i←1;a←0

whilei≤ndo

ifW(i)>Mthenreturnendif

a←a+i

i←i+1;

repeat

end

解:

i←1;s←0时间为:

O

(1)

whilei≤ndo循环n次

循环体内所用时间为O

(1)

所以总时间为:

T(n)=O

(1)+nO

(1)=O(n)

3.procedurePARTITION(m,p)

Integerm,p,i;globalA(m:

p-1)

v←A(m);i←m

loop

loopi←i+1untilA(i)≥vrepeat

loopp←p-1untilA(p)≤vrepeat

ifi

thencallINTERCHANGE(A(i),A(p))

elseexit

endif

repeat

A(m)←A(p);A(p)←v

EndPARTITION

解:

最多的查找次数是p-m+1次

4.procedureF1(n)

ifn<2thenreturn

(1)

elsereturn(F2(2,n,1,1))

endif

endF1

procedureF2(i,n,x,y)

ifi≤n

thencallF2(i+1,n,y,x+y)

endif

return(y)

endF2

解:

F2(2,n,1,1)的时间复杂度为:

T(n)=O(n-2);因为i≤n时要递归调用F2,一共是n-2次

当n=1时F1(n)的时间为O

(1)

当n>1时F1(n)的时间复杂度与F2(2,n,1,1)的时间复杂度相同即为为O(n)

5.procedureMAX(A,n,j)

xmax←A

(1);j←1

fori←2tondo

ifA(i)>xmaxthenxmax←A(i);j←i;endif

repeat

endMAX

解:

xmax←A

(1);j←1时间为:

O

(1)

fori←2tondo循环最多n-1次

所以总时间为:

T(n)=O

(1)+(n-1)O

(1)=O(n)

6.procedureBINSRCH(A,n,x,j)

integerlow,high,mid,j,n;

low←1;high←n

whilelow≤highdo

mid←|_(low+high)/2_|

case

:

x

high←mid-1

:

x>A(mid):

low←mid+1

:

else:

j←mid;return

endcase

repeat

j←0

endBINSRCH

解:

log2n+1

三、算法理解

1、写出多段图最短路经动态规划算法求解下列实例的过程,并求出最优值。

 

各边的代价如下:

C(1,2)=3,C(1,3)=5,C(1,4)=2

C(2,6)=8,C(2,7)=4,C(3,5)=5,C(3,6)=4,C(4,5)=2,C(4,6)=1

C(5,8)=4,C(6,8)=5,C(7,8)=6

解:

Cost(4,8)=0

Cost(3,7)=C(7,8)+0=6,D[5]=8

Cost(3,6)=C(6,8)+0=5,D[6]=8

Cost(3,5)=C(5,8)+0=4D[7]=8

Cost(2,4)=min{C(4,6)+Cost(3,6),C(4,5)+Cost(3,5)}

=min{1+5,2+4}=6D[4]=6

Cost(2,3)=min{C(3,6)+Cost(3,6)}

=min{4+5}=9D[3]=5

Cost(2,2)=min{C(2,6)+Cost(3,6),C(2,7)+Cost(3,7)}

=min{8+5,4+6}=10D[2]=7

Cost(1,1)=min{C(1,2)+Cost(2,2),C(1,3)+Cost(2,3),C(1,4)+Cost(2,4)}

=min{3+10,5+9,2+6}=8

D[1]=4

1→4→6→8

2、写出maxmin算法对下列实例中找最大数和最小数的过程。

数组A=(48,12,61,3,5,19,32,7)

解:

写出maxmin算法对下列实例中找最大数和最小数的过程。

数组A=()

1、48,12,61,3,5,19,32,7

2、48,1261,35,1932,7

3、48~61,12~319~32,5~7

4、61~323~5

5、613

3、快速排序算法对下列实例排序,算法执行过程中,写出数组A第一次被分割的过程。

A=(65,70,75,80,85,55,50,2)

解:

第一个分割元素为65

 

4、归并排序算法对下列实例排序,写出算法执行过程。

A=(48,12,61,3,5,19,32,7)

解:

48,12,61,35,19,32,7

48,1261,35,1932,7

12,483,615,197,32

3,12,48,615,7,19,32

3,5,7,12,19,32,48,61

5、写出图着色问题的回溯算法的判断X[k]是否合理的过程。

解:

i←0

whilei

ifG[k,i]=1andX[k]=X[i]then

returnfalse

i←i+1

repeat

ifi=kthenreturntrue

6、对于下图,写出图着色算法得出一种着色方案的过程。

 

解:

K←1

X[1]←1,返回true

X[2]←1,返回false;X[2]←X[2]+1=2,返回true

X[3]←1,返回false;X[3]←X[3]+1=2,返回false;X[3]←X[3]+1=3,返回true

X[4]←1,返回false;X[4]←X[4]+1=2,返回false;X[4]←X[4]+1=3,返回true

找到一个解(1,2,3,3)

7、写出第7题的状态空间树。

解:

 

8、写出归并排序算法对下列实例排序的过程。

(6,2,9,3,5,1,8,7)

解:

调用第一层次6,2,9,35,1,8,7分成两个子问题

调用第二层次6,29,35,18,7分成四个子问题

调用第三层次62935187分成八个子问题

调用第四层次只有一个元素返回上一层

第三层归并2,63,91,57,8返回上一层

第二层归并2,3,6,91,5,7,8返回上一层

第一层归并1,2,3,5,6,7,8,9排序结束,返回主函数

9、写出用背包问题贪心算法解决下列实例的过程。

P=(18,12,4,1)

W=(12,10,8,3)

M=25

解:

实例符合P(i)/W(i)≥P(i+1)/W(i+1)的顺序。

CU←25,X←0

W[1]

x[1]←1;CU←CU-W[1]=13;

W[2]

x[2]←1;CU←CU-W[2]=3;

W[3]>CU:

x[3]←CU/W[3]=3/8;

实例的解为:

(1,1,3/8,0)

11、有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当使用二分查找值为82的结点时,经过多少次比较后查找成功并给出过程。

解:

有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当使用二分查找值为82的结点时,经过多少次比较后查找成功并给出过程。

一共要要执行四次才能找到值为82的数。

12、使用prim算法构造出如下图G的一棵最小生成树。

dist(1,2)=6;dist(2,5)=3;dist(5,6)=6;dist(6,4)=2;dist(4,1)=5;

dist(1,3)=1;dist(2,3)=5;dist(3,4)=5;dist(3,6)=4;dist(5,3)=6

解:

使用普里姆算法构造出如下图G的一棵最小生成树。

dist(1,2)=6;dist(2,5)=3;dist(5,6)=6;dist(6,4)=2;dist(4,1)=5;

dist(1,3)=1;dist(2,3)=5;dist(3,4)=5;dist(3,6)=4;dist(5,3)=6

13、有如下函数说明

intf(intx,inty)

{

f=xMody+1;

}

已知a=10,b=4,c=5则执行k=f(f(a+c,b),f(b,c))后,k的值是多少并写出详细过程。

解:

有如下函数说明

intf(intx,inty)

{

f=xMody+1;

}

已知a=10,b=4,c=5则执行k=f(f(a+c,b),f(b,c))后,k的值是多少并写出详细过程。

}

K的值是5

14、McCathy函数定义如下:

当x>100时m(x)=x-10;

当x<=100时m(x)=m(m(x+11));

编写一个递归函数计算给定x的m(x)值。

解:

McCathy函数定义如下:

当x>100时m(x)=x-10;

当x<=100时m(x)=m(m(x+11));

编写一个递归函数计算给定x的m(x)值。

intm(intx)

{

inty;

if(x>100)return(x-100);

else

{

y=m(x+11);

return(m(y));

}

}

15、设计一个算法在一个向量A中找出最大数和最小数的元素。

解:

设计一个算法在一个向量A中找出最大数和最小数的元素。

Voidmaxmin(A,n)

VectorA;

intn;

{

intmax,min,i;

max=A[1];min=A[1];

for(i=2;i<=n;i++)

if(A[i]>max)max=A[i];

elseif(A[i]

printf(“max=%d,min=%d\n”,max,min);

}

四、设计算法

1.设有n项独立的作业{1,2,…,n},由m台相同的机器加工处理。

作业i所需要的处理时间为ti。

约定:

任何一项作业可在任何一台机器上处理,但未完工前不准中断处理;任何作业不能拆分更小的子作业。

多机调度问题要求给出一种调度方案,使所给的n个作业在尽可能短的时间内由m台机器处理完。

设计算法,并讨论是否可获最优解。

解:

对于处理机j,用S[j]表示处理机j已有的作业数,用P[j,k]表示处理机j的第k个作业的序号。

1)将作业按照t[1]≥t[2]≥……≥t[n]排序

2)S[1:

m]清零j←0//从第一个处理机开始安排

3)fori←1tondo//安排n个作业

j←jmodm+1//选下一个处理机

S[j]←S[j]+1;

P[j,S[j]]←i;

Repeat

2.设有n种面值为:

d1≥d2≥……≥dn的钱币,需要找零钱M,如何选择钱币dk,的数目Xk,满足

d1×Xi+……dn×Xn=M,使得

Xi+……Xn最小

请选择贪心策略,并设计贪心算法。

解:

贪心原则:

每次选择最大面值硬币。

CU←M;i←1;X←0//X为解向量

WhileCU≠0do

X[i]←CUdivd[i]//X[i]为第i中硬币数

CU←CU-d[i]*X[i]

i←i+1;

repeat

3.有n个物品,已知n=7,利润为P=(10,5,15,7,6,18,3),重量W=(2,3,5,7,1,4,1),背包容积M=15,物品只能选择全部装入背包或不装入背包,设计贪心算法,并讨论是否可获最优解。

解:

定义结构体数组G,将物品编号、利润、重量作为一个结构体:

例如G[k]={1,10,2}

求最优解,按利润/重量的递减序,有

{5,6,1,6}{1,10,2,5}{6,18,4,9/2}{3,15,5,3}{7,3,1,3}{2,5,3,5/3}{4,7,7,1}

算法

procedureKNAPSACK(P,W,M,X,n)

//P(1:

n)和W(1;n)分别含有按

P(i)/W(i)≥P(i+1)/W(i+1)排序的n件物品的效益值

和重量。

M是背包的容量大小,而x(1:

n)是解向量//

realP(1:

n),W(1:

n),X(1:

n),M,cu;

integeri,n;

X←0//将解向量初始化为零//

cu←M//cu是背包剩余容量//

fori←1tondo

ifW(i)>cuthenexitendif

X(i)←1

cu←cu-W(i)

repeat

endGREEDY-KNAPSACK

根据算法得出的解:

X=(1,1,1,1,1,0,0)获利润52,而解

(1,1,1,1,0,1,0)可获利润54

因此贪心法不一定获得最优解。

4.设计只求一个哈密顿环的回溯算法。

解:

Hamiltonian(n)

{k←1;x[k]←0;

Whilek>0do

x[k]←x[k]+1;

whileB(k)=falseandx[k]≤ndo

x[k]←x[k]+1;repeat

Ifx[k]≤nthen

ifk=nthen{printx;return}

else{k←k+1;x[k]←0;}endif

elsek←k-1

endif

repeat

end

procedureB(k)

{G[x[k-1],x[k]]≠1thenreturnfalse;

fori←1tok-1do

ifx[i]=x[k]thenreturnfalse;endif

repeat

returntrue;

}

5.利用对称性设计算法,求n为偶数的皇后问题所有解。

解:

利用对称性设计算法,求n为偶数的皇后问题所有解。

procedureNQUEENS1(n)

a←0//计数器清零

X

(1)←0;k←1//k是当前行;X(k)是当前列//

Whilek>0do//对所有的行执行以下语句//

1){X(k)←X(k)+1//移到下一列//

WhileX(k)≤nandnotPLACE(k)do

2)X(k)←X(k)十l

ifX(k)≤n

thenifk=n/

then

{print(X),a←a+1//找到一个解计数器a加1//

ifa=n/2thenreturn//找到n/2个解算法结束

3)else{k←k+1;X(k)←0;}

4)elsek←k-1//回溯//

 }

endNQUEENS

1、对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或

,并简述理由。

(12分)

(1)

(2)

(3)

解:

简答如下:

(1)

(2)

,(3)

2、试用分治法实现有重复元素的排列问题:

是要进行排列的

个元素,其中元素

可能相同,试计算

的所有不同排列。

(13分)

解:

解答如下:

Template

voidPerm(Typelist[],intk,intm)

{

if(k==m){

for(inti=0;i<=m;i++)cout<

cout<

}

elsefor(inti=k;i<=m;i++)

if(ok(lis

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2