算法设计与分析课后答案+田翠华著_第1页
算法设计与分析课后答案+田翠华著_第2页
算法设计与分析课后答案+田翠华著_第3页
算法设计与分析课后答案+田翠华著_第4页
算法设计与分析课后答案+田翠华著_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

参考答案

第1章

一、选择题

1.C2.A3.C4.CADB5.B6.B

7.D8.B9.B10.Bll.D12.B

二、填空题

1.输入;输出;确定性;可行性;有穷性

2.程序;有穷性

3.算法复杂度

4.时间复杂度;空间复杂度

5.正确性;简明性;高效性;最优性

6.精确算法;启发式算法

7.复杂性尽可能低的算法;其中复杂性最低者

8.最好性态;最坏性态;平均性态

9.基本运算

10.原地工作

三、简答题

1.高级程序设计语言的主要好处是:

(1)高级语言更接近算法语言,易学、易掌握,一般工程技

术人员只需要儿周时间的培训就可以胜任程序员的工作;

(2)高级语言为程序员提供了结构化程序设计的环境和工

具,使得设计出来的程序可读性好,可维护性强,可靠性高;

(3)高级语言不依赖于机器语言,与具体的计算机硬件关系

不大,因而所写出来的程序可移植性好、重用率高;

(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,

发用周期短,程序员可以集中集中时间和精力从事更重要的创造

性劳动,提高程序质量。

2.使用抽象数据类型带给算法设计的好处主要有:

(1)算法顶层设计与底层实现分离,使得在进行顶层设计时

不考虑它所用到的数据,运算表示和实现;反过来,在表示数据

和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什

么场合引用它。这样做使算法设计的复杂性降低了,条理性增强

了,既有助于迅速开发出程序原型,又使开发过程少出差错,程

序可靠性高。

(2)算法设计与数据结构设计隔开,允许数据结构自由选择,

从中比较,优化算法效率。

(3)数据模型和该模型上的运算统一在抽象数据类型中,反

映它们之间内在的互相依赖和互相制约的关系,便于空间和时间

耗费的折衷,灵活地满足用户要求。

(4)由于顶层设计和底层实现局部化,在设计中出现的差错

也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、

删、改也都是局部的,因而也都容易进行。因此,用抽象数据类

型表述的算法具有很好的可维护性。

(5)算法自然呈现模块化,抽象数据类型的表示和实现可以

封装,便于移植和重用。

(6)为自顶向下逐步求精和模块化提供有效途径和工具。

(7)算法结构清晰,层次分明,便于算法正确的证明和复杂

性的分析。

3.算法的复杂度是算法运行所需要的计算机资源的量。

4.当问题的规模递增时,将复杂度的极限称为渐进复杂度。

5.采用复杂性渐近性态替代算法复杂度,使得在数量级上

估计一个算法的执行时间成为可能。

四、计算题

1.验证下面的关系:

0(1)<0(logZ7)^0(77)<0(/?log/7)<0(Z?2)

及0(2")<0(A!)〈06)o

证明1:数学归纳法。

证明2:反证法。

证明3:定义证明

令&(〃)=0(1),/(A)=0(log/?),£(〃)=0(n),/(〃)=

0(7?log77),£®=0(,)。

根据|f(〃)I=|0(g(M)I定义,可知一定存在两个正的常数C

和使得对所有的为,有以〃)WCg(玲o

那么,就有£(〃)WC,乙(力WGlog/?,£(加WG〃,

/(〃)Wanlogn,£(〃)Wa*

所以,0(g(〃))之间的比较可以通过/(〃)之间的比较得以实

现。

而当〃N〃()时,Ci<Glog水Qn<&Hog水C5万成立。

再根据0(g(N))表示所有f(/V)增长的阶不超过gQN)的

函数的集合,它用以表达一个算法运行时间的上界。

则£(〃)的上界〈分5)的上界<△(〃)的上界〈尤(而的上界〈

△5)的上界

那么就验证了

0(1)<0(logz?)<0(77)<0(nlog77)<0(772)0

同理,有:0(2")<0(〃!)<03)。

证明4:极限法(通常使用罗比塔法则)。

2.找出下述证明中的错误:因为A=0(A),2n=05),…,

故:

解答:概念不清。

止0(〃),2/7=0(〃),…,是集合,是说〃,2n,­••,的阶是

力不是数值上相等。

是数值求和,即首项为〃的〃项等差为〃的数列求和

所以,。应该是:

=1z?+2/?+37?+...+nn=z?(zz+l)z?/2,而

=O(max(1,2,3,4,n))//根据性质0(/*)十0(g)

=0(max(f,g))

=05)〃集合操作,上界的并取最大者

3.求以下各式的渐进表达式:

5

56+8n,36/11+3",56+3/〃,log/?,6log4%

解答:

5/?2+877=0(曲;1

34/11+3"=0(3");

56+3//?=0(1)//0(1)表示常数;

10g〃”=0(10g/7);

6log4n-0(7?)O

4.按照渐进阶从低到高的顺序排列下列表达式:

ri,log/?,3",45n,6,3n\n\o

解答:

1

log/?,45n,3n',5n,3”,n!0

5.确定关系:对于下列各组函数f(〃)和g(加,确定f

(7?)=0或/'(/?)=Q(g(〃))或/'(〃)=。(g(7?)),

并简述理由。

(1)f(z?)=logd,g(/7)=logz?+7;

(2)f(z?)=logn,g(〃)=n

(3)f(加=n,g(〃)=log?n;

(4)f(〃)=nlogn+n,g(〃)=log〃;

(5)f(77)=11,g(77)=Og11;

(6)f(z?)=log2n,g(7?)=logn;

(7)f(〃)=2",g(〃)=100if;

n

(8)f(z?)=2",g(〃)=30

解答:

(1)f(z?)=log〃2=。(log〃+7)=。(g(/?));

(2)f(〃)=log/?2=0(/?'2)=0(g(n));

(3)f(7?)=72=Q(log2n)=Q(g(n));

(4)f(z?)=nlogn-\-n=Q(logn)=Q(g(/?));

(5)f(〃)=11=0(log11)=0(g(〃));

(6)f(n)=log2n=Q(log/?)=Q(g(〃));

(7)f(77)=2"=。(100T?)=Q(g(〃));

(8)f(〃)=2〃=0(3")=0(g(/7))o

6.证明:n\=0(/7")o

证明:

7.证明:如果一个算法在平均情况下的计算时间复杂度是。

(f(n)),则该算法在最坏情况下所需的计算时间是。(f(n))o

证明:

8.硬件厂商XYZ公司宣称他们最新研制的微处理器运行速

度为其竞争对手ABC公司同类产品的100倍。对于计算复杂性分

别为mn2,i?和加的各算法,若用ABC公司的计算机在1小时

内能解输入规模为〃的问题,那么用XYZ公司的计算机在1小时内

分别能解输入规模为多大的问题?

解答:

n=100/7;

n2=100T72,/.n=10zz;

n3=100/?\n=107377=4.64/?;

n!=100z?!,/.n</?+logl00=/?+6.64o

9.

(1)假设某算法在输入规模为免时的计算时间为T(77)=3

X2"。在某台计算机上实现并完成该算法的时间为1秒。现有另一

台计算机,其运行速度为第一台的64倍,那么在这台新机器上用

同一算法在力秒内能解输入规模为多大的问题?

(2)若上述算法的计算时间改进为T(n)=4,其他条件不

变,则在新机器上用Z秒时间能解输入规模为多大的问题?

(3)若上述算法的计算时间进一步改进为7(加=8,其他

条件不变,那么我们在新机器上用力秒时间能解输入规模为多大

的问题?

解答:

(1)设新机器用同一算法在t秒内能解输入规模为n'的问

题,则有

7(〃)=3X2"=3义2"'/64,得〃'=〃+6;

(2)n2=64z?2,得〃'=8〃;

(3)由于7(加=8为常数,因此算法可以为解任意规模的

问题。

五、上机题

二分检索是指在一个已经排序的数组中查找一个指定的数据

是否存在的问题。进一步说,假定一个具有4个元素的整型数组a

和一个整数x,数组a的元素已经按由小到大的顺序排序,希望查

找X在数组a中是否出现。若出现,输出对应的数组元素下标,

否则,输出不存在信息。

编程时具体的实现方法是:将•x与a的中间元素a\_N/2]比

较,如果相等则结束。否则,若xVa[N/2],由于a是有序的,

可以肯定x只可能出现在前半个数组中;若x>a[N/2],则x

只可能出现在后半个数组中。然后,将得到的半个数组看成原来

的数组,继续重复上述过程直到数组的所有元素比较完毕或发现

一个相等的元素为止。

在进行程序设计时,力是数组大小的上限,实际的元素个数由

键盘输人。

#include<stdio.h>.

ttdefneN50

intbsearch(int*a,intn,intx)〃参数为数组、元素

个数和被查找的值

{intk=0,m=n-l,mid;//k,m,mid为被查找区间的最小、

最大和中间元素下标

while(k<=m)〃若最小下标超过最大下标则终止循

环,说明不存在

{mid=(k+m)/2;〃取中间下标,注意整数相除取整

if(x==a[mid];

returnmid;〃相等时绮束,返回元求下标

else

if(x<a[mid])

m=mid-1;〃x应在前半个数组中,最大下标凋

else

k=mid+1;〃x应在后半个数组中,最小下标调

)

return-1;〃执行此语句时,必有k>m,即x不存在,

返回-1作标志

)

voidrnain()

{inta[N],x,n,rt,k;

printf(uinputcount(<=50):");〃输人数组元素

个数

scanf("%d",&n);

printf(“'Inputal1elermnts:'');

for(k=0;k<n;k++);

scanf("d”,&a[k]);〃输人数组元素,元素可

用空格分隔

printf(inputdatasearched");

scanf("%d",&x);〃输人被查找的值x

rt=bsearch(a,n,x);〃执行查找

(rt==-l)?printf("\nNot

found."):printf("\nFound:%d.”,rt);}//显示查找结果

第2章

一、选择题

1.C2.C

二、填空题

1.递推法;生成函数法;特征方程法;数学归纳法;不规

则法

2.递归消除有利于提高算法的时空性能;研究递归消除有

利于透彻理解递归机制

三、简答题

1.人们在解决一些复杂问题时,为了降低问题的复杂程度

(如问题的规模等),一般总是将问题逐层分解,最后归结为一些

最简单的问题。这种将问题逐层分解的过程,实际上并没有对问

题进行求解,而只是在解决了最后那些最简单的问题后,再沿着

原来分解的逆过程逐步进行综合,这就是递归的基本思想。

2.假定所求解递归方程的解(系列)是某个函数(如G(x))

展开成无穷级数后的系数,于是,可以先利用递归方程求出G(x)

的解析表达式,然后,再将G(x)展成无穷级数,其/项的系数

自然就是递归方程的通解形式。

四、计算题

1.求和:

(1)

(2)

解答:

(1)设和为S,则有

5=a+2a2+3a+'''+na①

等式两边同乘a,得

aS=a2+2/+…+〃an+l②

①-②得:

(1-a)S=a+a~+a+,,,+an-na"”

整理得:

S=a(l-a")/(『a)2-na[/(l-a)

(2)设和为S,则有

当n为偶数时,

当n为奇数时,

2.设回〃都是整数,计算

(1)(加勿)/2」+(77-研1)/2」

(2)「(77+%)/21+「(77-研1)/21

解答:

(1)因为勿,〃都是整数,所以加加与止"同时为奇数或偶数。

当加必与77-%同时为奇数时,原式=(/?+犷1)/2+(ZT研1)/2=

n

当〃+/与77-必同时为偶数时,原式=(72+血/2+(77-%)/2=n

(2)同理,",〃都是整数,所以力R与k勿同时为奇数或偶

数。

当??+勿与ZT•必同时为奇数时,原式=(77+研1)/2+(77-研1)/2=

n+\

当n+m与n-m同时为偶数时,原式=(〃+%)/2+^n-ni)/2+1=n+\

3.判断下述等式的真伪:

(1)(LX」差=2」

⑵「(「x[)"2]=「

(3)r(LJ)1/21=「一1

解答:(1)当后代k为整数时,原等式成立。

当为整数时,原等式不成立。此时左端不一定为整数,

而右端为整数。

(2)等式成立。

(3)当尸〃,k为整数时,原等式成立。

当xa4为整数时,原等式不成立。此时,(Lx」)i/2<rx

〕叱所以左端小于右端。

4.求证:

(1)l_x」+l_y」Wx+y

(2)「x[+「y12「x+y~\

(3)「log(z?+l)1=Llog/?」+1

(4)L(x+勿)/〃」=L(l_x」+m)/n\

(5)

证明:

(1)当x,y为整数时,原等式成立。

当x,y不为整数时,令x=I.x」+\x,y=LyJ+Ay,其

中0<Ax,\yW1o则有

x+y=|_x」+Ax+|_y」+zV=|_x」+|_y」+Z\x+

△y

因为0cAx,Ay<1,所以0<\x+\y<2

贝I」l_x」+l_y」+Ax+Ay〉l_x」+l_y」,即有:x+y

>l_x」+!_『」

所以,原不等式Lx」+Ly」Wx+y成立。

(2)当x,y为整数时,原不等式成立。

当x,y不为整数时,令*=「才]—^x,y=「y]—Ay,其

中0<,Ay<1o则有:

「x+y〕=「「x\—△*+「y]—Ay1=「「/]+「y]—(A

x+Ay)1

因为0W△*,Ay<1,所以有0WA^+Ay<2。因此,

「x+y]W「「x[+「y[1=「x]+「y]。

所以,原不等式「x1+「yl2「x+y1成立。

(3)当A为2"时,「log(/zH)1=A+1,而Llogz?J+1=A+l,

所以,原等式成立。

当A不为2"时,则2yA<27此处A=l_log〃」,那么2"+10

+1W2叱则有:

Flog(/?+l)l=A+1,Llog/?J+1=A+1,所以,原等式成立。

(4)若要使原等式成立,必有

,这里x=l_x」+\x,0WAx<1

左”而二右”而

所以,原等式成立。

(5)当炉2研1时,历0,1,2,3,…,那么

左端=0+1+1+2+2+3+3+…+研ZZF2*(1+R)+而

右端=L(2研1)2/4」=|_(4/+4研1)/4」=/(1+勿)=左端

所以,原等式成立。

当炉2〃时,炉0,1,2,3,…,那么

左端=0+1+1+2+2+3+3+…+(/n~l)+m

2*(l+/?rl)(犷1)/2+/=zz/2

右端=L(2%)74」=/n=/=左端

所以,原等式成立。

5.设x,y为任意实数,定义:

{xmody-x-y\_x/yJ,当yW0

xmod0=x

依据上述定义:

(1)若尸-1,计算xmod28o

(2)若xmod3=2,xmod5=3,求xmod150

解答:

(1)当下T时一,xmod28=(-l)mod28=(-1)-28L(T)/28」

=-1-28*(-1)「1/281=27

(2)

①当xmod3=2,xmod5=3,那么有命题xmod(2/7-1)=/?

成立,此时x>0。

用数学归纳法证明命题:当上2时,有xmod3=2,成立。

当/7=3时,有xmod5=3,成立。

假设当〃=A时,有Amod(2A-1)=k

成立,

然后证明当炉〃+1成立。所以,命题成立。

即有:xmod(2(A+1)T)=A+l0

根据命题Jmod(2zrl)=〃,有在Amod(2zrl)=Amodl5中,

2/7-1=15,则77=8o

所以,Amodl5=8o

xmod3=2,xmod5=3,此时x>0,否则不满足定义

.••存在整数%,使得:x=3左+2,同时,x=5L+3,

即有:3左+2=5%+3,得左=(5左+1)/3=5(&-1)

/3+2

k、,人为整数.••存在整数A,使得:k=(&-1)/3,即

有:k2=3k+1

:.x=5左+3=5(34+1)+3=154+8

Amodl5=8o

6.求序列2,5,13,35,…2"+3〃的生成函数。

解答:根据题义,得

〃(0)=2,77=0

〃(n)=2"+3",〃=1,2,3,…

设生成函数为,将,(〃)=2"+3”代入,得

将上式展开并整理,得

G(x)=[2-5户(2/2+3〃)(3*2"42*3"|)x"2]/[(1一2才)(1一3才)]

7.给定a0=l,a=1,a^2=an+i+6a„,试求出劣的非递归形式的表

达式。

解答:原方程所对应的特征方程为:

(a2-a-6=0

为齐次方程,则齐次解:S=3,0=-2,重数均为1。

记通解的形式为:a尸四"+为233"+B(-2)〃

将a=1,4=1代入上式,得

{A+B=l

34-2庐1

解得:2=3/5,庐2/5

从而,得当的非递归形式的表达式为:4=(3"-/5。

8.设有国,=0,品=1,a=T和a=-a^i+16五2-20a^,当〃

N3。求出a”的表达式。

解答:原递归方程所对应的特征方程为:

/+/-16^-20=0

解得特征方程的根:<7.=-5,/=2,重数分别为1和2。

记通解的形式为:a尸(/+物)6"+。芯=(4+物)*2n+a(-5)"

将a=0,ai=l,殳=-1代入上式,得

4+俏0

2G4+而-5C=1

4(4+20+(-5)2^=-1

解得:1=5/49,庐1/7,小-5/49

从而,得当的非递归形式的表达式为:/=(5/49W7)*2"

+(-5)ntl/49o

9.设a=1,为=5,4=436区-2,当〃22。求出劣的解析表达

式。

解答:原递推方程的特征方程为

*-犷6=0,则齐次特征方程为

齐次特征的解为:s=3,0=-2,重数均为1。

记通解的形式为:an=Aq,+Bq2"=A3"+B(—2)n

将a0=l,句=5代入上式,得

'/+B=1

3/-2庐5

解得:4=7/5,庐-2/5

fl+I

记通解的形式为:4=幽/+/2”=(7*3"+(-2))/5

10.求解方程:

T(2)=1,n=l

75)=〃々但/2)+,力2,且有A,使得

解答:由递归方程,递推得

7(〃)=/7l/2T(/71/2)+n

=小[(小)"270+小]+〃

=nl/2/"(〃")+n+n

=/n1/4[(H)1/27((Z71/4)1/2)+/]+2n

=4〃〃"n"T但/8)+3〃

令,则有

T{n)=/7(1/2+log(log/?))

11.求证方程

的解是X(n+1)=Cn2n/(n+1)

证明:根据递归方程,递推得

x(2)=x(1)x(1)=1=C)2

2

x(3)=x(1)x(2)+x(2)x(1)=1+1=2=C4/3

x(4)-x(1)x(3)+x(2)x(2)+x(3)x(l)=5=

x(5)=x(1)x(4)+x(2)x(3)+x(3)x(2)+

x(4)x(l)=14=C\/5

*(〃)=。)2(叱1)/〃

^(TTi-l)=<72fl/(72+l)

12.求证递归方程

{7(1)=0

7(/7)=T(L"2」)+T(「A/21)+〃-1,A>1

riognl

的解是T(〃)=〃「log〃1-2+lo

证明:

(1)当〃=2时,由递归方程和初值,推得

T(2)=T(1)+T(1)+27=0+0+2-1=1

由方程的解,得T(2)=2-2+l=lo所以,结论成立。

(2)假设当4时.成立,既有7(〃)=A「log〃]-2hogAl+1

是原递归方程的解。

那么当斤4+1时,下面证明T(A+1)=(A+l)「log(A+l)〕-2r

logU+1)1+l是原递归方程的解。

当〃WA时,7(|_—/2」)+7(「A-/21)+A-l=k「log*-2「卜囚

+1

当炉A+1且A为奇数时,有

AL(A+l)/2j)+T(F(A+D/21)U+l-1

=T(l_A/2」+l)+7(「02])+k

=2T(「%/21)+A

=2[「A/2]•「log「A/211-25「"211+i]+4

=(〃+l)・「log「4/211-2M“211”+2+A

=(A+1)(「log(A+l)/2+1])-2「"g<…21+i

=U+1)「log(A+l)-1+11-2riog(k+1)1+1

=(A+1)「log(4+1)]-2riog(k+1)1+1

=T(A+1)

当上〃+1且A为偶数时,有

7((m4)/2」)+7(「(-1)/21)+A+1-1

=7(4/2)+T(A/2+l)+k

=(A/2)「log(A/2)1—2「w"2)1+i+[(A/2+1)「log(A/2+l)1

_2「3(k/2+D1+]]+k

=(A/2+A/2+l)「log(4/2)]-(2riog(k/2)1+2riog(k/2+1)1)+2+k

=(A+1)「log(A/2)1-2r,og(k/2)1+,+2+k

=T(k+l)

即当n=k+l时;命题成立。

所以,原命题成立。

五、上机题

1.计算Hermite多项式

Voidmain()

(

Printf(“\n%f“,H(2,2.0));//输出结果76.000000

}

DobuleH(intn,floatx)

(

Switch(n)

(

Case0:return1;

Case1:2*x;

)

Return2*x*H(nT,x)-2*(n-l)*H(n-2,x)

}

2.求解汉诺塔问题

汉诺塔问题:设4B、。是三根金针。开始时,在金针4上

有〃只纸盘,这些纸盘自下而上,由大到小地叠放一起,各纸盘

从小到大编号为1,2,…,n,如图A-1所示。现要求将金针A

上的这一叠纸盘移到金针台上,并仍按同样顺序叠置。

图AT汉诺塔问题的初始状态

在移动纸盘时应遵守以下移动规则:

规则(1):每次只能移动一个纸盘;

规则(2):任何时刻都不允许将较大的纸盘压在较小的纸盘

之上;

规则(3):在满足移动规则(1)和(2)的前提下,可将纸

盘移至月,B,。中任一根金针上。

分析与解答:

(1)汉诺塔问题的递归算法如下:

publicstaticvoidHanoi(intn,intA,intB,intC)

(

if(n>0){

Hanoi(n-1,A,C,B)'

Move(n,A,B);

Hanoi(n-l,C,B,A);

}

|

(2)汉诺塔问题的非递归算法。

教材中所述非递归算法的目的塔座不确定。当n为奇数时,

目的塔座是B,按顺时针方向移动;而当n为偶数时,目的塔座为

C,按反时针方向移动。为确定起见,规定目的塔座为B。汉诺塔

问题的非递归算法可描述如下:

publicstaticvoidHanoi(intn)

(

int[]top={0,0,0}

int[][]tower=newint[n+1][3];

intx,y,min=0;

Booleanb,bb;

for(inti=0;i<=n;i++)

{tower[i][0]=n-i+l;tower[i][l]=n+l;

tower[i][2]=n+l;}

top[0]=n;b=odd(n);bb=true;;

while(top[1]<n){

if(bb){

x=min;

if(b)y=(x+l)%3

elsey=(x+2)%3;

min=y;bb=false;

)

else{

if(tower[top[x]][x]>tower[top[y]]|y])

{inttmp=x;x=y;y_tmp;}

}

move(tower[top[x]][x],x+1,y+1);

tower[top[y]+1][y]=tower[top[x]][x];

top[x]一;top[y]++;

}

]

下面用数学归纳法证明递归算法和非递归算法产生相同的移

动序列。

当27=1和77=2时容易直接验证。设当k&n~\时,递归算

法和非递归算法产生完全相同的移动序列。考察的情形。

将移动分为顺时针移动(C)、逆时针移动(CC)和非最小圆

盘塔座间的移动(0)o

当〃为奇数时,顺时针非递归算法产生的移动序列为:C,0,

C,0,C;逆时针非递归算法产生的移动序列为:CC,0,CC,

0,…,CCo

当n为偶数时,顺时针非递归算法产生的移动序列为:CC,0,

CC,0,CC;逆时针非递归算法产生的移动序列为:C,0,C,

0,…,Co

①当n为奇数时,顺时针递归算法Hanoi(n,A,B,C)产

生的移动序列为:

Hanoi(n-1,A,C,B)产生的移动序列,0,Hanoi(n-1,

C,B,A)产生的移动序列。

Hanoi(n-1,A,C,B)和Hanoi(n-1,C,B,A)均为偶

数圆盘逆时针移动问题。由数学归纳法知,产生的移动序列均为:

C,0,C,0,…,Co因此,Hanoi(n,A,B,C)产生的移动序

列为:C,0,C,0,Co

②当n为偶数时,顺时针递归算法Hanoi(n,A,B,C)产

生的移动序列为:

Hanoi(n-1,A,C,B)产生的移动序列,0,Hanoi(n-1,

C,B,A)产生的移动序列。

Hanoi(〃一1,A,C,B)和Hanoi(〃一1,C,B,/)均为奇

数圆盘逆时针移动问题。由数学归纳法知,产生的移动序列均为:

CC,0,CC,0,…,CCo因此,Hanoi(〃,A,B,C)产生的移动

一序列为:CC,0,CC,0,CCo

当n为奇数和偶数时的逆时针递归算法也类似。

由数学归纳法即知,递归算法和非递归算法产生相同的移动

序列。

(3)双色汉诺塔问题:设尔B、。是三根金针。开始时,在

金针力上有〃只纸盘,这些纸盘自下而上,由大到小地叠放一起,

各纸盘从小到大编号为1,2,…,n,奇数编号圆盘为白色,偶数

编号圆盘为黑色。如图A-2所示。现要求将金针月上的这一叠纸

盘移到金针夕上,并仍按同样顺序叠置。

图A-2双色汉诺塔问题的初始状态

在移动纸盘时应遵守以下移动规则:

规则(1):每次只能移动一个纸盘;

规则(2):任何时刻都不允许将较大的纸盘压在较小的纸盘

之上;

规则(3):任何时刻都不允许将同色圆盘叠在一起;

规则(4):在满足移动规则(1)和(3)的前提下,可将纸

盘移至小B,。中任一根金针上。

试设计一个算法,用最少的移动次数将塔座4上的〃个圆盘

移到塔座方上,并仍按同样顺序叠置。

分析与解答:

可用教材中的标准Hanoi塔算法。问题是要证明标准Hanoi

塔算法不违反规则(3)。

用数学归纳法。

设Hanoi(A,A,B,C)将塔座A上的n个圆盘,以塔座C

为辅助塔座,移到目的塔座〃上的标准Hanoi塔算法。

归纳假设:当圆盘个数小于〃时一,Hanoi(〃,A,B,C)不违

反规则(3),且在移动过程中,目的塔座B上最底圆盘的编号与n

具有相同奇偶性,辅助塔座C上最底圆盘的编号与n具有不同奇

偶性。

当圆盘个数为n时,标准Hanoi塔算法Hanoi(〃,A,B,C)

由以下3个步骤完成。

①Hanoi(n~1,A,C,夕);

②Move(A,B);

③Hanoi(z?—1,C,B,力)。

按归纳假设,步骤①不违反规则(3),且在移动过程中,塔

座C上最底圆盘的编号与n-\具有相同奇偶性,塔座方上最底圆

盘的编号与n-1具有不同奇偶性,从而塔座〃上最底圆盘的编号

与n具有相同奇偶性,塔座。上最底圆盘的编号与n具有不同奇

偶性。

步骤②也不违反规则(3),且塔座B上最底圆盘的编号与n

相同。

按归纳假设,步骤③不违反规则(3),且在移动过程中,塔

座〃上倒数第2个圆盘的编号与n—1具有相同奇偶性,塔座月上

最底圆盘的编号与n~\具有不同奇偶性,从而塔座夕上倒数第2

个圆盘的编号与〃具有不同奇偶性,塔座A上最底圆盘的编号与〃

具有相同奇偶性。

因此在移动过程中,塔座方上圆盘不违反规则(3),而且塔

座〃上最底圆盘的编号与n具有相同奇偶性,塔座。上最底圆盘

的编号与n具有不同奇偶性。

由数学归纳法即知,Hanoi",A,B,C)不违反规则(3)。

第3章

一、选择题

1.B2.B

二、填空题

1.LlognJ+1

2.2n-l

三、简答题

1.将一个难以直接解决的大问题,分割成一些规模较小的

类型相同问题,这些子问题相互独立,以便各个击破,分而治之。

如果原问题可分割成"个子问题,1并且这些子问题都可

解,然后求解这些问题,那么就可利用这些子问题的解求出原问

题的解;如果子问题还比较复杂而不能直接求解,还可以继续细

分,直到子问题足够小,能够直接求解为止。此外,为了得到原

始问题的解,必须找到一种途径能够将各个子问题的解组合成原

始问题的一个完整答案。

2.将待查的数据与非降序数组中的中间元素进行比较,若

二者相等则表示查到;若该数据小于中间元素的值,则下次在数

组的前半部分中继续找;否则,在数组的后半部分中查找。即每

次检索将与待查数据的比较次数减半。如此继续进行下去,直到

查到该值的元素或不存在所查找的数据。此种分治方法,称为二

分检索。

四、计算题

1.作一个“二分”检索算法,它将原集合分成1/3和2/3

大小的两个子集。分析此算法并与算法3.1比较。

输入:已按非减序分类的〃个元素的数组4和X乃是被检索

的项。4[0]未用。

输出:若¥在力中,输出下标j满足才,否则输出0。

IntBinarySearch(A,n,X)

{intk=l;m=n;

while(k<=m)

{j=(k+m)/3;/*j=(k+m)/3*/

if(X==A[j])

returnj;

if(X<A[jD

m=j-1

else

k=j+1;

return0;

)

时间分析:比较次数

2.作一个“三分”检索算法,它首先检查1/3处的元素是

否与X相等,然后检查2/3处的元素,等等。这样,或者找到X,

或者将集合缩小到原来的1/3O试写出此算法并分析其复杂性。

输入:已安排减序分类的〃个元素的数组/和人才是被检索

的项。的0]未用。

输出:若X在A中,输出下标j满足A[j]=X,否则输出0。

IntThirdSearch(A,n,X)

{intk=1;m=n;

While(k<=m)

{i=(k+m)/3;/*i=(k+m)/3*/

if(X==A[i])

returni;

if(X<A[iJ)

m=i-1

else

{j=2(k+m)/3)/;/*j=2(k+m)/3)

if(X==A[j])

returnj;

if(X<A[j])

{k=i+1;

m=j-1}

else

k=j+1;

)

)

return0;

}

时间分析:比较次数

解得方程:T(n)=l+log3n

3.设计一个在有n个元素的集合中通过比较找出最大和次

最大元素的算法,使其复杂度为n+logn-2。

算法:找最大和次大元素

输入:有n个元素的数组A

输出:最大和次最大元素Max和SubMax。

voidFind(A)〃递归算法

{if(|A|==2)

{设人=匕4}

(Max,SubMax)(Max(a,b),SubMax(a,b));

}

else

{把A分成两个子集Al和A2,各有一半元素;

(MaxifSubMaxi)Find(Al);

(Max2,SubMax2)Find(A2);

SubMax3=Min(Maxi,Max2);

SubMax4=Max(SubMaxi,SubMax2)

(Max^SubMax)(Max(Max1,

Max2),SubMax(SubMax3,SubMax4))

)

]

时间分析:T(n)为算法的最坏时间。当n=2时-,T(n)=l;当

n>2时,则需要进行两次递归调用及之后的比较。故有:

T(n)=5n/2

4.求解最接近中位数的k个数:给定由n个互不相同的数

组成的集合A以及正整数kWn,设计一个0(n)时间复杂度的查

找A中最接近A的中位数的k个数的算法。在采用分治法进行查

找时,为了满足分治法的平衡原则,需要将数组分成两个大小基

本相同的子数组,其中的那个划分点就是中位数。所以,中位数

是指数组中能将数组划分成两个大小基本相同的两个子数组的那

个元素,即中位数是第「n/21小的数。

解析:

(1)找出A中的中位数mid;

(2)计算T={|a-mid,aeA};

(3)找出T的第k小元素b;

(4)根据b找出所要的解{|a-mid|Wb,aeA}。

由于在最坏情况想选择的时间复杂度为0(n)o所以,(1)和

(3)需要0(n)次计算,(2)和(4)也只需要0(n)次计算。

因此,本算法在最坏情况下,时间复杂度为0(n)。

例如,A={50,13,80,30,6,27,35},k=3,求最接

近中位数的k个数。

(1)找出A中的中位数mid:将A排序={6,13,27,30,

35,50,80},mid=30o

(2)计算T={|a-mid|,aeA}:T={20,13,50,0,24,

3,5}o

(3)找出T的第k小元素b:T的第k小元素b=5o

(4)根据b找出所要的解{a,1a-mid|Wb,aeA}:{30,

27,35}o

5.求有序数组A和B的中位数

设A[0:n-1]和B[0:n-1]为两个数组,每个数组中含有

n个已排好序的数。设计一个O(logn)时间复杂度的算法,找出A

和B的2n个数的中位数median。

解析:

(1)算法设计思想。

考虑问题的一般性:设A[il:jl]和BLi2:j2]是A和B

的排序好的子数组,且长度同,即jl-il=i2-j2。找出这两个子

数组中2(jl-il+1)个数的中位数。

首先注意到,若A[il]WB[j2],则中位数median满足A

[il]WmedianWB[j2]°同理,若A[il]2B[j2],则B[j2]

WmedianWA[il]。

设ml=(il+jl)/2,m2=(i2+j2)/2,则

ml十m2=((il+jl)/2+(i2+j2)/2

=il+(jl—il)/2+i2+(j2—i2)/2

=il+i2+(jl-i1)/2+(j2—i2)/2o

由于jl—il=j2—i2,故

(jl-il)/2+(j2-i2)/2=jl-*il=j2-i2o

因此,ml+m2=il+i2+jl一i1=i2+jl=i1+i2+j2一

i2=il+j2o

当A[ml]=B[m2]时,median=A[ml]=B[m2]。

当A[ml]<B[m2]时,设medianl是A[ml:jl]和B[j2:

m2]的中位数,则median=Medianl。

当A[ml]>B[m2]时,设median2是A[il:ml]和B[i2:

J2]的中位数,类似地有median=median2o

通过以上的讨论,可以设计出查找两个子数组A和

B[i2:j2]的中位数median的算法。

(2)算法复杂性。

设在最坏情况下,算法所需的计算时间为T(2n)0由算法中

ml和m2的选取策略可知,在递归调用时、数组A和B的大小都减

少了一半。因此,T(2n)满足递归式:

解此速归方程可得:T(2n)=0(logn)0

比如A={12,34,56,62,78,81,95},B={23,38,45,

67,89,103,120)0求数组A和B中位数。

解析:ml=(il+jl)/2=3,m2=(i2+j2)/2=3。

A[ml]=62,B[m2]=67,则根据

当A[ml]<B[m2]时,设medianl是A[ml:jl]

和B[i2:m2]的中位数,则median=Medianl。

有:

median=A[ml:jl]和B[i2:m2]的中位数

=A[3:6]和B[0:3]的中位数

=(62,78,81,95}和{23,38,45,67}的中位数

=62

再比如A={12,34,56,62,78,81,95},B={23,38,45,

60,89,103,120}o求数组A和B中位数。

解析:ml=(il+jl)/2=3,m2=(i2+j2)12=3。

A[ml]=62,B[m2]=60,则根据

当A[ml]>B[m2]时,设median2是A[i1:ml]

和B[m2:j2]的中位数,类似地有median=median2。

有:

median=A[0:3]和B[3:6]的中位数

=A[3:6]和B[0:3]的中位数

={12,34,56,62}和{60,89,103,120}的中位数

=60

6.利用整数相乘算法3-7计算两个二进制数1011和1101及

两个十进制数3141和5327的乘积。

解答:

(1)x=1011,y=1101

MuKlOll,1101,4)〃整数相乘算法3.1

A=10,B=ll,C=ll,D=01

ml=Mul(A,C,n/2)=Mul(10,11,2)〃递归调用

A=l,B=0,C=l,D=1

ml=Mul(A,C,n/2)=Mul(l,1,2/2)=1〃递归调用并返回

Mul(l,1,2/2)

m2=Mul(A-B,D-C,n/2)=Mul(l,0,2/2)=0

m3=Mul(B,D,n/2)=Mui(0,1,2/2)=0

1*(1*22+(1+0+0)*2'+0)=110//返回Mui(10,11,2)=110

m2=Mul(A-B,D-C,n/2)=Mul(10-11,01-11,2)=

Mul(-1,-10,2)

s=(-1)*(-1)=1

A=0,B=l,C=l,D=0

Jml=Mui(A,C,n/2)=Mul(O,1,2/2)=0

m2=Mul(A-B,D-C,n/2)=Mui(-1,-1,2/2)=l

m3=Mui(B,D,n/2)=Mui(1,0,2/2)=0

1*(0*2?+(0+1+0)*2'+0)=10

m3=Mui(B,D,n/2)=Mui(11,01,2/2)

A=l,B=l,C=0,D=1

ml=Mui(A,C,n/2)=Mui(1,0,2/2)=0

m2=Mul(A-B,D-C,n/2)=Mui(0,1,2/2)=0

m3=Mui(B,D,n/2)=Mul(l,1,2/2)=l

1*(0*2?+(0+0+1)*241)=11

l*(110*24+(110+10+ll)*22+ll)=10001111//返回Mui(1011,

1101,4)=10001111

(2)x=3141,y=5327

Mui(3141,5327,4)〃整数相乘算法4.1

A=31,B=41,C=53,D=27

ml=Mul(A,C,n/2)=Mul(31,53,2)

A=3,B=l,C=5,D=3

Jml=Mui(A,C,n/2)=Mui(3,5,2/2)=15

m2=Mul(A-B,D-C,n/2)=Mui(2,-2,2/2)=-4

m3=Mui(B,D,n/2)=Mui(1,3,2/2)=3

1*(15*10,(15-4+3)*10+3)=1643

m2=Mul(A-B,D-C,n/2)=Mul(31-41,27-53,2)=

Mui(-1,-10,2)

s=(-l)*(-1)=1

A=l,B=0,C=2,D=6

ml=Mui(A,C,n/2)=Mui(1,2,2/2)=2

m2=Mul(A-B,D-C,n/2)=Mui(1,4,2/2)=4

m3=Mui(B,D,n/2)=Mui(0,6,2/2)=0

1*(2*102+(2+4+0)*10'+0)=260

m3=Mul(B,D,n/2)=Mui(41,27,2/2)

A=4,B=l,C=2,D=7

Jml=Mui(A,C,n/2)=Mui(4,2,2/2)=8

m2=Mul(A-B,D-C,n/2)=Mui(3,5,2/2)=15

m3=Mul(B,D,n/2)=Mul(l,7,2/2)=7

l*(8*102+(8+15+7)*10l+7)=1107

1*(1643*10,(1643+260+1107)*102+1107)=16732107〃返

回Mui(3141,5327,4)=16732107

7.修改整数乘积算法3-7,把每个整数分成:(1)三段,(2)

四段,然后给出相应算法的复杂度。

解答:

(1)三段。

假定n是3的哥。我们把n位的二进制整数看成由三个n/3

位整数构成的。则有:

那么,X和Y的乘积可表示为:

2n/3n/3

X*Y=(A2+B2+C)*(D22n/3+E2n/3+F)

=AD2'n/3+(AE+BD)2n+(AF+BE+CD)22n/3+(BF+CE)2n/3+CF

改进如下:

X*Y=AD2"+(VW+AD+BE)2n+(MN+AD+BE+CF)22n/3+(PS+BE+CF)

2n/3+CF

其中,V=A-B,W=E-D,M=A-C,N=F-D,P=B-C,S=F-E

时间分析:记T(n)为算法的最坏时间,则比较总次数为

方程的解是

算法:分三段整数乘积

输入:两个n位的二进制整数X和Y。

输出:整数的乘积。

IntMult(X,Y,n)

{s=sign(X)*sign(Y);

X=abs(X);Y=abs(Y);

If(n==l)

ReturnX*Y;

Else

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论