- 1.42 MB
- 2022-04-29 14:13:11 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'参考答案61参考答案第1章一、选择题1.C2.A3.C4.CADB5.B6.B7.D8.B9.B10.B11.D12.B二、填空题1.输入;输出;确定性;可行性;有穷性2.程序;有穷性3.算法复杂度4.时间复杂度;空间复杂度5.正确性;简明性;高效性;最优性6.精确算法;启发式算法7.复杂性尽可能低的算法;其中复杂性最低者8.最好性态;最坏性态;平均性态9.基本运算10.原地工作三、简答题1.高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。2.使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
参考答案61(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。因此,用抽象数据类型表述的算法具有很好的可维护性。(5)算法自然呈现模块化,抽象数据类型的表示和实现可以封装,便于移植和重用。(6)为自顶向下逐步求精和模块化提供有效途径和工具。(7)算法结构清晰,层次分明,便于算法正确的证明和复杂性的分析。3.算法的复杂度是算法运行所需要的计算机资源的量。4.当问题的规模递增时,将复杂度的极限称为渐进复杂度。5.采用复杂性渐近性态替代算法复杂度,使得在数量级上估计一个算法的执行时间成为可能。四、计算题1.验证下面的关系:O(1).#defneN50intbsearch(int*a,intn,intx)//参数为数组、元素个数和被查找的值{intk=0,m=n-1,mid;//k,m,mid为被查找区间的最小、最大和中间元素下标 while(k<=m)//若最小下标超过最大下标则终止循环,说明不存在 {mid=(k+m)/2;//取中间下标,注意整数相除取整 if(x==a[mid]; retummid;//相等时绔束,返回元求下标 else if(xëxû+ëyû,即有:x+y>ëxû+ëyû所以,原不等式ëxû+ëyû≤x+y成立。(2)当x,y为整数时,原不等式成立。当x,y不为整数时,令x=éxù-∆x,y=éyù-∆y,其中0<∆x,∆y<1。则有:éx+yù=ééxù-∆x+éyù-∆yù=ééxù+éyù-(∆x+∆y)ù因为0≤∆x,∆y<1,所以有0≤∆x+∆y<2。因此,éx+yù≤ééxù+éyùù=éxù+éyù。所以,原不等式éxù+éyù≥éx+yù成立。(3)当n为2k时,élog(n+1)ù=k+1,而ëlognû+1=k+1,所以,原等式成立。当n不为2k时,则2k0。用数学归纳法证明命题:当n=2时,有xmod3=2,成立。当n=3时,有xmod5=3,成立。假设当n=k时,有xmod(2k-1)=k成立,然后证明当n=k+1成立。所以,命题成立。即有:xmod(2(k+1)-1)=k+1。根据命题xmod(2n-1)=n,有在xmod(2n-1)=xmod15中,2n-1=15,则n=8。所以,xmod15=8。②∵xmod3=2,xmod5=3,此时x>0,否则不满足定义∴存在整数k1,k2,使得:x=3k1+2,同时,x=5k2+3,即有:3k1+2=5k2+3,得k1=(5k2+1)/3=5(k2-1)/3+2∵k1,k2为整数∴存在整数k,使得:k=(k2-1)/3,即有:k2=3k+1∴x=5k2+3=5(3k+1)+3=15k+8∴xmod15=8。6.求序列2,5,13,35,…2n+3n的生成函数。解答:根据题义,得H(0)=2,n=0H(n)=2n+3n,n=1,2,3,…设生成函数为,将H(n)=2n+3n代入,得,将上式展开并整理,得G(x)=[2-5x+(2n+2+3n)xn+1+(3*2n+1+2*3n+1)xn+2]/[(1-2x)(1-3x)]7.给定a0=1,a1=1,an+2=an+1+6an,试求出an的非递归形式的表达式。解答:原方程所对应的特征方程为:
参考答案61a2-a-6=0为齐次方程,则齐次解:q1=3,q2=-2,重数均为1。记通解的形式为:an=Aq1n+Bq2n=A3n+B(-2)n将a0=1,a1=1代入上式,得A+B=13A-2B=1解得:A=3/5,B=2/5从而,得an的非递归形式的表达式为:an=(3n+1+(-2)n+1)/5。8.设有a0=0,a1=1,a2=-1和an=-an-1+16an-2-20an-3,当n≥3。求出an的表达式。解答:原递归方程所对应的特征方程为:x3+x2-16X+20=0解得特征方程的根:q1=-5,q2=2,重数分别为1和2。记通解的形式为:an=(A+Bn)q1n+Cq2n=(A+Bn)*2n+C*(-5)n将a0=0,a1=1,a2=-1代入上式,得A+C=02(A+B)-5C=14(A+2B)+(-5)2C=-1解得:A=5/49,B=1/7,C=-5/49从而,得an的非递归形式的表达式为:an=(5/49+n/7)*2n+(-5)n+1/49。9.设a0=1,a1=5,an=an-1+6an-2,当n≥2。求出an的解析表达式。解答:原递推方程的特征方程为x2-x-6=0,则齐次特征方程为齐次特征的解为:q1=3,q2=-2,重数均为1。记通解的形式为:an=Aq1n+Bq2n=A3n+B(-2)n将a0=1,a1=5代入上式,得A+B=13A-2B=5解得:A=7/5,B=-2/5记通解的形式为:an=Aq1n+Bq2n=(7*3n+(-2)n+1)/510.求解方程:T(2)=1,n=1T(n)=n1/2T(n1/2)+n,n>2,且有k,使得解答:由递归方程,递推得T(n)=n1/2T(n1/2)+n=n1/2[(n1/2)1/2T((n1/2)1/2)+n1/2]+n=n1/2n1/4T(n1/4)+n+n=n1/2n1/4[(n1/4)1/2T((n1/4)1/2)+n1/4]+2n=n1/2n1/4n1/8T(n1/8)+3n
参考答案61令,则有T(n)=n(1/2+log(logn))11.求证方程的解是x(n+1)=Cn2n/(n+1)证明:根据递归方程,递推得x(2)=x(1)x(1)=1=C12/2x(3)=x(1)x(2)+x(2)x(1)=1+1=2=C24/3x(4)=x(1)x(3)+x(2)x(2)+x(3)x(1)=5=C36/4x(5)=x(1)x(4)+x(2)x(3)+x(3)x(2)+x(4)x(1)=14=C48/5┇x(n)=Cn-12(n-1)/nx(n+1)=Cn2n/(n+1)12.求证递归方程T(1)=0T(n)=T(ën/2û)+T(én/2ù)+n-1,n>1的解是T(n)=nélognù–2élognù+1。证明:(1)当n=2时,由递归方程和初值,推得T(2)=T(1)+T(1)+2-1=0+0+2-1=1由方程的解,得T(2)=2-2+1=1。所以,结论成立。(2)假设当n≤k时成立,既有T(k)=kélogkù–2élogkù+1是原递归方程的解。那么当n=k+1时,下面证明T(k+1)=(k+1)élog(k+1)ù–2élog(k+1)ù+1是原递归方程的解。当n≤k时,T(ëk/2û)+T(ék/2ù)+k-1=kélogkù–2élogkù+1当n=k+1且k为奇数时,有T(ë(k+1)/2û)+T(é(k+1)/2ù)+k+1-1=T(ëk/2û+1)+T(ék/2ù)+k=2T(ék/2ù)+k=2[ék/2ù·élogék/2ùù–2élogék/2ùù+1]+k=(k+1)·élogék/2ùù–2élogék/2ùù+1+2+k
参考答案61=(k+1)(élog(k+1)/2+1ù)–2élog(k+1)/2+log2ù+1=(k+1)élog(k+1)-1+1ù–2élog(k+1)ù+1=(k+1)élog(k+1)ù–2élog(k+1)ù+1=T(k+1)当n=k+1且k为偶数时,有T(ë(k+1)/2û)+T(é(k+1)/2ù)+k+1-1=T(k/2)+T(k/2+1)+k=(k/2)élog(k/2)ù-2élog(k/2)ù+1+[(k/2+1)élog(k/2+1)ù-2élog(k/2+1)ù+1]+k=(k/2+k/2+1)élog(k/2)ù–(2élog(k/2)ù+2élog(k/2+1)ù)+2+k=(k+1)élog(k/2)ù–2élog(k/2)ù+1+2+k=T(k+1)即当n=k+1时,命题成立。所以,原命题成立。五、上机题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(n-1,x)-2*(n-1)*H(n-2,x)}2.求解汉诺塔问题汉诺塔问题:设A、B、C是三根金针。开始时,在金针A上有n只纸盘,这些纸盘自下而上,由大到小地叠放一起,各纸盘从小到大编号为1,2,…,n,如图A-1所示。现要求将金针A上的这一叠纸盘移到金针B上,并仍按同样顺序叠置。图A-1汉诺塔问题的初始状态在移动纸盘时应遵守以下移动规则:规则(1):每次只能移动一个纸盘;规则(2):任何时刻都不允许将较大的纸盘压在较小的纸盘之上;规则(3):在满足移动规则(1)和(2)的前提下,可将纸盘移至A,B,C中任一根金针上。分析与解答:(1)汉诺塔问题的递归算法如下:publicstaticvoidHanoi(intn,intA,intB,intC){
参考答案61if(n>O){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=O;Booleanb,bb;for(inti=0;i<=n;i++){tower[i][0]=n-i+1;tower[i][1]=n+l;tower[i][2]=n+l;}top[0]=n;b=odd(n);bb=true;;while(top[1]tower[top[y]]|y]){inttmp=x;x=y;y_tmp;}}move(tower[top[x]][x],x+1,y+l);tower[top[y]+1][y]=tower[top[x]][x];top[x]--;top[y]++;}}下面用数学归纳法证明递归算法和非递归算法产生相同的移动序列。当n=1和n=2时容易直接验证。设当k≤n-1时,递归算法和非递归算法产生完全相同的移动序列。考察k=n的情形。将移动分为顺时针移动(C)、逆时针移动(CC)和非最小圆盘塔座间的移动(O)。当n为奇数时,顺时针非递归算法产生的移动序列为:C,O,C,O,…,C;逆时针非递归算法产生的移动序列为:CC,O,CC,O,…,CC。当n为偶数时,顺时针非递归算法产生的移动序列为:CC,O,CC,O,…,CC;逆时针非递归算法产生的移动序列为:C,O,C,O,…,C。①当n为奇数时,顺时针递归算法Hanoi(n,A,B,C)产生的移动序列为:Hanoi(n-1,A,C,B)产生的移动序列,O,Hanoi(n-1,C,B,A)产生的移动序列。Hanoi(n-1,A,C,B)和Hanoi(n-1,C,B,A)均为偶数圆盘逆时针移动问题。由数学归纳法知,产生的移动序列均为:C,O,C,O,…,C。因此,Hanoi(n,A,B,C)产生的移动序列为:C,O,C,O,…,C。②当n为偶数时,顺时针递归算法Hanoi(n,A,B,C)产生的移动序列为:Hanoi(n-1,A,C,B)产生的移动序列,O,Hanoi(n-1,C,B,A)产生的移动序列。Hanoi(n-1,A,C,B)和Hanoi(n-1,C,B,A
参考答案61)均为奇数圆盘逆时针移动问题。由数学归纳法知,产生的移动序列均为:CC,O,CC,O,…,CC。因此,Hanoi(n,A,B,C)产生的移动-序列为:CC,O,CC,O,…,CC。当n为奇数和偶数时的逆时针递归算法也类似。由数学归纳法即知,递归算法和非递归算法产生相同的移动序列。(3)双色汉诺塔问题:设A、B、C是三根金针。开始时,在金针A上有n只纸盘,这些纸盘自下而上,由大到小地叠放一起,各纸盘从小到大编号为1,2,…,n,奇数编号圆盘为白色,偶数编号圆盘为黑色。如图A-2所示。现要求将金针A上的这一叠纸盘移到金针B上,并仍按同样顺序叠置。图A-2双色汉诺塔问题的初始状态在移动纸盘时应遵守以下移动规则:规则(1):每次只能移动一个纸盘;规则(2):任何时刻都不允许将较大的纸盘压在较小的纸盘之上;规则(3):任何时刻都不允许将同色圆盘叠在一起;规则(4):在满足移动规则(1)和(3)的前提下,可将纸盘移至A,B,C中任一根金针上。试设计一个算法,用最少的移动次数将塔座A上的n个圆盘移到塔座B上,并仍按同样顺序叠置。分析与解答:可用教材中的标准Hanoi塔算法。问题是要证明标准Hanoi塔算法不违反规则(3)。用数学归纳法。设Hanoi(n,A,B,C)将塔座A上的n个圆盘,以塔座C为辅助塔座,移到目的塔座B上的标准Hanoi塔算法。归纳假设:当圆盘个数小于n时,Hanoi(n,A,B,C)不违反规则(3),且在移动过程中,目的塔座B上最底圆盘的编号与n具有相同奇偶性,辅助塔座C上最底圆盘的编号与n具有不同奇偶性。当圆盘个数为n时,标准Hanoi塔算法Hanoi(n,A,B,C)由以下3个步骤完成。①Hanoi(n-1,A,C,B);②Move(A,B);③Hanoi(n-1,C,B,A)。按归纳假设,步骤①不违反规则(3),且在移动过程中,塔座C上最底圆盘的编号与n-1具有相同奇偶性,塔座B上最底圆盘的编号与n-1具有不同奇偶性,从而塔座B上最底圆盘的编号与n具有相同奇偶性,塔座C上最底圆盘的编号与n具有不同奇偶性。步骤②也不违反规则(3),且塔座B上最底圆盘的编号与n相同。按归纳假设,步骤③不违反规则(3),且在移动过程中,塔座B上倒数第2个圆盘的编号与n-1具有相同奇偶性,塔座A上最底圆盘的编号与n-1具有不同奇偶性,从而塔座B
参考答案61上倒数第2个圆盘的编号与n具有不同奇偶性,塔座A上最底圆盘的编号与n具有相同奇偶性。因此在移动过程中,塔座B上圆盘不违反规则(3),而且塔座B上最底圆盘的编号与n具有相同奇偶性,塔座C上最底圆盘的编号与n具有不同奇偶性。由数学归纳法即知,Hanoi(n,A,B,C)不违反规则(3)。第3章一、选择题1.B2.B二、填空题1.ëlognû+12.2n-1三、简答题1.将一个难以直接解决的大问题,分割成一些规模较小的类型相同问题,这些子问题相互独立,以便各个击破,分而治之。如果原问题可分割成m个子问题,1<m≤n,并且这些子问题都可解,然后求解这些问题,那么就可利用这些子问题的解求出原问题的解;如果子问题还比较复杂而不能直接求解,还可以继续细分,直到子问题足够小,能够直接求解为止。此外,为了得到原始问题的解,必须找到一种途径能够将各个子问题的解组合成原始问题的一个完整答案。2.将待查的数据与非降序数组中的中间元素进行比较,若二者相等则表示查到;若该数据小于中间元素的值,则下次在数组的前半部分中继续找;否则,在数组的后半部分中查找。即每次检索将与待查数据的比较次数减半。如此继续进行下去,直到查到该值的元素或不存在所查找的数据。此种分治方法,称为二分检索。四、计算题1.作一个“二分”检索算法,它将原集合分成1/3和2/3大小的两个子集。分析此算法并与算法3.1比较。输入:已按非减序分类的n个元素的数组A和X,X是被检索的项。A[0]未用。输出:若X在A中,输出下标j满足A[j]=X,否则输出0。IntBinarySearch(A,n,X){intk=1;m=n;while(k<=m){j=(k+m)/3;/*j=(k+m)/3*/if(X==A[j])returnj;if(X2时,则需要进行两次递归调用及之后的比较。故有:T(n)=5n/24.求解最接近中位数的k个数:给定由n个互不相同的数组成的集合A以及正整数k≤n,设计一个O(n)时间复杂度的查找A中最接近A的中位数的k个数的算法。在采用分治法进行查找时,为了满足分治法的平衡原则,需要将数组分成两个大小基本相同的子数组,其中的那个划分点就是中位数。所以,中位数是指数组中能将数组划分成两个大小基本相同的两个子数组的那个元素,即中位数是第én/2ù小的数。
参考答案61解析:(1)找出A中的中位数mid;(2)计算T={|a-mid|,aÎA};(3)找出T的第k小元素b;(4)根据b找出所要的解{|a-mid|≤b,aÎA}。由于在最坏情况想选择的时间复杂度为O(n)。所以,(1)和(3)需要O(n)次计算,(2)和(4)也只需要O(n)次计算。因此,本算法在最坏情况下,时间复杂度为O(n)。例如,A={50,13,80,30,6,27,35},k=3,求最接近中位数的k个数。(1)找出A中的中位数mid:将A排序={6,13,27,30,35,50,80},mid=30。(2)计算T={|a-mid|,aÎA}:T={20,13,50,0,24,3,5}。(3)找出T的第k小元素b:T的第k小元素b=5。(4)根据b找出所要的解{a,|a-mid|≤b,aÎA}:{30,27,35}。5.求有序数组A和B的中位数设A[0∶n-1]和B[0∶n-1]为两个数组,每个数组中含有n个已排好序的数。设计一个O(1ogn)时间复杂度的算法,找出A和B的2n个数的中位数median。解析:(1)算法设计思想。考虑问题的一般性:设A[il:j1]和B[i2:j2]是A和B的排序好的子数组,且长度同,即j1-i1=i2-j2。找出这两个子数组中2(j1-i1+1)个数的中位数。首先注意到,若A[i1]≤B[j2],则中位数median满足A[i1]≤median≤B[j2]。同理,若A[i1]≥B[j2],则B[j2]≤median≤A[i1]。设m1=(i1+j1)/2,m2=(i2+j2)/2,则m1十m2=((i1+j1)/2+(i2十j2)/2=i1+(j1一i1)/2+i2+(j2—i2)/2=i1+i2+(j1一il)/2+(j2—i2)/2。由于j1—i1=j2—i2,故(j1一i1)/2+(j2一i2)/2=j1一i1=j2一i2。因此,m1+m2=i1+i2+jl一i1=i2+jl=i1+i2+j2—i2=i1+j2。当A[m1]=B[m2]时,median=A[m1]=B[m2]。当A[m1]<B[m2]时,设median1是A[m1:jl]和B[j2:m2]的中位数,则median=Median1。当A[m1]>B[m2]时,设median2是A[i1:m1]和B[i2:j2]的中位数,类似地有median=median2。通过以上的讨论,可以设计出查找两个子数组A[i1:j1]和B[i2:j2]的中位数median的算法。(2)算法复杂性。设在最坏情况下,算法所需的计算时间为T(2n)。由算法中m1和m2的选取策略可知,在递归调用时,数组A和B的大小都减少了一半。因此,T(2n)满足递归式:
参考答案61解此速归方程可得:T(2n)=O(logn)。比如A={12,34,56,62,78,81,95},B={23,38,45,67,89,103,120}。求数组A和B中位数。解析:m1=(i1+j1)/2=3,m2=(i2+j2)/2=3。A[m1]=62,B[m2]=67,则根据当A[m1]<B[m2]时,设median1是A[m1:jl]和B[i2:m2]的中位数,则median=Median1。有:median=A[m1: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}。求数组A和B中位数。解析:m1=(i1+j1)/2=3,m2=(i2+j2)/2=3。A[m1]=62,B[m2]=60,则根据当A[m1]>B[m2]时,设median2是A[i1:m1]和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}的中位数=606.利用整数相乘算法3-7计算两个二进制数1011和1101及两个十进制数3141和5327的乘积。解答:(1)x=1011,y=1101Mul(1011,1101,4)//整数相乘算法3.1A=10,B=11,C=11,D=01m1=Mul(A,C,n/2)=Mul(10,11,2)//递归调用A=1,B=0,C=1,D=1m1=Mul(A,C,n/2)=Mul(1,1,2/2)=1//递归调用并返回Mul(1,1,2/2)m2=Mul(A-B,D-C,n/2)=Mul(1,0,2/2)=0m3=Mul(B,D,n/2)=Mul(0,1,2/2)=01*(1*22+(1+0+0)*21+0)=110//返回Mul(10,11,2)=110m2=Mul(A-B,D-C,n/2)=Mul(10-11,01-11,2)=Mul(-1,-10,2)s=(-1)*(-1)=1A=0,B=1,C=1,D=0m1=Mul(A,C,n/2)=Mul(0,1,2/2)=0m2=Mul(A-B,D-C,n/2)=Mul(-1,-1,2/2)=1m3=Mul(B,D,n/2)=Mul(1,0,2/2)=01*(0*22+(0+1+0)*21+0)=10m3=Mul(B,D,n/2)=Mul(11,01,2/2)A=1,B=1,C=0,D=1m1=Mul(A,C,n/2)=Mul(1,0,2/2)=0m2=Mul(A-B,D-C,n/2)=Mul(0,1,2/2)=0m3=Mul(B,D,n/2)=Mul(1,1,2/2)=1
参考答案611*(0*22+(0+0+1)*21+1)=111*(110*24+(110+10+11)*22+11)=10001111//返回Mul(1011,1101,4)=10001111(2)x=3141,y=5327Mul(3141,5327,4)//整数相乘算法4.1A=31,B=41,C=53,D=27m1=Mul(A,C,n/2)=Mul(31,53,2)A=3,B=1,C=5,D=3m1=Mul(A,C,n/2)=Mul(3,5,2/2)=15m2=Mul(A-B,D-C,n/2)=Mul(2,-2,2/2)=-4m3=Mul(B,D,n/2)=Mul(1,3,2/2)=31*(15*102+(15-4+3)*10+3)=1643m2=Mul(A-B,D-C,n/2)=Mul(31-41,27-53,2)=Mul(-1,-10,2)s=(-1)*(-1)=1A=1,B=0,C=2,D=6m1=Mul(A,C,n/2)=Mul(1,2,2/2)=2m2=Mul(A-B,D-C,n/2)=Mul(1,4,2/2)=4m3=Mul(B,D,n/2)=Mul(0,6,2/2)=01*(2*102+(2+4+0)*101+0)=260m3=Mul(B,D,n/2)=Mul(41,27,2/2)A=4,B=1,C=2,D=7m1=Mul(A,C,n/2)=Mul(4,2,2/2)=8m2=Mul(A-B,D-C,n/2)=Mul(3,5,2/2)=15m3=Mul(B,D,n/2)=Mul(1,7,2/2)=71*(8*102+(8+15+7)*101+7)=11071*(1643*104+(1643+260+1107)*102+1107)=16732107//返回Mul(3141,5327,4)=167321077.修改整数乘积算法3-7,把每个整数分成:(1)三段,(2)四段,然后给出相应算法的复杂度。解答:(1)三段。假定n是3的幂。我们把n位的二进制整数看成由三个n/3位整数构成的。则有:那么,X和Y的乘积可表示为:X*Y=(A22n/3+B2n/3+C)*(D22n/3+E2n/3+F)=AD24n/3+(AE+BD)2n+(AF+BE+CD)22n/3+(BF+CE)2n/3+CF改进如下:X*Y=AD24n/3+(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==1)ReturnX*Y;
参考答案61Else{A=X的左边n/3位;B=X的中间n/3位;C=X的右边n/3位;D=Y的左边n/3位E=Y的中间n/3位;F=Y的右边n/3位;M1=Mult(A,D,n/3);M2=Mult(A-B,E-D,n/3);M3=Mult(A-C,F-D,n/3);M4=Mult(B,E,n/3);M5=Mult(B-C,F-E,n/3);M6=Mult(C,F,n/3);Returns*(m1*24n/3+(m1+m2+m4)*2n+(m1+m3+m4+m6)*22n/3+(m4+m6)2n/3+m6)}}(2)四段。假定n是4的幂。我们把n位的二进制整数看成由四个n/4位整数构成的。则有:那么,X和Y的乘积可表示为:X*Y=(A23n/4+B2n/2+C2n/4+D)*(E23n/4+F2n/2+G2n/4+H)=AE23n/2+(AF+BE)25n/4+(AG+BF+CE)2n+(AH+BG+CF+DE)23n/4+(BH+CG+DF)2n/2+(CH+DG)2n/4+DH改进如下:X*Y=AE23n/2+(VW+AE+BF)25n/4+(MN+AE+CG+BF)2n+(PS+RU+AE+DH+BF+CG)23n/4+(TJ+BF+DH+CG)2n/2+(OQ+CG+DH)2n/4+DH其中,V=A-B,W=F-E,M=A-C,N=G-E,P=A-D,S=H-E,R=B-C,U=G-F,T=B-D,J=H-F,O=C-D,Q=H-G时间分析:记T(n)为算法的最坏时间,则比较总次数为方程的解是算法:分四段整数乘积输入:两个n位的二进制整数X和Y。输出:整数的乘积。IntMult(X,Y,n){s=sign(X)*sign(Y);X=abs(X);Y=abs(Y);If(n==1)ReturnX*Y;Else{A=X的最左边n/4位;B=X的次左边n/4位;C=X的次右边n/4位;D=X的最右边n/4位;E=Y的最左边n/4位F=Y的次左边n/4位;G=Y的次右边n/4位;H=Y的最右边n/4位;
参考答案61M1=Mult(A,E,n/4);M2=Mult(B,F,n/4);M3=Mult(A-C,G-E,n/4);M4=Mult(A-B,F-E,n/4);M5=Mult(A-D,H-E,n/4);M6=Mult(B-C,G-F,n/4);M7=Mult(B-D,H-F,n/4);M8=Mult(C-D,F-E,n/4);M9=Mult(A-D,H-G,n/4);M10=Mult(C,G,n/4);Returns*(m1*23n/2+(m1+m2+m4)*25n/4+(m1+m2+m3+m10)*2n+(m1+m2+m5+m6+m9+m10)23n/4+(m2+m7+m9+m10)2n/2+(m8+m9+m10)2n/4+m9)}}8.用Strassen矩阵乘法计算乘积:解答:Strassen矩阵乘法X1=(a11+a22)*(b11+b22)=(1+4)*(5+8)=65X2=(a21+a22)*b11=(3+4)*5=35X3=a11*(b12-b22)=1*(6-8)=-2X4=a22*(b21-b11)=4*(7-5)=8X5=(a11+a12)*b22=(1+2)*8=24X6=(a21-a11)*(b11+b12)=(3-1)*(5+6)=22X7=(a12-a22)*(b21+b22)=(2-4)*(7+8)=-30c1=X1+X4-X5+X7=65+8-24-30=19c2=X3+X5=-2+24=22c3=X2+X4=35+8=43c4=X1+X3-X2+X6=65-2-35+22=509.设n=2km,用Strassen算法,求两个n×n矩阵的积,并估计复杂性。解答:对于任何非零偶数n,总可以找到基数m和正整数k,使得n=2km。为了求出两个n矩阵的积,可以把一个n矩阵分成m×m个2k×2k的子矩阵。当求解2k×2k子矩阵的积时,使用Strassen算法,其时间复杂度为O(7k)。使用传统方法求两个m阶矩阵的乘积,其时间复杂度为O(m3)。所以,算法总的间复杂度为O(7km3)。10.Strassen算法的另一种形式是用下面的恒等式计算两个2x2矩阵的乘积,如此处理共用了7次乘法和15次加法。S1=a21+a22m1=s2*s6t1=m1+m2S2=s1-a11m2=a11*b11t2=t1+m4S3=a11-a21m3=a12*b21S4=a12-s2m4=s3*s7S5=b12-b11m5=s1*s5S6=b22-s5m6=s4*b22S7=b22-b12m7=a22*s8
参考答案61S8=s5-b21乘积矩阵的元素是:c11=m2+m3c12=t1+m5+m6c21=m2-m7c22=t2+m5试证明上述等式确实计算了cij,1≤I,j≤2。证明:由于C=AxB,则有:那么,就有:c11=a11xb11+a12xb21c12=a11xb12+a12xb22c21=a21xb11+a22xb21c22=a21xb12+a22xb22而根据题中所给的Strassen恒等式计算,得c11=m2+m3=a11xb11+a12xb21c12=t1+m5+m6=m1+m2+m5+m6=s2*s6+a22*b11+s1*s5+s4*b22=(s1-a11)*(b22-s5)+a22*b11+(a21+a22)*(b12-b11)+(a12-s2)*b22=(a21+a22-a11)*(b22-b12+b11)+a22*b11+(a21+a22)*(b12-b11)+(a12-s1-a11)=(a21+a22-a11)*(b22-b12+b11)+a22*b11+(a21+a22)*(b12-b11)+(a12-a21-a22-a11)=a11xb12+a12xb22c21=m2-m7=a11*b11-a22*s8=a11*b11-a22*(s5-b21)=a11*b11-a22*(b12-b11-b21)=a22*b21-a22*b12c22=t2+m5=t1+m4+s1*s5=m1+m2+s3*s7+(a21+a22)*(b12-b11)=s2*s6+a22*b11+(a11-a21)*(b22-b12)+(a21+a22)*(b12-b11)=(s1-a11)*(b22-s5)+a22*b11+(a11-a21)*(b22-b12)+(a21+a22)*(b12-b11)=(a21+a22*a11)*(b22-b12+b11)+a22*b11+(a11-a21)*(b22-b12)+(a21+a22)*(b12-b11)=a21*b12+a22*b2211.对于两个n阶防阵的乘积,若n是3的幂,则用分治法可把问题归结为3×3矩阵的乘积。试设计一种算法使得仅用21次乘法而不是27次此乘积。类似地,对4×4矩阵设计一种48次乘法的算法。答案:[略]。12.设P(x)=p0+p1x+┅+p7x7。在p上执行FFT的步骤,以说明它是如何计算p的傅立叶变换的。解答:=cos(2π/n)+sin(2π/n)=cos(2π/8)+isin(2π/8)=2-1/2(1+i),则有:开始:FFT(8,P(x),,A)
参考答案61N1=4;Pe(x)=p0+p2x+p4x2+p6x3;Po(x)=p1+p3x+p5x2+p7x3;①FFT(4,Pe(x),2,B)N1=2;Pe(x)=p0+p4x;Po(x)=p2+p6x;②FFT(2,Pe(x),4,B)N1=1Pe(x)=p0;Po(x)=p4;③FFT(1,Pe(x),8,B)B[0]=p0;③FFT(1,Po(x),8,C)C[0]=p4W[-1]=1/4j=0;W[0]=4*(1/4)=1;B[0]=B[0]+W[0]*C[0]=p0+p4;B[0+1]=B[0]-W[0]*C[0]=p0-p4;②FFT(2,Po(x),4,C);N1=1Pe(x)=p2;Po(x)=p6;③FFT(1,Pe(x),8,B)B[0]=p2;③FFT(1,Po(x),8,C)C[0]=p6W[-1]=1/4j=0;W[0]=4*(1/4)=1;C[0]=B[0]+W[0]*C[0]=p2+p6;C[0+1]=B[0]-W[0]*C[0]=p2-p6;j=0W[0]=2*(1/2)=1;B[0]=B[0]+W[0]*C[0]=p0+p4+p2+p6;B[0+2]=B[0]-W[0]*C[0]=p0+p4-p2-p6;j=1W[1]=2*1=2;B[1]=B[1]+W[1]*C[1]=p0-p4+2(p2-p6);B[1+2]=B[1]-W[1]*C[1]=p0-p4-2(p2-p6);①FFT(4,Po(x),2,C)N1=2;
参考答案61Pe(x)=p1+p5x;Po(x)=p3+p7x;②FFT(2,Pe(x),4,B)N1=1Pe(x)=p1;Po(x)=p5;③FFT(1,Pe(x),8,B)B[0]=p1;③FFT(1,Po(x),8,C)C[0]=p5W[-1]=1/4j=0;W[0]=4*(1/4)=1;B[0]=B[0]+W[0]*C[0]=p1+p5;B[0+1]=B[0]-W[0]*C[0]=p1-p5;②FFT(2,Po(x),4,C);N1=1Pe(x)=p3;Po(x)=p7;③FFT(1,Pe(x),8,B)B[0]=p3;③FFT(1,Po(x),8,C)C[0]=p7
参考答案61结束。13.试计算下列序列(多项式,仅给出了系数)的傅立叶变换:(1)[0,1,2,3](2)[1,2,0,2,0,0,0,1]分析:n_向量P(p0,p1,p2,…,pn-1)的傅立叶变换Y=Fn·P,Y的第i个分量yi可以写成:yi=p0+p1(i)+p2(i)2+┅+pn-2(i)n-2+pn-1(i)n-1,i=1,2,…,n。其中,是1的n次主根。解答:(1)多项式P(x)=p0+p1x+┅+pn-2xn-2+pn-1xn-1=x+2x2+3x3(2)多项式P(x)=p0+p1x+┅+pn-2xn-2+pn-1xn-1=1+2x+2x3+x7
参考答案61五、上机题#include#include#include#include#includeusingnamespacestd;constintN=100005;constdoubleMAX=10e100;constdoubleeps=0.00001;typedefstructTYPE{doublex,y; intindex;}Point;Pointa[N],b[N],c[N];doubleclosest(Point*,Point*,Point*,int,int);doubledis(Point,Point);intcmp_x(constvoid*,constvoid*);intcmp_y(constvoid*,constvoid*);intmerge(Point*,Point*,int,int,int);inlinedoublemin(double,double);intmain(){ intn,i; doubled; scanf("%d",&n); while(n) { for(i=0;iq[j].y) p[k++]=q[j],j++; else p[k++]=q[i],i++; } while(i<=m) p[k++]=q[i++]; while(j<=t) p[k++]=q[j++]; memcpy(q+s,p+s,(t-s+1)*sizeof(p[0])); return0;}intcmp_x(constvoid*p,constvoid*q){ doubletemp=((Point*)p)->x-((Point*)q)->x; if(temp>0) return1; elseif(fabs(temp)y-((Point*)q)->y; if(temp>0) return1; elseif(fabs(temp)q)?(q):(p);第4章一、选择题1.B2.C
参考答案61二、填空题1.可行解;目标函数;最优解2.最优度量标准三、简答题1.背包问题、磁带的最优存储、有期限的作业调度问题等。2.当一个问题的最优解算法的复杂度很高时,如果利用某种办法产生的算法能很快地得到较好的解(或称为次优解、满意解),可能就相当满意了。从这种愿望出发就形成了所谓启发式的算法设计方法。四、计算题1.求下面背包问题的最优解:n=6,M=20,(p1,p2,…,p6)=(11,8,15,18,12,6),(W1,W2,…,W6)=(5,3,2,10,4,2)解答:根据题义约束条件,下面确定目标函数中的xi。(P[1]/W[1],P[2]/W[2],P[3]/W[3],P[4]/W[4],P[5]/W[5],P[6]/W[6])=(2.2,8/3,7.5,1.8,3,3)按非递增次序排序:P[3]/W[3]>P[5]/W[5]≥P[6]/W[6]>P[2]/W[2]>P[1]/W[1]>P[4]/W[4]根据算法有:W[3]=29-5=4,则x[4]=4/10;所以,(x1,x2,x3,x4,x5,x6)=(1,1,1,0.4,1,1),。2.磁带最优存储问题:设有n=5个程序,要存放在长为L的磁带上。程序i存放在磁带上的读取概率为x=(0.71,0.46,0.9,0.73,0.35),长度p=(872,452,265,120,85),编写程序确定这n个程序的存储次序,使得平均读取时间最小。解答:要使平均读取时间最小,则应按照长度的非递减次序存放。实际上,第k个程序的读取概率为。doublegreedy(intx,int[]p){intn=p.length;int[]y=newint[n];for(inti=0;icode=" ";p->letter=c;p->parent=0;p->sigh=none;p->weight=w;p++;getchar();}for(;i<=m;i++,p++){p->code=" ";p->letter="";p->parent=0;p->sigh=none;p->weight=0;}}//INITTREENODEvoidSelect(HuffmanTreeHT,intend,int*s1,int*s2){//在0~END之间,找出最小和次小的两个结点序号,返回S1,S2inti;intmin1=INT_MAX;intmin2;for(i=0;i<=end;i++){//找最小的结点序号if(HT[i].parent==0&&HT[i].weightHT[i].weight){*s2=i;min2=HT[i].weight;}}}voidHuffmanTreeCreat(HuffmanTree&HT){//建立HUFFMAN树inti;intm=2*n-1;ints1,s2;for(i=n;i