1、 return x1,x2 else if D=0 return b/(2*a) else return “no real roots”else /a=0 if b0 return c/b else /a=b=0 if c=0 return “no real numbers”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答: a.将十进制整数转换为二进制整数的算法 输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2.),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪
2、代码 算法 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.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略)对这个算法做尽可能多的改进.算法 MinDistance(A0.n-1)数组A0.n-1the smallest distance d between two of its elements习题1.3 1.考虑这样一个排序算法,该算法对于待排序
3、的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第i个元素(1=i0时,(g(n)= (g(n)a. 这个断言是正确的。它指出如果t(n)的增长率
4、小于或等于g(n)的增长率,那么 g(n)的增长率大于或等于t(n)的增长率 由 t(n)cg(n) for all nn0, where c 则: for all nn0b. 这个断言是正确的。只需证明。设f(n)(g(n),则有: for all n=n0, c=n0, c1=c即:f(n)(g(n)又设f(n)(g(n),则有:=n0,c=n0,c1=c/f(n)(g(n)8证明本节定理对于下列符号也成立:a.符号b.符号证明:a。we need to proof that if t1(n)(g1(n) and t2(n)(g2(n), then t1(n)+ t2(n)(maxg1(n
5、), g2(n)。由 t1(n)(g1(n), t1(n)c1g1(n) for all n=n1, where c1由 t2(n)(g2(n), T2(n)c2g2(n) for all n=n2, where c2那么,取c=minc1,c2,当n=maxn1,n2时: t1(n)+ t2(n)c1g1(n)+ c2g2(n) c g1(n)+c g2(n)cg1(n)+ g2(n) cmax g1(n), g2(n)所以以命题成立。b. t1(n)+t2(n) (由大的定义知,必须确定常数c1、c2和n0,使得对于所有n=n0,有: 由t1(n)(g1(n)知,存在非负整数a1,a2和n
6、1使: a1*g1(n)=t1(n)=a2*g1(n)-(1)由t2(n)(g2(n)知,存在非负整数b1,b2和n2使: b1*g2(n)=t2(n)=b2*g2(n)-(2) (1)+(2): a1*g1(n)+ b1*g2(n)=t1(n)+t2(n) = a2*g1(n)+ b2*g2(n)令c1=min(a1,b1),c2=max(a2,b2),则 C1*(g1+g2)= t1(n)+t2(n) =c2(g1+g2)-(3)不失一般性假设max(g1(n),g2(n)=g1(n). 显然,g1(n)+g2(n)2g1(n),即g1+g20,g1(n)+g2(n)g1(n),即g1+g
7、2max(g1,g2)。则(3)式转换为: C1*max(g1,g2) =n0时上述不等式成立。证毕。习题2.41.解下列递推关系 (做a,b)当n1时a.解:b.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,设计一个
8、递归算法。当n是任意非负整数的时候,该算法能够计算2n的值。 b. 建立该算法所做的加法运算次数的递推关系并求解 c. 为该算法构造一棵递归调用树,然后计算它所做的递归调用次数。 d. 对于该问题的求解来说,这是一个好的算法吗?a.算法power(n)/基于公式2n=2n-1+2n-1,计算2n非负整数n 2n的值If n=0 return 1Else return power(n-1)+ power(n-1)c.8.考虑下面的算法 算法 Min1(A0.n-1) /输入:包含n个实数的数组A0.n-1 If n=1 return A0 Else tempMin1(A0.n-2) If tem
9、pAn-1 return temp Else return An-1a.该算法计算的是什么?b.建立该算法所做的基本操作次数的递推关系并求解a.计算的给定数组的最小值for all n1n=19.考虑用于解决第8题问题的另一个算法,该算法递归地将数组分成两半.我们将它称为Min2(A0.n-1)算法 Min(Ar.l) If l=r return Al Else temp1Min2(Al.(l+r)/2) Temp2Min2(Al.(l+r)/2+1.r) If temp1temp2 return temp1 Else return temp2a.建立该算法所做的的操作次数的递推关系并求解b.
10、算法Min1和Min2哪个更快?有其他更好的算法吗?习题2.6 1.考虑下面的排序算法,其中插入了一个计数器来对关键比较次数进行计数.算法SortAnalysis(A0.n-1)/input:包含n个可排序元素的一个数组A0.n-1/output:所做的关键比较的总次数count0for i1 to n-1 do vAi ji-1 while j0 and Ajv do countcount+1 Aj+1Aj jj+1 Aj+1vreturn count比较计数器是否插在了正确的位置?如果不对,请改正.应改为: if j=0 count=count+1习题3.14. a.设计一个蛮力算法,对于
11、给定的x0,计算下面多项式的值:P(x)=anxn+an-1xn-1+a1x+a0并确定该算法的最差效率类型.b.如果你设计的算法属于(n2),请你为该算法设计一个线性的算法.C.对于该问题来说,能不能设计一个比线性效率还要好的算法呢?a.Algorithms BruteForcePolynomialEvaluation(P0.n,x)/由高幂到低幂用蛮力法计算多项式p在给定点x的值P0.n是多项式按低幂到高幂的常系数,以及定值x 多项式p在给定点x的值p=0.0for i=n to 0 do power=1 for j=1 to i do power=power*x p=p+Pi*power
12、return p算法效率分析:基本操作:两个数相乘,且M(n)仅依赖于多项式的阶nb.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 BetterBruteForcePolynomia
13、lEvaluation(P0.n,x) P=P0 for i1 to n do powerpower*x pp+Pi*power return p基本操作乘法运算总次数M(n):c.不行.因为计算任意一个多项式在任意点x的值,都必须处理它的n+1 个系数.例如: (x=1,p(x)=an+an-1+.+a1+a0,至少要做n次加法运算) 5.应用选择排序对序列example按照字母顺序排序.6.选择排序是稳定的吗?(不稳定)7.用链表实现选择排序的话,能不能获得和数组版相同的(n2)效率?Yes.Both operationfinding the smallest element and sw
14、apping it can be done as efficiently with the linked list as with an array. 9.a.请证明,如果对列表比较一遍之后没有交换元素的位置,那么这个表已经排好序了,算法可以停止了.b.结合所做的改进,为冒泡排序写一段伪代码.c.请证明改进的算法最差效率也是平方级的.Hints:a.第i趟冒泡可以表示为:如果没有发生交换位置,那么:b.Algorithms BetterBubblesort(A0.n-1)/用改进的冒泡算法对数组A0.n-1排序升序排列的数组A0.n-1countn-1 /进行比较的相邻元素对的数目flagtr
15、ue /交换标志while flag do flagfalse for i=0 to count-1 do if Ai+1Ai swap(Ai,Ai+1) flagtrue countcount-1c最差情况是数组是严格递减的,那么此时改进的冒泡排序会蜕化为原来的冒泡排序.10.冒泡排序是稳定的吗?(稳定)习题3.21.对限位器版的顺序查找算法的比较次数:a.在最差情况下b.在平均情况下.假设成功查找的概率是p(0=p=1)a.Cworst(n)=n+1b.在成功查找下,对于任意的I,第一次匹配发生在第i个位置的可能性是p/n,比较次数是i.在查找不成功时,比较次数是n+1,可能性是1-p.6
16、.给出一个长度为n的文本和长度为m的模式构成的实例,它是蛮力字符串匹配算法的一个最差输入.并指出,对于这样的输入需要做多少次字符比较运算.文本:由n个0组成的文本模式:前m-1个是0,最后一个字符是1比较次数: m(n-m+1)7.为蛮力字符匹配算法写一个伪代码,对于给定的模式,它能够返回给定的文本中所有匹配子串的数量.Algorithms BFStringmatch(T0.n-1,P0.m-1)/蛮力字符匹配数组T0.n-1长度为n的文本,数组P0.m-1长度为m的模式在文本中匹配成功的子串数量for i0 to n-m do j0 while j C(1)=0 设n=2k,C(2k)=2C
17、(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.为一个分治算法编写伪代码,该算法同时求出一个n元数组的最大元素和最小元素的值。b.请拿该算法与解同样问题的蛮力算法做一个比较。c.请拿该算法与解同样问题的蛮力算法做一个比较。 a.同时求出最大值
18、和最小值,只需要将原数组一分为二,再使用相同的方法找出这两个部分中的最大值和最小值,然后经过比较就可以得到整个问题的最大值和最小值。算法 MaxMin(Al.r,Max,Min) /该算法利用分治技术得到数组A中的最大值和最小值数值数组Al.r最大值Max和最小值Minif(r=l) MaxAl;MinAl; /只有一个元素时elseif rl=1 /有两个元素时if AlArMaxAr; MinAl elseMaxAl; MinAr else /rlMaxMin(Al,(l+r)/2,Max1,Min1); /递归解决前一部分MaxMin(A(l+r/)2.r,Max2,Min2); /递归
19、解决后一部分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 /后面部分为等比数列求和=2k-1+2k-2 /2(k-1)=n/2,2k=n=n/2+n-2=3n/22b.蛮力法的算法如下:算法 simpleMaxMin(Al.r)/用蛮力法得到数组A的最大值和最小值Max=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 nM(1)=0习题4.21.应用快速排序对序列E,X,A,M,P,L,E按字母顺序排序4.请举一个n个元素数组的例子,使得我们有必须对它使用本节提到的”限
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1