1、1习题 1.1 5证明等式 gcd(m,n)=gcd(n,m mod n)对每一对正整数 m,n 都成立.Hint:根据除法的定义不难证明: 如果 d 整除 u 和 v, 那么 d 一定能整除 uv; 如果 d 整除 u,那么 d 也能够整除 u 的任何整数倍 ku.对于任意一对正整数 m,n,若 d能整除 m和 n,那么 d一定能整除 n和 r=m mod n=m-qn;显然,若 d能整除 n和 r,也一定能整除 m=r+qn和 n。数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。故 gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧
2、几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如 00temp2*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 return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将
3、十进制整数转换为二进制整数的算法 输入:一个正整数 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=(int)n/2;i+;while i!=0 doprint Bini;i-;9.考虑下面这个算法,它求的是数组中大小相差最小的两
4、个元素的差.(算法略)对这个算法做尽可能多的改进.算法 MinDistance(A0n-1)/输入:数组 A0n-13/输出:the smallest distance d between two of its elements习题 1.3 1. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表 ”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗 ?解:a. 该算法对列表 ”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”
5、2,2*” 排序c.该算法不在位 .额外空间 for S and Count44.(古老的七桥问题)习题 1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第 i 个元素(10 时,(g(n)= (g(n)解:a. 这个断言是正确的。它指出如果 t(n)的增长率小于或等于 g(n)的增长率,那么 g(n)的增长率大于或等于 t(n)的增长率由 t(n)cg(n) for all nn0, where c0则: for all nn0)()1(ngtcb. 这个断言是正确的。只需证明 。)()(),()( ngng设 f(n)(g(n),则有:fo
6、r all n=n0, c0)()(cnffor all n=n0, c1=c01g即:f(n)(g(n)5又设 f(n)(g(n),则有: for all n=n0,c0)(ncgffor all n=n0,c1=c/0)()()(1nf即:f(n)(g(n)8证明本节定理对于下列符号也成立:a. 符号b. 符号证明:a。we need to proof that if t1(n)(g 1(n) and t2(n)(g 2(n), then t1(n)+ t2(n)(maxg 1(n), g2(n)。由 t1(n)(g 1(n),t1(n)c 1g1(n) for all n=n1, whe
7、re 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=n0,有:)(2,1max()(21)(2,1a( ngtgc 由 t1(n)(g1(n)知,存在非负整数 a1,a2和 n1使:
8、a1*g1(n)0,g1(n)+g2(n)g1(n),即 g1+g2max(g1,g2)。则(3)式转换为:C1*max(g1,g2) =n0时上述不等式成立。证毕。习题 2.41. 解下列递推关系 (做 a,b)a.解:b.解:2. 对于计算 n!的递归算法 F(n),建立其递归调用次数的递推关系并求解。解:0)1(5)xn4)1()3xn当 n1 时当 n1 时73. 考虑下列递归算法,该算法用来计算前 n 个立方的和:S(n)=13+23+n3。算法 S(n)/输入:正整数 n /输出:前 n 个立方的和if n=1 return 1else return S(n-1)+n*n*na.
9、建立该算法的基本操作次数的递推关系并求解b. 如果将这个算法和直截了当的非递归算法比,你做何评价?解:a.7. a. 请基于公式 2n=2n-1+2n-1,设计一个递归算法。当 n 是任意非负整数的时候,该算法能够计算 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(
10、n-1)8c. ninC012)(8.考虑下面的算法算法 Min1(A0n-1)/输入:包含 n个实数的数组 A0n-1If n=1 return A0Else tempMin1(A0n-2)If tempAn-1 return tempElse return An-1a.该算法计算的是什么?b.建立该算法所做的基本操作次数的递推关系并求解解:a.计算的给定数组的最小值b. 01)()nC9.考虑用于解决第 8题问题的另一个算法,该算法递归地将数组分成两半.我们将它称为 Min2(A0n-1)算法 Min(Arl)If l=r return AlElse temp1Min2(Al(l+r)/2
11、)for all n1n=19Temp2Min2(Al(l+r)/2+1r)If temp1temp2 return temp1Else return temp2a.建立该算法所做的的操作次数的递推关系并求解b.算法 Min1和 Min2哪个更快?有其他更好的算法吗?解:a.习题 2.6 1. 考虑下面的排序算法,其中插入了一个计数器来对关键比较次数进行计数.算法 SortAnalysis(A0n-1)/input:包含 n个可排序元素的一个数组 A0n-1/output:所做的关键比较的总次数count0for i1 to n-1 do vAiji-1while j0 and Ajv do
12、countcount+1Aj+1Ajjj+1Aj+1vreturn count比较计数器是否插在了正确的位置?如果不对,请改正.解:应改为:算法 SortAnalysis(A0n-1)/input:包含 n个可排序元素的一个数组 A0n-1/output:所做的关键比较的总次数count0for i1 to n-1 do vAiji-1while j0 and Ajv do 10countcount+1Aj+1Ajjj+1if j=0 count=count+1Aj+1vreturn count11习题 3.14. a.设计一个蛮力算法,对于给定的 x0,计算下面多项式的值:P(x)=anxn
13、+an-1xn-1+a1x+a0并确定该算法的最差效率类型.b.如果你设计的算法属于 (n 2),请你为该算法设计一个线性的算法.C.对于该问题来说,能不能设计一个比线性效率还要好的算法呢?解:a. Algorithms BruteForcePolynomialEvaluation(P0n,x)/由高幂到低幂用蛮力法计算多项式 p在给定点 x的值/输入:P0n是多项式按低幂到高幂的常系数,以及定值 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算法效
14、率分析:基本操作:两个数相乘,且 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 relationship among them.In fact ,we can move from the lowest term to the highest and compute xi by using xi-1.Algorithms BetterBrute
15、ForcePolynomialEvaluation(P0n,x)/由高幂到低幂用蛮力法计算多项式 p在给定点 x的值/输入:P0n是多项式按低幂到高幂的常系数,以及定值 x/输出: 多项式 p在给定点 x的值P=P0power=1for i1 to n do powerpower*xpp+Pi*powerreturn p基本操作乘法运算总次数 M(n):)(2)(1nnMic.不行.因为计算任意一个多项式在任意点 x的值,都必须处理它的 n+1 个系数.例如: (x=1,p(x)=an+an-1+a1+a0,至少要做 n次加法运算) 5.应用选择排序对序列 example按照字母顺序排序.12
16、6.选择排序是稳定的吗?(不稳定)7.用链表实现选择排序的话,能不能获得和数组版相同的 (n2)效率?Yes.Both operationfinding the smallest element and swapping it can be done as efficiently with the linked list as with an array. 9.a.请证明,如果对列表比较一遍之后没有交换元素的位置,那么这个表已经排好序了,算法可以停止了.b.结合所做的改进,为冒泡排序写一段伪代码.c.请证明改进的算法最差效率也是平方级的.Hints:a. 第 i趟冒泡可以表示为:如果没有发生交
17、换位置,那么:b.Algorithms BetterBubblesort(A0n-1)/用改进的冒泡算法对数组 A0n-1排序/输入:数组 A0n-1/输出:升序排列的数组 A0n-1countn-1 /进行比较的相邻元素对的数目flagtrue /交换标志while 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
18、 +.+2+1=.=2kC(2k-k)+ 2k-1+2 k-2 +.+2+1=2k1=n-1可以证明 C(n)=n-1 对所有 n1 的情况都成立(n 是偶数或奇数)d.比较的次数相同,但蛮力算法不用递归调用。2、 a.为一个分治算法编写伪代码,该算法同时求出一个 n 元数组的最大元素和最小元素的值。b.请拿该算法与解同样问题的蛮力算法做一个比较。c.请拿该算法与解同样问题的蛮力算法做一个比较。解答:a.同时求出最大值和最小值,只需要将原数组一分为二,再使用相同的方法找出这两个部分中的最大值和最小值,然后经过比较就可以得到整个问题的最大值和最小值。 算法 MaxMin(Alr,Max,Min)
19、/该算法利用分治技术得到数组 A 中的最大值和最小值/输入:数值数组 Alr15/输出:最大值 Max 和最小值 Minif(r=l) MaxAl;MinAl ; /只有一个元素时elseif rl=1 /有两个元素时if AlArMaxAr; MinAlelseMaxAl; 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)
20、=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 /后面部分为等比数列求和=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 AiM
21、ax MaxAi;else if Ai1 (n=2k)Cbest(1)=012317c. 键值比较次数 M(n)M(n)=2M(n)+2n for n1M(1)=0习题 4.21.应用快速排序对序列 E,X,A,M,P,L,E 按字母顺序排序184. 请举一个 n 个元素数组的例子, 使得我们有必须对它使用本节提到的 ”限位器”.限位器的值应是多少年来? 为什么一个限位器就能满足所有的输入呢?Hints:With the pivot being the leftmost element, the left-to-right scan will get out of bounds if and
22、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 element , the quicksort algorithms will stop the index of the left-to-right scan of A0n-1 from going beyond position n.8.设计一个算法对 n 个实数组成的数组进行重新排列,使得其中所有的负元素都位于正元素之
23、前.这个算法需要兼顾空间和时间效率.Algorithms netbeforepos(A0n-1)/使所有负元素位于正元素之前/输入:实数组 A0n-1/输出:所有负元素位于于正元素之前的实数组 A0n-1A-1-1; An1 /限位器i0; jn-1While i1 时, Cw(n)=Cw(n/2)+1, Cw(1)=1(略)4.如果对于一个 100000 个元素的数组成功查找的话,使用折半查找比顺序查找要快多少倍?6 如何将折半查找应用于范围查找?范围查找就是对于一个有序数组, 找出位于给定值L、 U 之间(包含 L、U)的所有元素,Lr return -1else m (l+r)/2if
24、K=Am return melse if K Am return BSR(Am+1,r,K)8.设计一个只使用两路比较的折半查找算法,即只用和=, 或者只用和=.Algorithms TwoWaysBinarySearch(Aon-1,K)/二路比较的折半查找/有序子数组 Alr和查找键值 K/查找成功则输出其下标,否则输出-1l0, rn-1while l1 C(1)=04.应用插入排序对序列 example 按照字母顺序排序5.a.对于插入排序来说,为了避免在内部循环的每次迭代时判断边界条件 j=0,应该在待排序数组的第一个元素前放一个什么样的限位器?b.带限位器版本和原版本的效率类型相同
25、吗 ?解: a. 应该在待排序数组的第一个元素前放-或者小于等于最小元素值的元素 .b. 效率类型相同.对于最差情况(数组是严格递减):7.算法 InsertSort2(A0n-1)for i1 to n-1 doji-1while j=0 and AjAj+1 do swap(Aj,Aj+1)jj+1 分析:在教材中算法 InsertSort的内层循环包括一次键值赋值和一次序号递减,而算法 InsertSort2的内层循环包括一次键值交换和一次序号递24减,设一次赋值和一次序号递减的时间分别为 ca和 cd,那么算法InsertSort2和算法 InsertSort运行时间的比率是 (3ca
26、+cd)/(ca+cd)习题 5.21.a.(略)b.4.习题 5.31.DFS的栈状态:退栈顺序: efgbcad 拓扑排序: dacbgfe b.25这是一个有环有向图.DFS 从 a出发,遇到一条从 e到 a的回边.4.能否利用顶点进入 DFS栈的顺序(代替它们从栈中退出的顺序)来解决拓扑排序问题?Hints:不能.5. 对第 1题中的有向图应用源删除算法.拓扑序列: dabcgef26习题 5.44.下面是生成排列的 B.Heap算法.算法 HeapPermute(n)/实现生成排列的 Heap 算法/输入:一个正整数 n 和一个全局数组 A1n/输出:A 中元素的全排列If n=1W
27、rite AElseFor i1 to n do HeapPermute(n-1)If n is oddSwap A1 and AnElse swap Ai and An对于 n=2,3,4的情况,手工跟踪该算法.解:对于 n=2for i=1 do heappermute(1)write A 即 12这时 n not odd, so do A1与 A2互换,A=21for i=2 do heappermute(1)write A 即 21对于 n=3For i=1 doHeappermute(2) heappermute(1) write A 即 123 这时 2 not odd,so,do
28、 A1与A2互换,A=213 heappermute(1) write A 即 213 这时 2 not odd, do A2与 A2互换,A=213 由于 3 is odd,so do A1与 A3互换,A=312For i=2 do Heappermute(2) heappermute(1) write A 即 312 这时 2 not odd,so,do A1与A2互换,A=132 heappermute(1) write A 即 132 这时 2 not odd, do A2与 A2互换,A=231 由于 3 is odd,so do A1与 A3互换,A=231For i=3 do
29、Heappermute(2) heappermute(1) write A 即 231 这时 2 not odd,so,do A1与A2互换,A=321heappermute(1) write A 即 321 这时 2 not odd, do A2与 A2互换,A=321 由于 3 is odd,so do A1与 A3互换,A=123n=4的的情况:27习题 5.52.Hints:a. 减常因子b.c.d.折半查找在最坏情况下的查找效率是 log2n+1.而28习题 6.11. hintsort the list and then simply return the n/2th elemen
30、ts of the sorted list.效率:假设排序算法的效率是 O(nlogn),那么该算法的效率是 O(nlogn)+(1)= O(nlogn)3.hinta.初始化 C=AB=for every element ai in A do (1=i=n)for every element bj in B (1=j=m)If ai=bjadd ai to Cdelete bj from B最差情况:C 为空,比较的次数是 nm.b.方法一:排序集合 AFor every element bj in B用二分查找的办法在 A 中查找与 bj相匹配的元素 aIf 查找成功Add a to C效
31、率分析:假设排序的效率是 O(nlogn),则该算法效率O(nlogn)+mO(logn)=(n+m)O(logn)方法二:首先对 A和 B都分别排序.然后对 A和 B应用合并排序,只输出它们的公有元素.效率分析: 假设排序的效率是 O(nlogn),则该算法效率O(nlogn)+O(mlogm)+(n+m)=O(slogs) where s=maxn,m方法三:首先将 A 和 B 合并为 L排序 L从左至右成对扫描 LIf Li=Li+1Add Li to Cii+2效率分析: 假设排序的效率是 O(nlogn),则该算法效率O(n+m)logn)+ (n+m) =O(slogs) where s=maxn,m4.hinta. 排序数组,然后返回它的第一和最后元素.假设排序的效率是 O(nlogn),则该算法效率 O(nlogn)+(1)+(1)= O(nlogn)b.蛮力和分治都是线性的,所以优于基于预排序的算法习题 6.32.b.294.a.305.a.二叉查找树中最大值和最小值分别是树中最右边和最左边的结点.因此,从根开始,沿着向左的路径一直走到这样的结点:它的左孩子为空.这个结点里的值就是最小值.同理,可以找到最大值.最后,这两个值做一次减法运算即可.算法的效率: (logn)+ (logn)+ (1)= (logn)b.错误.