华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx

上传人:b****6 文档编号:8016871 上传时间:2023-01-28 格式:DOCX 页数:25 大小:91.99KB
下载 相关 举报
华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx_第1页
第1页 / 共25页
华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx_第2页
第2页 / 共25页
华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx_第3页
第3页 / 共25页
华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx_第4页
第4页 / 共25页
华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx

《华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx》由会员分享,可在线阅读,更多相关《华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx(25页珍藏版)》请在冰豆网上搜索。

华中师范大学网络教育学院《算法设计与分析》练习题库及答案.docx

华中师范大学网络教育学院《算法设计与分析》练习题库及答案

《算法设计与分析》练习题库及答案

(加粗红色字体为2013下新增题目)

一、概念题:

请解释下列术语。

1.数据类型

2.队列

3.多项式复杂度

4.满二叉树

5.NP-难度

6.算法

7.SIMD(并行算法)

8.连通图

9.抽象数据类型

10.指数复杂度

11.递归

12.完全二叉树

13.状态空间树

14.NP-完全的

15.算法与过程

16.有向图与无向图

17.树

18.P类问题

19.确定的算法

20.NP问题

21.最小生成树

22.动态规划

23.数据结构

24.排序

二、填空题

1.简单递选分类过程中所需进行移动存储的操作次数较少,其最大值为___________。

2.一组有序的n个数,采用逐个查找算法查找一给定的数是否出现在序列中,其算法复杂性为_____________。

3.动态规划实际上是研究一类__________________的算法,其应用非常广泛。

4.BFS算法的中文名称是______________________算法。

5.一棵树中定义为该树的高度或深度。

6.二分检索树要求树中所有结点中的元素满足。

7.比较树的结点由称为和的两种结点组成。

8.外结点用一个结点表示,在二分检索算法中它表示不成功检索的一种情况。

9.由根到所有内部结点的距离之和称为;由根到所有外部结点的距离之和称为.

10.max和min被看成是两个内部函数,它们分别求取两个元素的大者和小者,并认为每次调用其中的一个函数都只需作次元素比较。

11.如果用分治策略来设计分类算法,则可使最坏情况时间变为o(nlogn)。

这样的算法称为。

12.贪心算法可行的第一个基本要素是。

13.当一个问题的最优解包含着它的子问题的最优解时,称此问题具有性质。

14.二路归并模式可以用树来表示。

15.kruskal算法对于每一个无向连通图g产生一棵。

16.因为如果有环,则可去掉这个环且不增加这条路径的长度(不含有负长度的环)。

如果k是这条最短路径上的一个中间结点,那么—由i到k和由k到j的这两条子路径应分为别是由i到k和.由k到j的最短路径。

否则,这条由i到j的路径就不是具有最小长度的路径。

于是,原理成立。

17.为了把动态规划应用于得到一棵最优二分检索树的问题,需要把构造这样的一棵树看成是一系列决策的结果,而且要能列出求取序列的递推式.

18.所谓可靠性设计最优化问题是在的约束下,如何使系统的可靠性达到最优的问题。

19.货郎担问题是求取具有的周游路线问题。

20.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:

__________,__________,__________,__________,__________。

21.算法的复杂性有_____________和___________之分,衡量一个算法好坏的标准是___________。

22.某一问题可用动态规划算法求解的显著特征是_____________________。

23.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X和Y的一个最长公共子序列_____________________________。

三、程序填空题。

1.对二叉树的先根次序周游算法递归表示为:

procedurePREORDER(T)

//T是一棵二元树。

T中每个结点有三个信息段:

ICHILD,,DATA,RCHILD//

ifT≠0thencallVISIT(T)

__________

(1)___________

__________

(2)___________

endif

endPREORDER

2.递归求取最大和最小元素

procedureMAXMIN(i.j.fmax,fmin)

//A(1:

n)是含有n个元素的数组,参数i,j是整数,1≤i,j≤n//

//该过程把A(i,j)中的最大和最小元素分别赋给fmax和fmin//

integeri,j;globaln,A(1:

n)

case

i=j:

fmax←fmin←A(i)

i=j-1:

ifA(i)

elsefmax←A(i);fmin←A(j)

endif

:

else:

mid←

___________

(1)______________

___________

(2)______________

fmax←max(gmax,hmax)

fmin←min(gmin,hmin)

endcase

endMAXMIN

3.用回溯法求子集和数问题的递归回溯算法

procedureSUMOFSUB

//找W(1:

n)中和数为M的所有子集,进入此过程时X

(1),…,X(k-1)的值已确定。

这些对W(j)按非降次序排列。

假定W

(1)≤M.//

globalintegerM,n;globalrealW(1:

n);globalBooleanX(1:

n)

realr,s;integerk,j

//生成左儿子。

注意,由于

,因此s+W(k)≤M//

X(k)←1

ifs+W(k)=Mthen//子集找到//

print(X(j),j←1tok)

else

ifs+W(k)+W(k+1)<=Mthen//B

=yrue//

______________

(1)__________________

endif

//生成右儿子和计算B

的值//

endif

ifs+r-W(k)≥Mands+W(k+1)≤M//B

=true//

thenX(k)←0

_______________

(2)_________________

endif

endSUMOFSUB

4.用回溯法求n-皇后问题的所有解

procedureNQUEENS(n)

//此过程使用回溯法求出在一个n*n棋盘上放置n个皇后,使其不能互相攻击

的所有可能位置//

integerk,n,X(1:

n)

X

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

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

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

whileX(k)≤nandnotPLACE(k)do//此处能放这个皇后吗//

____________

(1)___________

repeat

ifX(k)≤n//找到一个位置//

thenifk=n//是一个完整的解吗//

thenprint(X)//是,打印这个数组//

else_______

(2)_______;

_______(3)_______;//转向下一行//

endif

else_______(4)_______//回溯//

endif

repeat

endNQUEENS

 

5.二分查找算法

procedurebinsrch1(a,n,x,j)

//除n>0外,其余说明与binsrch同//

integerlow,high,mid,j,n;

low←1;high←

(1)//high总比可能的取值大1//

whilelow<

(2)do

mid←

ifx

then(3)

else(4)//x≥a(mid)//

endif

repeat

ifx=a(low)thenj←low//x出现//

elsej←o//x不出现//

endif;

endbinsrch1

 

6.求图中每对顶点之间的最短路径。

procedureall—Paths(cost,a,n)

//cost(n,n)是n结点图的成本邻接矩阵;a(i,j)是结点vi到vj的最短路径的

成本;cost(i,j)=0,1≤i≤n//

integeri,j,k,n;realcost(n,n),a(n,n)

fori←1tondo

forj<--1tondo

a(i,j)<--cost(i,j)

repeat

repeat

//将cost(i,j)复制到a(i,j)//

fork<--1toondo//对最高下标为k的结点的路径//

fori←-1tondo//对于所有可能的结点对//

fori<--1tondo

a(i,j)<--min{

(1),

(2)}

repeat

repeat

repeat

endall—Paths

7.简单的合并与查找运算

procedureu(i,j)

//根为i和j的两个不相交集合用它们的并来取代//

integeri,j

Parent(i)<--j;

endu

proceduref(i)

//找包含元素i的树的根//

integeri,j

j<--i;

while⑴do//若此结点是根,则Parent(j)<--0//

⑵;

repeat

return(j)

endf

8.插入分类

procedureinsertionsort(a,n)

//将a(1:

n)中的元素按非降次序分类,n≥1//

a(0)←-∞//开始时生成一个虚拟值//

forj←⑴tondo//a(1:

j-1)已分类//

item←a(j);i←⑵

whileitem

a(i+1)←a(i);i←i-1

repeat

a(i+1)←-item

repeat

endinsertionsort

9.归并分类

proceduremergesort(low,high)

//a(low:

high)是一个全程数组,它含有high-low+1≥0个待分类的元素//

integerlow,high;

iflow

thenmid←

//求这个集合的分割点//

call⑴//将一个子集合分类//

call⑵//将另一个子集合分类//

call⑶//归并两个已分类的子集合//

endif

endmergesort

10.使用链接表归并已分类的集合

proceduremerge1(q,r,p)

//q和r是全程数组link(1:

n)中两个表的指针。

这两个表可用来获得全程数组a(1:

n)中已分类元素的子集合。

此算法执行后构造出一个由p所指示的新表,利用此表可以得到按非降次序把a中元素分好类的元素表,同时q和r所指示的表随之消失。

假定link(0)被定义,且假定表由0所结束//

globaln,a(1:

n),link(0:

n)

localintegeri,j,k

i←q;j←r;k←0//新表在link(0)处开始//

while⑴and⑵do//当两表皆非空时作//

ifa(i)≤a(j)//找较小的关键字//

thenlink(k)←i;k←i;i←link(i)//加一个新关键字到此表//

else⑶

endif

repeat

ifi=0then⑷

elselink(k)←i

endif

p←link(0)

endmergel

11.作业排序算法的概略描述

proceduregreedy-job(d,j,n)

//作业按p1≥p:

≥…≥Pn的次序输入,它们的期限值d(i)≥1,1≤i≤n,n≥1.j

是在它们的截止期限前完成的作业的集合//

                           j←{1}

                           for⑴tondo

                           ifj∪{i}所有作业都能在它们的截止期限前完成

then⑵

endif

repeat

endgreedy—job

12.生成二元归并树算法

lineproceduretree(l,n)

//l是n个单结点二元树的表//

fori←1ton-1do

callgetnode(t)//用于归并两棵树//

lchild(t)<--least(l)//最小的长度/

rchild(t)<--least(l)

weight(t)<--⑴

callinsert(l,t)

repeat⑵

//留在l中的树是归并树"

endtree

13.kruskal算法

lineprocedurekruskal(e,cost,n,t,mincost)

//g有n个结点,e是g的边集。

cost(u,v)是边(u,v)的成本。

t是最小成本

生成树的边集。

mincost是它的成本"

realmincost,cost(1:

n,1:

n);

integerParent(1:

n),t(1:

n-1,2),n;

以边成本为元素构造一个min—堆

Parent←1//每个结点都在不同的集合中矿

i←mincost←0

whilei

从堆中删去最小成本边(u,v)并重新构造堆

j←find(u);k←find(v)

ifj≠kthen⑴

t(i,1)<—ut(i,2)←v

mincost<—⑵

callunion(i,k)

endif

             repeat

             ifi≠n-1thenprint(‘nospanningtree’)endif

             return

             endkruskal

14.多段图的向前处理算法

lineprocedurefgraPh(e,k,n,P)

//输入是按段的顺序给结点编号的,有n个结点的k段图。

e是边集,c(i,j)是边的成本。

P(1:

k)是最小成本路径//

realcost(n),integerd(n一1),P(k),r,j,k,n

forj<--n一1to1by一1do//计算cost(j)//

设r是一个这样的结点,∈e且使c(j,r)+cost(r)取最小值

cost(j)+c(j,r)+cost(r)

d(j)←r

repeat//找一条最小成本路径//

P

(1)<一1;P(k)←n

forj<--2to⑵do//找路径上的第斗个结点//

P(j)<--d(P(j一1))

repeat

endfgraPh

15.求最小元的并行算法

proceduremimdmin(a

(1),a

(2),...,a(n),min)

输入;i={a

(1),a

(2),…,a

输出:

i中最小元min

处理器个数;p

ifn>pthen

foreachpi:

1≤i≤ppardo

forj=i+ptonsteppdo

if⑴then

a(i)←a(j)

endif

repeat

endfor

k←p

else

k←n;

endif

whilek>ldo

foreachpi:

1≤i≤[k/2]pardo

ifa(k-i+1)

then⑵

endif

endfor

k←[k/2]

repeat

min←a

(1)

endmimdmin

16.0/1背包问题的回溯法求解。

procedurebknaPl(m,n,w,P,fw,fp,x)

//m是背包容量。

有n种物品,其重量与效益分别存在数组w(1:

n)和P(1:

n)中sp(i)/w(o≥P(i+1)/w(i+1)。

fw是背包的最后重量,fp是背包取得

的最大效益。

x(1:

n)中每个元素取0或1值。

若物品k没放人背包,则x

(k);0;否则x(k)=1//

 integern,k,y(1:

n),i,x(1:

n);real,m,w(1:

n),P(1:

n),fw,fp,cw,cp;

cw←cp←o;k←1;fp←l//cw是背包当前重量;cp是背包当前取得的效益值//

loop

whilek≤nand⑴≤mdo//将物品、k放人背包//

cw←cw+w(k);cp←cp+P(k);y(k)←1;k←k+1

repeat

ifk>nthenfp←cp;fw←cw;k←n;x←y//修改解//

else⑵//超出m,物品k不适合//

endif

whilebound(cp、cw,k,m)≤fpdo//上面置了fp后,bound=fp//

whilek

0andy(k)

1do

k←k-1,//找最后放人背包的物品//

repeat

ifk=0thenreturnendif//找最后放人背包的物品//

y(k)←0;cw←cw-w(k);cp←cp—P(k)//移掉第k项//

repeat

k←k+1

repeat

      endbknaPl

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

ProcedureHamiltonian(n)

{k←1;

x[k]←0;

Whilek>0do

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

whileB(k)=falseandx[k]≤ndo

______

________

repeat

Ifx[k]≤n

thenifk=nthen{printx;return}

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

endif

else______

________

endif

repeatend

}

procedureB(k){G[x[k-1],x[k]]≠1thenreturnfalse;fori←1tok-1doifx[i]=x[k]thenreturnfalse;endifrepeatreturntrue;}

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

Voidmaxmin(A,n)intA[];intn;

{intmax,min,i;

max=A[1];

min=A[1];

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

if(____

___)max=A[i];

elseif(A[i]

____;

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

}

19.选择排序:

设数组中有N个数,取I=1,2,3,„„N-1,每次找出后N-I+1个数字中最小的与第I个数字交换位置。

程序如下:

uses crt; 

var n:

array[1..10] of integer; 

    i,j,k,t,min:

integer; 

begin 

     clrscr; 

     for i:

=1 to 10 do read(n[i]); 

     for i:

=1 to 9 do begin 

         min:

=30000; 

         for j:

=i to 10 do begin 

             if n[j]

                 ___

____;

                k:

=j; 

             end; 

         end; 

         t:

=n[i]; 

          ___

____;

         n[k]:

=t; 

     end; 

     for i:

=1 to 10 do write(n[i]:

4); 

end.

四.问答题

1.算法的重要的5个特征是什么?

2.什么是动态规划?

3.回溯程序的4种因素是什么?

4.请解释贪心法的基本思想,并用贪心法解决如下背包问题。

背包问题:

n=3,M=30,(p1,p2,p3)=(20,14,25),(w1,w2,w3)=(20,15,15)

5.请解释动态规划的基本思想,并写出用动态规划解决0/1背包问题所采用的递推方程式。

6.请解释动态规划的基本思想,并写出用动态规划解决多段图问题所采用的递推方程式。

7.请解释回溯法的基本思想,并写出用回溯法解决子集和数问题的状态空间树。

8.已知如下定义的数据结构,请画出它的逻辑示意图,并说明它是何种类型的数据结构。

DS=

D={1,2,3,4,5,6}

R={<1,2>,<1,3>,<2,3>,<3,6>,<3,5>,<5,4>,<6,2>,<4,3>,<5,6>}

9.若将数据序列D={1,2,3}输入堆栈,请给出所有可能的堆栈输出。

10.已知如下多段图,请用动态规划方法的向后处理法写出求解此问题的递推公式并完成对各结点的计算。

11.请用Prim方法求下图所示的最小生成树。

(请写出该方法的基本思想和主要中间过程)。

12.最佳原理的基本思想是什么?

13.利用分枝定界法求解流动推销员问题。

设给定5个城市的距离矩阵为

D==(dij)5×5

 

14.将所给定序列a[1:

n]分为长度相等的两段a[1:

n/2]和a[n/2+1:

n],分别求出这两段的最大子段和,则a[1:

n]的最大子段和有哪三种情形?

15.由0——1背包问题的最优子结构性质,可以对m(i,j)建立怎样的递归式?

16.对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。

《算法设计与分析》练习题库参考答案

二、概念题:

请解释下列术语。

1.数据元素的集合。

2.队列是一个线性表,限制为只能在固定的一端进行插入,在固定的另一端进行删除。

3.对于算法a,如果存在一多项式p(),使得对a的每个大小为n的输入,a的计算时间为o(p(n)),则称a具有多项式复杂度

4.二叉树的层数i与该层上的结点数n的关系为:

n(i)=

5.如果可满足性约化为一个问题L,则称该问

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

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1