1、算法设计与分析基础课后练习答案习题 1.1 4.设计一个计算 的算法,n 是任意正整数。除了赋值和比较运算,该算法只能用到基本的四则运算操作。算法求 /输入:一个正整数 n 2/输出:。step1:a=1;step2:若 a*a0temp2*ax1(-b+sqrt(D)/tempx2(-b-sqrt(D)/tempreturn x1,x2else if D=0 return b/(2*a)else return “no real roots”else /a=0if b0 return c/belse /a=b=0if c=0 return “no real numbers”else retur
2、n “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法 输入:一个正整数 n输出:正整数 n 相应的二进制数第一步:用 n 除以 2,余数赋给 Ki(i=0,1,2.),商赋给 n第二步:如果 n=0,则到第三步,否则重复第一步第三步:将 Ki 按照 i 从高到低的顺序输出b.伪代码 算法 DectoBin(n)/将十进制整数 n 转换为二进制整数的算法/输入:正整数 n/输出:该正整数相应的二进制数,该数存放于数组 Bin1.n中i=1while n!=0 do Bini=n%2;n=(in
3、t)n/2;i+;while i!=0 doprint Bini;i-;9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略)对这个算法做尽可能多的改进.算法 MinDistance(A0n-1)/输入:数组 A0n-1/输出:the smallest distance d between two of its elements习题 1.3 1. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表 ”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法
4、在位吗 ?解:a. 该算法对列表 ”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*” 排序c.该算法不在位 .额外空间 for S and Count4.(古老的七桥问题)第 2 章习题 2.1 7.对下列断言进行证明:(如果是错误的,请举例)a. 如果 t(n)O(g(n),则 g(n)(t(n)b.0 时,(g(n)= (g(n)解:a. 这个断言是正确的。它指出如果 t(n)的增长率小于或等于 g(n)的增长率,那么 g(n)的增长率大于或等于 t(n)的增长率由 t(n)cg(n) for all nn0, where c0则: for
5、all nn0)()1(ngtcb. 这个断言是正确的。只需证明 。)()(),()( ngng设 f(n)(g(n),则有:for all n=n0, c0)()(ngcffor all n=n0, c1=c01即:f(n)(g(n)又设 f(n)(g(n),则有: for all n=n0,c0)(ncgffor all n=n0,c1=c/0)()(1cnf即:f(n)(g(n)8证明本节定理对于下列符号也成立:a. 符号b. 符号证明:a。we need to proof that if t 1(n)(g 1(n) and t2(n)(g 2(n), then t1(n)+ t2(n)
6、(maxg 1(n), g2(n)。由 t1(n)(g 1(n),t1(n)c 1g1(n) for all n=n1, where c10由 t2(n)(g 2(n),T2(n)c 2g2(n) for all n=n2, where c20那么,取 c=minc1,c2,当 n=maxn1,n2时:t1(n)+ t2(n)c 1g1(n)+ c2g2(n)c g 1(n)+c g2(n)cg 1(n)+ g2(n)cmax g 1(n), g2(n)所以以命题成立。b. t1(n)+t2(n) ( )(,max(n证明:由大的定义知,必须确定常数 c1、c2 和 n0,使得对于所有 n=n
7、0,有:)(2,1max()(21)(2,1ax( ngntngc 由 t1(n)(g1(n)知,存在非负整数 a1,a2 和 n1 使:a1*g1(n)0,g1(n)+g2(n)g1(n),即 g1+g2max(g1,g2)。则(3)式转换为:C1*max(g1,g2) =n0 时上述不等式成立。证毕。习题 2.22. 请用 的非正式定义来判断下列断言是真还是假。a. n(n + 1)/2 O(n 3) b. n(n + 1)/2 O(n 2)c. n(n + 1)/2 (n 3) d. n(n + 1)/2 (n)答:c 假,其它真。5.按照下列函数的增长次数对它们进行排列(按照从低到高的
8、顺序)(n2)!, 5lg(n+100)10, 22n, 0.001n4+3n3+1, ln2 n, , 3n.答:习题 2.31. 计算下列求和表达式的值。答:3. 考虑下面的算法。a 该算法求的是什么?b 它的基本操作是什么?c 该基本操作执行了多少次?d 该算法的效率类型是什么?e 对该算法进行改进,或者设计一个更好的算法,然后指出它们的效率类型。如果做不到这一点,请试着证明这是不可能做到的。9.证明下面的公式:可以使用数学归纳法,也可以像 10 岁的高斯一样,用洞察力来解决该问题。这个小学生长大以后成为有史以来最伟大的数学家之一。数学归纳法:高斯的方法:习题 2.41. 解下列递推关系
9、 (做 a,b)a.解:b.解:0)1(5)xn4)1()3xn当 n1 时当 n1 时2. 对于计算 n!的递归算法 F(n),建立其递归调用次数的递推关系并求解。解:3. 考虑下列递归算法,该算法用来计算前 n 个立方的和:S(n)=13+23+n3。算法 S(n)/输入:正整数 n /输出:前 n 个立方的和if n=1 return 1else return S(n-1)+n*n*na. 建立该算法的基本操作次数的递推关系并求解b. 如果将这个算法和直截了当的非递归算法比,你做何评价?解:7. a. 请基于公式 2n=2n-1+2n-1,设计一个递归算法。当 n 是任意非负整数的时候,
10、该算法能够计算 2n 的值。b. 建立该算法所做的加法运算次数的递推关系并求解c. 为该算法构造一棵递归调用树,然后计算它所做的递归调用次数。d. 对于该问题的求解来说,这是一个好的算法吗?解:a.算法 power(n)/基于公式 2n=2n-1+2n-1,计算 2n/输入:非负整数 n/输出: 2 n的值If n=0 return 1Else return power(n-1)+ power(n-1)c. ninC012)(8.考虑下面的算法算法 Min1(A0n-1)/输入:包含 n 个实数的数组 A0n-1If n=1 return A0Else tempMin1(A0n-2)If te
11、mpAn-1 return tempElse return An-1a.该算法计算的是什么?b.建立该算法所做的基本操作次数的递推关系并求解解:a.计算的给定数组的最小值b. 01)()nC9.考虑用于解决第 8 题问题的另一个算法,该算法递归地将数组分成两半.我们将它称为 Min2(A0n-1)for all n1n=1算法 Min(Arl)If l=r return AlElse temp1Min2(Al(l+r)/2)Temp2Min2(Al(l+r)/2+1r)If temp1temp2 return temp1Else return temp2a.建立该算法所做的的操作次数的递推关系
12、并求解b.算法 Min1 和 Min2 哪个更快?有其他更好的算法吗?解:a.习题 2.53.java 的基本数据类型 int 和 long 的最大值分别是当 n 最小为多少的时候,第 n 个斐波那契数能够使下面的类型溢出。a.int 类型 b.long 类型4.爬梯子 假设每一步可以爬一个或两格梯子,爬一部 n 格梯子一共可以用几种的不同方法?(例如,一部 3 格的梯子可以用三种不同的方法爬:1-1-1,1-2 和 2-1)。6.改进算法 Fib,使它只需要 (1)的额外空间。7.证明等式:答:数学归纳法证明习题 2.6 1. 考虑下面的排序算法,其中插入了一个计数器来对关键比较次数进行计数
13、.算法 SortAnalysis(A0n-1)/input:包含 n 个可排序元素的一个数组 A0n-1/output:所做的关键比较的总次数count0for i1 to n-1 do vAiji-1while j0 and Ajv do countcount+1Aj+1Ajjj+1Aj+1vreturn count比较计数器是否插在了正确的位置?如果不对,请改正.解:应改为:算法 SortAnalysis(A0n-1)/input:包含 n 个可排序元素的一个数组 A0n-1/output:所做的关键比较的总次数count0for i1 to n-1 do vAiji-1while j0
14、and Ajv do countcount+1Aj+1Ajjj+1if j=0 count=count+1Aj+1vreturn count习题 3.14. a.设计一个蛮力算法,对于给定的 x0,计算下面多项式的值:P(x)=anxn+an-1xn-1+a1x+a0并确定该算法的最差效率类型.b.如果你设计的算法属于 (n 2),请你为该算法设计一个线性的算法.C.对于该问题来说,能不能设计一个比线性效率还要好的算法呢?解:a. Algorithms BruteForcePolynomialEvaluation(P0n,x)/由高幂到低幂用蛮力法计算多项式 p 在给定点 x 的值/输入:P0
15、n是多项式按低幂到高幂的常系数,以及定值 x/输出: 多项式 p 在给定点 x 的值p=0.0for i=n to 0 do power=1for j=1 to i do power=power*xp=p+Pi*powerreturn p算法效率分析:基本操作:两个数相乘,且 M(n)仅依赖于多项式的阶 nniniij nM0 201 )()1()(b. tha above algorithms is very inefficient, because we recompute powers of x again and again as if there were no relationsh
16、ip among them.In fact ,we can move from the lowest term to the highest and compute xi by using xi-1.Algorithms BetterBruteForcePolynomialEvaluation(P0n,x)/由高幂到低幂用蛮力法计算多项式 p 在给定点 x 的值/输入:P0n是多项式按低幂到高幂的常系数,以及定值 x/输出: 多项式 p 在给定点 x 的值P=P0power=1for i1 to n do powerpower*xpp+Pi*powerreturn p基本操作乘法运算总次数 M
17、(n):)(2)(1nnMic.不行.因为计算任意一个多项式在任意点 x 的值,都必须处理它的 n+1 个系数.例如: (x=1,p(x)=a n+an-1+a1+a0,至少要做 n 次加法运算) 5.应用选择排序对序列 E,X,A,M,P,L,E 按照字母顺序排序.6.选择排序是稳定的吗?(不稳定)7.用链表实现选择排序的话,能不能获得和数组版相同的 (n2)效率?Yes.Both operationfinding the smallest element and swapping it can be done as efficiently with the linked list as w
18、ith an array. 8.应用冒泡排序对序列 E,X,A,M,P,L,E 按照字母顺序排序.9.a.请证明,如果对列表比较一遍之后没有交换元素的位置,那么这个表已经排好序了,算法可以停止了.b.结合所做的改进,为冒泡排序写一段伪代码.c.请证明改进的算法最差效率也是平方级的.Hints:a. 第 i 趟冒泡可以表示为:如果没有发生交换位置,那么:b.Algorithms BetterBubblesort(A0n-1)/用改进的冒泡算法对数组 A0n-1排序/输入:数组 A0n-1/输出:升序排列的数组 A0n-1countn-1 /进行比较的相邻元素对的数目flagtrue /交换标志w
19、hile flag doflagfalsefor i=0 to count-1 do if Ai+11C(1)=0 设 n=2k,C(2 k)=2C(2k-1)+1=22 C(2k-2)+1+1=22C(2k-2)+2+1=222C(2k-3)+1+2+1=23C(2k-3)+ 22+2+1=.=2iC(2k-i)+ 2i-1+2 i-2 +.+2+1=.=2kC(2k-k)+ 2k-1+2 k-2 +.+2+1=2k1=n-1可以证明 C(n)=n-1 对所有 n1 的情况都成立(n 是偶数或奇数)d.比较的次数相同,但蛮力算法不用递归调用。2、 a.为一个分治算法编写伪代码,该算法同时求出
20、一个 n 元数组的最大元素和最小元素的值。b.请拿该算法与解同样问题的蛮力算法做一个比较。c.请拿该算法与解同样问题的蛮力算法做一个比较。解答:a.同时求出最大值和最小值,只需要将原数组一分为二,再使用相同的方法找出这两个部分中的最大值和最小值,然后经过比较就可以得到整个问题的最大值和最小值。 算法 MaxMin(Alr,Max,Min)/该算法利用分治技术得到数组 A 中的最大值和最小值/输入:数值数组 Alr/输出:最大值 Max 和最小值 Minif(r=l) MaxAl;MinAl ; /只有一个元素时elseif rl=1 /有两个元素时if AlArMaxAr; MinAlelse
21、MaxAl; MinArelse /rl1MaxMin(Al,(l+r)/2,Max1,Min1); /递归解决前一部分MaxMin(A(l+r/)2r,Max2,Min2); /递归解决后一部分if Max1Max2 Max= Max2 /从两部分的两个最大值中选择大值if Min22C(1)=0, C(2)=1C(n)=C(2k)=2C(2k-1)+2=22C(2k-2)+2+2=22C(2k-2)+22+2=222C(2k-3)+2+22+2=23C(2k-3)+23+22+2.=2k-1C(2)+2k-1+2k-2+.+2 /C(2)=1=2k-1+2k-1+2k-2+.+2 /后面部
22、分为等比数列求和=2k-1+2k-2 /2(k-1)=n/2,2k=n=n/2+n-2=3n/22b.蛮力法的算法如下: 算法 simpleMaxMin(Alr)/用蛮力法得到数组 A 的最大值和最小值/输入:数值数组 Alr/输出:最大值 Max 和最小值 MinMax=Min=Al;for i=l+1 to r do if AiMax MaxAi;else if Ai1 (n=2k)Cbest(1)=0c. 键值比较次数 M(n)M(n)=2M(n)+2n for n1M(1)=0习题 4.21.应用快速排序对序列 E,X,A,M,P,L,E 按字母顺序排序4. 请举一个 n 个元素数组的
23、例子, 使得我们有必须对它使用本节提到的 ”限位器”.限位器的值应是多少年来?为什么一个限位器就能满足所有的输入呢 ?Hints:With the pivot being the leftmost element, the left-to-right scan will get out of bounds if and only if the pivot is larger than the other elements.Appending a sentinel(限位器) of value equal A0(or larger than A0) after the arrays last el
24、ement , the quicksort algorithms will stop the index of the left-to-right scan of A0n-1 from going beyond position n.8.设计一个算法对 n 个实数组成的数组进行重新排列,使得其中所有的负元素都位于正元素之前.这个算法需要兼顾空间和时间效率.Algorithms netbeforepos(A0n-1)/使所有负元素位于正元素之前/输入:实数组 A0n-1/输出:所有负元素位于于正元素之前的实数组 A0n-1A-1-1; An1 /限位器i0; jn-1While i1 时, Cw
25、(n)=Cw(n/2)+1, Cw(1)=1(略)4.如果对于一个 100000 个元素的数组成功查找的话,使用折半查找比顺序查找要快多少倍?6 如何将折半查找应用于范围查找?范围查找就是对于一个有序数组, 找出位于给定值 L、U 之间(包含 L、U )的所有元素,Lr return -1else m (l+r)/2if K=Am return melse if K Am return BSR(Am+1,r,K)8.设计一个只使用两路比较的折半查找算法,即只用和=, 或者只用和=.Algorithms TwoWaysBinarySearch(Aon-1,K)/二路比较的折半查找/有序子数组 A
26、lr和查找键值 K/查找成功则输出其下标,否则输出-1l0, rn-1while lr do m (l +r)/2if KAmr melse l m+1if K=Al return lelse return -1习题 4.53. 用课文中介绍的分治算法来计算 2101*1130.习题 4.61.a.为最近对问题的一维版本设计一个直接基于分治技术的算法 ,并确定它的效率类型b.对于这个问题,它是一个好算法吗?解:a. Algorithms ClosestNumber(Alr)/分治计算最近对问题的一维版本/输入:升序排列的实数子数组 Alr/输出:最近数对的距离If r=l return Els
27、e if rl=1 return ArAl Else return minClosestNumber(Al (l+r)/2 ),ClosestNumber(A (l+r)/2 .r)A (l+r)/2 +1A (l+r)/2 设递归的时间效率为 T(n):对 n=2k, 则 : T(n)=2T(n/2)+c利用主定理求解.T(n)=(n)2.(题略)习题 5.14. 应用插入排序对序列 E,X,A,M,P,L,E 按照字母顺序排序.答:插入排序过程如下:习题 5.42. 使用下面的方法生成1,2,3,4的全部排列:a. 从底向上的最小变化算法。b. Johnson-Trotter 算法。c.
28、字典序算法。答:从底向上的最小变化算法过程如下:bJohnson-Trotter 算法实现如下:c .字典序算法实现如下:9. a.当 n=4 时,用减一技术生成它的格雷码。答:用减一技术生成格雷码:n=1 0 1;n=2 000111 10; (从左到右,最左边填 0,从右到左,最左边填 1)n=3 000001011010110111 101100n=4 生成的格雷码:习题 5.53. 应用俄式乘法来计算 46*47.答:习题 5.66.a.为了使大于 6,n 的最小值是多少?答:习题 6.41.a.用自底向上算法为列表 1,8,6,5,3,7,4 构造一个堆.习题 6.5 4.a.应用霍纳法则计算这个多项式:b. 利用霍纳法则的运算结果,求 p(x)除以 x+2 之后的商和余数。6.a.应用从左到右二进制算法计算 a17.7.应用从右到左二进制幂算法计算 a17.习题 7.11. 不使用额外的存储来交换两个变量的数值是否可能,比如说是 u 和 v。