最新湖南大学复习算法分析期末答案大题.docx
《最新湖南大学复习算法分析期末答案大题.docx》由会员分享,可在线阅读,更多相关《最新湖南大学复习算法分析期末答案大题.docx(44页珍藏版)》请在冰豆网上搜索。
![最新湖南大学复习算法分析期末答案大题.docx](https://file1.bdocx.com/fileroot1/2023-7/21/b188a0ad-633b-48d8-b679-bb5369f6725e/b188a0ad-633b-48d8-b679-bb5369f6725e1.gif)
最新湖南大学复习算法分析期末答案大题
一、解答题
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]},则按时完成所有任务最少需要几台机器?
(提示:
使用贪心算法)
画出工作在对应的机器上的分配情况。
3.单源最短路径的求解。
问题的描述:
给定带权有向图(如下图所示)G=(V,E),其中每条边的权是非负实数。
另外,还给定V中的一个顶点,称为源。
现在要计算从源到所有其它各顶点的最短路长度。
这里路的长度是指路上各边权之和。
这个问题通常称为单源最短路径问题。
解法:
现采用Dijkstra算法计算从源顶点1到其它顶点间最短路径。
请将此过程填入下表中。
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、写出多段图最短路经动态规划算法求解下列实例的过程,并求出最优值。
各边的代价如下:
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
1、快速排序算法对下列实例排序,算法执行过程中,写出数组A第一次被分割的过程。
A=(65,70,75,80,85,55,50,2)
解:
第一个分割元素为65
2、归并排序算法对下列实例排序,写出算法执行过程。
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
3、写出图着色问题的回溯算法的判断X[k]是否合理的过程。
解:
i←0
whileiifG[k,i]=1andX[k]=X[i]then
returnfalse
i←i+1
repeat
ifi=kthenreturntrue
4、对于下图,写出图着色算法得出一种着色方案的过程。
解:
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)
5、写出第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
四、设计算法
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
因此贪心法不一定获得最优解。
1、对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或
或
,并简述理由。
(12分)
(1)
(2)
(3)
解:
简答如下:
(1)
,
(2)
,(3)
《算法设计与分析》考试试卷
一、排序和查找是经常遇到的问题。
按照要求完成以下各题:
(20分)
(1)对数组A={15,29,135,18,32,1,27,25,5},用快速排序方法将其排成递减序。
(2)请描述递减数组进行二分搜索的基本思想,并给出非递归算法。
(3)给出上述算法的递归算法。
(4)使用上述算法对
(1)所得到的结果搜索如下元素,并给出搜索过程:
18,31,135。
答案:
(1)第一步:
15291351832127255
第二步:
29135183227251515【1分】
第三步:
13532291827251551【1分】
第四步:
13532292725181551【1分】
(2)基本思想:
首先将待搜索元素v与数组的中间元素
进行比较,如果
,则在前半部分元素中搜索v;若
,则搜索成功;否则在后半部分数组中搜索v。
【2分】
非递归算法:
输入:
递减数组A[left:
right],待搜索元素v。
【1分】
输出:
v在A中的位置pos,或者不在A中的消息(-1)。
【1分】
步骤:
【3分】
intBinarySearch(intA[],intleft,intright,intv)
{
intmid;
while(left<=right)
{
mid=int((left+right)/2);
if(v==A[mid])returnmid;
elseif(v>A[mid])right=mid-1;
elseleft=mid+1;
}
return-1;
}
(3)递归算法:
输入:
递减数组A[left:
right],待搜索元素v。
【1分】
输出:
v在A中的位置pos,或者不在A中的消息(-1)。
【1分】
步骤:
【3分】
intBinarySearch(intA[],intleft,intright,intv)
{
intmid;
if(left<=right)
{
mid=int((left+right)/2);
if(v==A[mid])returnmid;
elseif(v>A[mid])returnBinarySearch(A,left,mid-1,v);
elsereturnBinarySearch(A,mid+1,right,v);
}
else
return-1;
}
(4)搜索18:
首先与27比较,18<27,在后半部分搜索;再次与18比较,搜索到,返回5。
【1分】
搜索31:
首先与27比较,31>27,在前半部分搜索;再次32比较,31<32,在后半部分搜索,与29比较,31>29,此时只有一个元素,未找到,返回-1。
【2分】
搜索135:
首先与27比较,135>27,在前半部分搜索;再次32比较,135>32,在前半部分搜索;与135比较,相同,返回0。
【2分】
二、对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。
(20分)。
答案:
用V1表示已经找到最短路径的顶点,V2表示与V1中某个顶点相邻接且不在V1中的顶点;E1表示加入到最短路径中的边,E2为与V1中的顶点相邻接且距离最短的路径。
【1分】
步骤V1V2E1E2
1.{a}{b}{}{ab}
2.{a,b}{d}{ab}{bd}
3.{a,b,d}{c,f}{ab,bd}{dc,df}
4.{a,b,d,c}{f}{ab,bd}{df}
5.{a,b,c,d,f}{e}{ab,bd,dc,df}{fe}
6.{a,b,c,d,e,f}{g}{ab,bd,dc,df,fe}{eg}
7.{a,b,c,d,e,f,g}{h}{ab,bd,dc,df,fe,eg}{gh}
8.{a,b,c,d,e,f,g,h}{}{ab,bd,de,df,fe,eg,gh}{}【以上每步2分】
结果:
从a到h的最短路径为
,权值为18。
【1分】
三、假设有7个物品,它们的重量和价值如下表所示。
若这些物品均不能被分割,且背包容量M=150,使用回溯方法求解此背包问题。
请写出状态空间搜索树(20分)。
物品
A
B
C
D
E
F
G
重量
35
30
60
50
40
10
25
价值
10
40
30
50
35
40
30
答案:
求所有顶点对之间的最短路径可以使用Dijkstra算法,使其起始节点从a循环到h,每次求起始节点到其他节点的最短路径,最终可以求得所有顶点对之间的最短路径。
【2分】
三、按照单位效益从大到小依次排列这7个物品为:
FBGDECA。
将它们的序号分别记为1~7。
则可生产如下的状态空间搜索树。
其中各个节点处的限界函数值通过如下方式求得:
【排序1分】
【状态空间搜索树及其计算过程17分,每个节点1分】
a.
b.
c.
d.
e.
f.
g.
h.
i.
j.
在Q1处获得该问题的最优解为
,背包效益为170。
即在背包中装入物品F、B、G、D、A时达到最大效益,为170,重量为150。
【结论2分】
四、已知
,k=1,2,3,4,5,6,r1=5,r2=10,r3=3,r4=12,r5=5,r6=50,r7=6,求矩阵链积A1×A2×A3×A4×A5×A6的最佳求积顺序。
(要求:
给出计算步骤)(20分)
答案:
使用动态规划算法进行求解。
求解矩阵为:
【每个矩阵18分】
1
2
3
4
5
6
1
0
150
330
405
1655
2010
2
0
360
330
2430
1950
3
0
180
930
1770
4
0
3000
1860
5
0
1500
6
0
1
2
3
4
5
6
1
0
1
2
2
4
2
2
0
2
2
2
2
3
0
3
4
4
4
0
4
4
5
0
5
6
0
因此,最佳乘积序列为(A1A2)((A3A4)(A5A6)),共执行乘法2010次。
【结论2分】
五、算法理解题(本题5分)
设有n=2k个运动员要进行循环赛,现设计一个满足以下要求的比赛日程表:
①每个选手必须与其他n-1名选手比赛各一次;
②每个选手一天至多只能赛一次;
③循环赛要在最短时间内完成。
(1)如果n=2k,循环赛最少需要进行几天;
(2)当n=23=8时,请画出循环赛日程表。
六、算法设计题(本题15分)
分别用贪心算法、动态规划法、回溯法设计0-1背包问题。
要求:
说明所使用的算法策略;写出算法实现的主要步骤;分析算法的时间。
七、算法设计题(本题10分)
通过键盘输入一个高精度的正整数n(n的有效位数≤240),去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。
【样例输入】
178543
S=4
【样例输出】
13
五、
(1)8天(2分);
(2)当n=23=8时,循环赛日程表(3分)。
六、算法设计题(本题15分)
(1)贪心算法O(nlog(n))
Ø首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。
若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。
依此策略一直地进行下去,直到背包装满为止。
(2)动态规划法O(nc)
m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。
由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下。
(3)回溯法O(2n)
cw:
当前重量cp:
当前价值bestp:
当前最优值
void backtrack(int i)
//回溯法 i初值1
{ if(i > n)//到达叶结点
{bestp = cp; return; }
if(cw + w[i] <= c)//搜索左子树
{ cw += w[i];
cp += p[i];
backtrack(i+1);
cw -= w[i];
cp -= p[i];
}
if(Bound(i+1)>bestp)
//搜索右子树
backtrack(i+1);
}
七、算法设计题(本题10分)
为了尽可能地逼近目标,我们选取的贪心策略为:
每一步总是选择一个使剩下的数最小的数字删去,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。
然后回到串首,按上述规则再删除下一个数字。
重复以上过程s次,剩下的数字串便是问题的解了。
具体算法如下:
输入s,n;
while(s>0)
{i=1;//从串首开始找
while(i{i++;}
delete(n,i,1);//删除字符串n的第i个字符
s--;
}
while(length(n)>1)&&(n[1]=‘0’)
delete(n,1,1);//删去串首可能产生的无用零
输出n;
二.计算题和简答题(每小题7分,共21分)
1.用O、
、
表示函数f与g之间阶的关系,并分别指出下列函数中阶最低和最高的函数:
(1) f(n)=100g(n)=
(2)f(n)=6n+n
g(n)=3n
(3)f(n)=n/logn-1g(n)=
(4)f(n)=
g(n)=
(5)f(n)=
g(n)=
1.阶的关系:
(1)f(n)=O(g(n))
(2)f(n)=
(g(n))
(3)f(n)=
(g(n))
(4)f(n)=O(g(n))
(5)f(n)=
(g(n))
阶最低的函数是:
100
阶最高的函数是:
四.算法设计题(15分)
1.一个旅行者要驾车从A地到B地,A、B两地间距离为s。
A、B两地之间有n个加油站,已知第i个加油站离起点A的距离为
公里,0=
,车加满油后可行驶m公里,出发之前汽车油箱为空。
应如何加油使得从A地到B地沿途加油次数最少?
给出用贪心法求解该最优化问题的贪心选择策略,写出求该最优化问题的最优值和最优解的贪心算法,并分析算法的时间复杂性。
算法设计题:
1.贪心选择策略:
从起点的加油站起每次加满油后不加油行驶尽可能远,直至油箱中的油耗尽前所能到达的最远的油站为止,在该油站再加满油。
算法MINSTOPS
输入:
A、B两地间的距离s,A、B两地间的加油站数n,车加满油后可行驶的公里数m,存储各加油站离起点A的距离的数组d[1..n]