算法设计与分析课后习题解答_第1页
算法设计与分析课后习题解答_第2页
算法设计与分析课后习题解答_第3页
算法设计与分析课后习题解答_第4页
算法设计与分析课后习题解答_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

算法设计与分析课后习题解答

算法设计与分析基础课后练习答案

习题1.1

4.设计一个计算错误!未找到引用源。的算法,n是任意正整数。除

了赋值和比较运算,该算法只能用到基本的四则运算操作。

算法求错误!未找到引用源。

〃输入:一个正整数n错误!未找到引用源。2

〃输出:。

stepl:a=l;

st叩2:若a*a<n转step3,否则输出a;

step3:a=a+l转step2;

5.a.用欧几里德算法求gcd(31415,14142)0

b.用欧几里德算法求gcd(31415,14142),比检查min{m,n)和

gcd(m,

n)间连续整数的算法快多少倍?请估算一下。

a.gcd(31415,14142)=gcd(14142,3131)=gcd(3131,1618)=gcd(1618,

1513)=gcd(1513,105)=gcd(1513,105)=gcd(105,43)=gcd(43,19)=gcd(19,

5)=gcd(5,4)=gcd(4,1)=gcd(l,0)=1.

b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。

连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者

两次除法,因此这个算法做除法的次数鉴于1•14142和2・14142之间,

所以欧几里德算法比此算法快1•14142/11.1300与2•14142/11.

2600倍之间。

6.证明等式gcd(m,n)=gcd(n,mmodn)对每一对正整数m,n都成立.

Hint:

根据除法的定义不难证明:

•如果d整除u和v,那么d一定能整除u±v;

•如果d整除u,那么d也能够整除u的任何整数倍ku.

对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和

r=mmodn=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。

数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大

公约数。故gcd(m,n)=gcd(n,r)

7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处

理?该算法在处理这种输入的过程中,上述情况最多会发生几次?

Hint:

对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交

换m和n,即

gcd(m,n)=gcd(n,m)

并且这种交换处理只发生一次.

8a对于所有l〈m,nW10的输入,Euclid算法最少要做几次除法?(1次)

b,对于所有lWm,nW10的输入,Euclid算法最多要做几次除法?(5次)

gcd(5,8)

习题1.2

L(农夫过河)

P—农夫W—狼G一山羊C—白菜

2.(过桥问题

)

1,2,5,10—分别代表4个人,f一手电筒

4.对于任意实系数a,b,c,某个算法能求方程axA2+bx+c=0的实根,写出

上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)

算法Quadratic(a,b,c)

〃求方程axA2+bx+c=0的实根的算法

〃输入:实系数a,b,c

〃输出:实根或者无解信息

IfaWO

D—b*b-4*a*c

IfD>O

temp-2*a

xl-(-b+sqrt(D))/temp

x2-(-b-sqrt(D))/temp

returnxl,x2

elseifD=0return-b/(2*a)

elsereturn“norealroots”

else//a=0

ifbWOreturn-c/b

else//a=b=O

ifc=0return“norealnumbers“elsereturn“norealrootsz/

5.描述将十进制整数表达为二进制整数的标准算法

a.用文字描述

b.用伪代码描述

解答:

a.将十进制整数转换为二进制整数的算法

输入:一个正整数n

输出:正整数n相应的二进制数

第一步:用n除以2,余数赋给Ki(i=0,l,2...),商赋给n

第二步:如果n=0,则到第三步,否则重复第一步

第三步:将Ki按照i从高到低的顺序输出

b.伪代码

算法DectoBin(n)

〃将十进制整数n转换为二进制整数的算法

〃输入:正整数n

〃输出:该正整数相应的二进制数,该数存放于数组Bin口...n]中

i=l

whilen!=0do{

Bin[i]=n%2;

n=(int)n/2;

i++;

)

whilei!=0do{

printBin[i];

i--;

)

9.考虑下面这个算法

,它求的是数组中大小相差最小的两个元素的差.(算法略)对这个算法

做尽可能多的改进.

算法MinDistance(A[O..n-l])

〃输入:数组A[O..n-l]

//输出:thesmallestdistancedbetweentwoofitselements

习题1.3

1.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,

计算比它

小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位

置上去.

a.应用该算法对列表”60,35,81,98,14,47”排序

b.该算法稳定吗?

c.该算法在位吗?

解:

a.该算法对列表”60,35,81,98,14,47”排序的过程如下所示

b.该算法不稳定.比如对列表”2,2*"排序

c.该算法不在位.额外空间forSandCount[]

4.(古老的七桥问题

)

第2早

习题2.1

7.对下列断言进行证明:(如果是错误的,请举例)

a.如果t(n)60(g(n),则g(n)e0(t(n))

b.a>;0时,@(ag(n))=®(g(n))

解:

a.这个断言是正确的。它指出如果t(n)的增长率小于或等于g(n)的增

长率,那么g(n)的增长率大于或等于t(n)的增长率

由t(n)Wc,g(n)foralln,nO,wherec>0

则:()t(n)Wg(n)foralln^nOcl

b.这个断言是正确的。只需证明)(ag(n))?®(g(n)),®(g(n))?©(ag(n))o

设f(n)£®(ag(n)),则有:

f(n)Wcag(n)

f(n)^clg(n)foralln>=nO,c>0foralln>=nO,cl=ca>0

即:f(n)G®(g(n))

又设f(n)e0(g(n)),则有:f(n)Wcg(n)foralln>=n0,c>0

f(n)Wc

aag(n)=clag(n)foralln>=nO,cl=c/a>O

即:f(n)e@(ag(n))

8.证明本节定理对于下列符号也成立:

a.Q符号

b.®符号

证明:

a。weneedtoproofthatiftl(n)GQ(gl(n))andt2(n)£Q(g2(n)),then

tl(n)+t2(n)eQ(max{gl(n),g2(n)})o

由tl(n)GQ(gl(n)),

tl(n)^clgl(n)foralln>=nl,wherecl>0

由t2(n)eQ(g2(n)),

T2(n)〉c2g2(n)foralln>=n2,wherec2>0

那么,取c>=min{cl,c2},当n>=max{nl,n2}时:

tl(n)+t2(n)^clgl(n)+c2g2(n)

2cgl(n)+cg2(n)^c[gl(n)+g2(n)]

2cmax{gl(n),g2(n)}

所以以命题成立。

b.tl(n)+t2(n)G®(max(gl(n),g2(n)))

证明:由大?的定义知,必须确定常数cl、c2和nO,使得对于所有

n>=nO,有:clmax((gl(n),g2(n))^tl(n)+t2(n)^max(gl(n),g2(n))

由tl(n)e®(gl(n))知,存在非负整数al,a2和nl使:

al*gl(n)<=tl(n)<=a2*gl(n)----(1)

由t2(n)w0(g2(n))知,存在非负整数bl,b2和n2使:

bl*g2(n)<=t2(n)<=b2*g2(n)----(2)

(1)+(2):

al*gl(n)+bl*g2(n)<=tl(n)+t2(n)<=a2*gl(n)+b2*g2(n)

令cl=min(al,bl),c2=max(a2,b2),贝

Cl*(gl+g2)<=tl(n)+t2(n)<=c2(gl+g2)一一(3)

不失一般性假设

max(gl(n),g2(n))=gl(n).

显然,gl(n)+g2(n)<2gl(n),即gl+g2<2max(gl,g2)

g2(n)>0,gl(n)+g2(n)>gl(n),iPgl+g2>max(gl,g2)o

则(3)式转换为:

Cl*max(gl,g2)<=tl(n)+t2(n)<=c2*2max(gl,g2)

所以当cl=min(al,bl),c2=2c2=2max(cl,c2),nO=max(nl,n2)时,当

n>=nO时上述不等式成立。

证毕。

习题2.2

2.请用错误!未找到引用源。的非正式定义来判断下列断言是真还是

假。

a.n(n+1)/2G0(n3)b.n(n+1)/2e0(n2)

c.n(n+1)/2£®(n3)d,n(n+1)/2£Q(n)

答:c假,其它真。

5.按照下列函数的增长次数对它们进行排列(按照从低到高的顺序)

(n?2)),5lg(n+100)10,22n,0.001n4+3n3+l,In2n,错误!未找到引用源。

3n.

答:

习题2.3

1.计算下列求和表达式的值。

,:

3.考虑下面的算法。

a.该算法求的是什么?

b.它的基本操作是什么?

c.该基本操作执行了多少次?

d.该算法的效率类型是什么?

e.对该算法进行改进,或者设计一个更好的算法,然后指出它们的

效率类型。

如果做不到这一点,请试着证明这是不可能做到的。

9.证明下面的公式:

可以使用数学归纳法,也可以像10岁的高斯一样,用洞察力来解决

该问题。这个小学生长大以后成为有史以来最伟大的数学家之一。

数学归纳法:

高斯的方法:

习题2.4

1.解下列递推关系(做a,b)a.?x(n)=x(n-l)+5当n>l时??x(l)=0

解:

b.

解:?x(n)=3x(n-l)??x(l)=4当n>l时

2.对于计算n!的递归算法F(n),建立其递归调用次数的递推关系并求

解。

解:

3.考虑下列递归算法,该算法用来计算前n个立方的和:

S(n)=13+23+…+n3。

算法S(n)

〃输入:正整数n

〃输出:前n个立方的和

ifn=lreturn1

elsereturnS(n-l)+n*n*n

a.建立该算法的基本操作次数的递推关系并求解

b.如果将这个算法和直截了当的非递归算法比,你做何评价?

7.a.请基于公式2n=2n-l+2n-l,设计一个递归算法。当n是任意非负

整数的时候,该算法能够计算2n的值。

b.建立该算法所做的加法运算次数的递推关系并求解

c.为该算法构造一棵递归调用树,然后计算它所做的递归调用次数。

d.对于该问题的求解来说,这是一个好的算法吗?解:a.算法power(n)

〃基于公式2n=2n-l+2n-l,计算2n

〃输入:非负整数n

n〃输出:2的值

Ifn=0return1

Elsereturnpower(n-l)+power(n-l)

c.

n

C(n)=£2

i=0i=2n+l-l

8.考虑下面的算法

算法Minl(A[0..n-l])

〃输入:包含n个实数的数组A[0..n-l]

Ifn=lreturnA[0]

日setemp*-Minl(A[0..n-2])

Iftemp^A[n-l]returntemp

日sereturnA[n-1]

a.该算法计算的是什么?

b.建立该算法所做的基本操作次数的递推关系并求解

解:

a.计算的给定数组的最小值

?C(n-l)+lb.C(n)=?O?foralln>ln=l

9.考虑用于解决第8题问题的另一个算法,该算法递归地将数组分成两

半.我们将它称为Min2(A[0..n-l])

4.

爬梯子假设每一步可以爬一个或两格梯子,爬一部n格梯子一共可

以用几种的不同方法?(例如,一部3格的梯子可以用三种不同的方法爬:

1-1-1,1-2和2-1)。

6.改进算法Fib,使它只需要?(1)的额外空间。

7.证明等式:

答:数学归纳法证明

习题2.6

1.考虑下面的排序算法,其中插入了一个计数器来对关键比较次数进

行计数.

算法SortAnalysis(A[0..n-l])

〃input:包含n个可排序元素的一个数组A[O..n-l]

“output:所做的关键比较的总次数

count-0

fori<-1ton-1do

v-A[i]

whilej>OandA[j]>vdo

count,—count+1

A[j+1]-AQ]

j-j+l

A[j+1]-v

returncount

比较计数器是否插在了正确的位置?如果不对,请改正.

解:应改为:

算法SortAnalysis(A[0..n-l])

〃input:包含n个可排序元素的一个数组A[O..n-l]

“output:所做的关键比较的总次数

count-0

fori*-lton-1do

returnp

基本操作乘法运算总次数M(n):

M(n)=£2=2n£0(n)

i=ln

c.不行.因为计算任意一个多项式在任意点x的值,都必须处理它的n+1

个系数.例如:(x=l,p(x)=an+an-l+..+al+aO,至少要做n次加法运算)

5.应用选择排序对序列E,X,A,M,P,L,E按照字母顺序排序.

6.选择排序是稳定的吗?(不稳定)

7.用链表实现选择排序的话,能不能获得和数组版相同的®(n2)效率?

Yes.Bothoperation—findingthesmallestelementandswappingit-can

bedoneasefficientlywiththelinkedlistaswithanarray.

8.应用冒泡排序对序列E,X,A,M,P,L,E按照字母顺序排序.

9a请证明,如果对列表比较一遍之后没有交换元素的位置,那么这个

表已经排

好序了,算法可以停止了.

b.结合所做的改进,为冒泡排序写一段伪代码.

C.请证明改进的算法最差效率也是平方级的.

Hints:

a.第i趟冒泡可以表示为:

如果没有发生交换位置,那么:

b.AlgorithmsBetterBubblesort(A[0,.n-l])

〃用改进的冒泡算法对数组A[0..n-l]排序

〃输入:数组A[0..n-l]

〃输出:升序排列的数组A[0..n-l]

count-n-1〃进行比较的相邻元素对的数目

flag-true〃交换标志

whileflagdo

flag*-false

fori=0tocount-1do

ifA[i+l]<A[i]

swap(A[i],A[i+l])

flag-true

count,―count-1

c最差情况是数组是严格递减的,那么此时改进的冒泡排序会蜕化为原

来的冒泡排序.

10.冒泡排序是稳定的吗?(稳定)

习题3.2

1.对限位器版的顺序查找算法的比较次数:

a.在最差情况下

b.在平均情况下.假设成功查找的概率是p(O<=p<=l)

Hints:

a.Cworst(n)=n+1

b.在成功查找下,对于任意的I,第一次匹配发生在第i个位置的可能性

是ph

比较次数是i.在查找不成功时,比较次数是n+1,可能性是1-p.

6.给出一个长度为n的文本和长度为m的模式构成的实例,它是蛮力字

符串匹配算法的一个最差输入.并指出,对于这样的输入需要做多少次字符

比较运算.

Hints:

文本:由n个0组成的文本

模式:前m-1个是0,最后一个字符是1

比较次数:m(n-m+l)

7.为蛮力字符匹配算法写一个伪代码,对于给定的模式,它能够返回给

定的文本中所有匹配子串的数量.

AlgorithmsBFStringmatch(T[0..n-l],P[0..m-l])

〃蛮力字符匹配

〃输入:数组长度为n的文本,数组长度为m的模

式〃输出:在文本中匹配成功的子串数量

count-0

fori'—0ton-mdo

j-o

whileandP[j]=T[i+j]

j-j+l

ifj=m

count,—count+1

returncount

8.如果所要搜索的模式包含一些英语中较少见的字符,我们应该如何

修改该蛮力算法来利用这个信息.

Hint:每次都从这些少见字符开始比较,如果匹配,则向左边和右边进

行其它字符的比较.

习题3.4

8.解释一下如何对排序问题应用穷举查找,并确定这种算法的效率类

型。

答:生成给定元素的一个排列,通过连续比较它们之间的元素,检查

他们是否符合排序的要求。如果符合就停止,否则重新生成新的排列。

最差情况生成排列的个数是n!,每趟连续元素比较次数为n-l次。所

以效率类型为0(n!(n-l))o

9.幻方一个n阶幻方是把从1到n2的整数填入一个n阶方阵,每个

整数只出现一次,使得每一行,每一列,每一条主对角线的和都相等。

a.证明:如果一个n阶幻方存在的话,所讨论的和一定等于n(n2+l)/2o

答:令s为n阶幻方的每一行的和。则把从1到n2的整数求和可得

如下式子

由上式可得:

算法

MaxMin(A[l..r]zMax,Min)

〃该算法利用分治技术得到数组A中的最大值和最小值

〃输入:数值数组

〃输出:最大值Max和最小值Min

if(r=l)Max—A[l];Min-A[l];〃只有一个元素时

else

ifr-|=l〃有两个元素时

ifA[l]^A[r]

Max-A[r];Min-A[l]

else

Max—A[l];Min*-A[r]

else//r—l>l

MaxMin(A[l,(l+ij/2],Maxl,Minl);〃递归解决前一部分

MaxMin(A[(l+r/)2..r],Max2,Min2);〃递归解决后一部分

ifMaxl<Max2Max=Max2〃从两部分的两个最大值中选择大值

ifMin2<MinlMin=Min2;〃从两部分的两个最小值中选择小值}

b.假设n=2k,比较次数的递推关系式:

C(n)=2C(n/2)+2forn>2

C(l)=0,C(2)=l

C(n)=C(2k)=2C(2k-l)+2

=2[2C(2k-2)+2]+2

=22C(2k-2)+22+2

=22[2C(2k-3)+2]+22+2

=23C(2k-3)+23+22+2

=2k-lC(2)+2k-l+2k-2+...+2//C(2)=l

=2k-l+2k-l+2k-2+...+2〃后面部分为等比数列求和

=2k-l+2k-2//2(k-l)=n/2,2k=n

=n/2+n-2

=3n/2-2

b.蛮力法的算法如下:

算法simpleMaxMin(A[l..r])

〃用蛮力法得到数组A的最大值和最小值

〃输入:数值数组

〃输出:最大值Max和最小值Min

Max=Min=A[l];

fori=l+ltordo

ifA[i]>MaxMax-A[i];

elseifA[i]<MinMin—A[i]

returnMax,Min

)

b.

最好情况(列表升序或降序)下:

Cbest(n)=2Cbest(n/2)+n/2forn>l(n=2k)

Cbest(l)=0

c.键值比较次数M(n)

M(n)=2M(n)+2nforn>l

M(l)=0

习题4.2

1.应用快速排序对序列E,X,A,M,P,L,E按字母顺序排序

4.请举一个n个元素数组的例子,使得我们有必须对它使用本节提到

的“限位器”.

限位器的值应是多少年来?为什么一个限位器就能满足所有的输入呢?

Hints:

Withthepivotbeingtheleftmostelement,theleft-to-rightscanwillget

outofboundsifandonlyifthepivotislargerthantheotherelements.

Appendingasentinel(限位器)ofvalueequalA[0](orlargerthanA[0])

afterthearrayJslastelement,thequicksortalgorithmswillstopthe

indexoftheleft-to-rightscanofA[0..n-l]fromgoingbeyondpositionn.

8.设计一个算法对n个实数组成的数组进行重新排列,使得其中所有的

负元素都位于正元素之前.这个算法需要兼顾空间和时间效率.

Algorithmsnetbeforepos(A[0..n-l])

〃使所有负元素位于正元素之前

〃输入:实数组A[O..n-l]

〃输出:所有负元素位于于正元素之前的实数组A[O..n-l]

A[-l]--l;A[n]-1〃限位器

i-O;j*-n-l

Whiledo

WhileA[i]WOdo

i-i+1

whileA[j]2Odo

j-j-1

swapA[i]andA[j]

swapA[i]andA[j]//undothelastswap

当全是非负数或全是非正数时需要限位器.

习题4.3

2.当n=2k时,用反向替换法求下面的递推方程:

当n>l时,Cw(n)=Cw(n/2)+l,Cw(l)=l

(略)

习题5.1

4.应用插入排序对序列E,X,A,M,P,L,E按照字母顺序排序.

答:插入排序过程如下:

习题5.4

2.使用下面的方法生成{1,2,3,4}的全部排列:

a.从底向上的最小变化算法。

b.Johnson-Trotter算法。

字典序算法。

答:从底向上的最小变化算法过程如下:

b.Johnson-Trotter算法实现如下:

c.字典序算法实现如下:

9.a.当n=4时,用减一技术生成它的格雷码。

答:用减一技术生成格雷码:

n=l0-*1;

n=200—01fli-*10;(从左到右,最左边填0,从右到左,最左边填

1)n=3000^001—011-*010-110—111—101-*100n=4生成的

格雷码:

习题5.

温馨提示

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

评论

0/150

提交评论