算法设计与分析_第二版_吕国英_第四章课后习题答案
算法设计与分析第二版课后习题解答

算法设计与分析第二版课后习题解答算法设计与分析基础课后练习答案习题 4.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求//输入:一个正整数n2//输出:。
step1:a=1;step2:若a*a 5. a.用欧几里德算法求gcd。
b. 用欧几里德算法求gcd,比检查min{m,n}和gcd间连续整数的算法快多少倍?请估算一下。
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(1, 0) = 1.b.有a可知计算gcd欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142 和 2·14142之间,所以欧几里德算法比此算法快1·14142/11 ≈ 1300 与 2·14142/11 ≈ 2600 倍之间。
6.证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立. Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果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)7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次? Hint:对于任何形如0 gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次) b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次) gcd(5,8) 习题 1.(农夫过河)P—农夫 W—狼G—山羊C—白菜 2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数) 算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法 //输入:实系数a,b,c//输出:实根或者无解信息 If a≠0D←b*b-4*a*c If D>0temp←2*ax1←(-b+sqrt(D))/temp x2←(-b-sqrt(D))/temp return x1,x2else if D=0 return –b/(2*a) else return “no real roots” else //a=0if b≠0 return –c/b else //a=b=0if c=0 return “no real numbers”else return “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//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中 i=1while n!=0 do { Bin[i]=n%2; n=(int)n/2; i++; } while i!=0 do{ print Bin[i]; i--; }9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进. 算法 MinDistance(A[0..n-1]) //输入:数组A[0..n-1] //输出:the smallest distance d between two of its elements习题1. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗? 解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count 4.(古老的七桥问题) 第2章习题7.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n)∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。
算法设计与分析习题解答

第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。
若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。
由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。
必要性。
同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。
2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。
由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。
3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。
证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。
4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。
算法设计与分析第二版

算法设计与分析第二版1. 前言算法是程序设计中最重要的一环,它是计算机科学的核心。
算法设计与分析是指对算法的设计、实现和错误的检测以及对算法效率的分析。
随着计算机软件和硬件技术的日新月异,人们对计算机处理能力的需求不断提高,研究和开发高效的算法成为了人们追求的目标。
因此,算法设计与分析在计算机科学中的地位越来越重要。
2. 算法设计我们常常需要设计一些算法解决具体问题。
所谓算法就是通过按照一定规则和步骤(计算过程)来实现某一种功能的一种描述。
为了更好地实现算法,我们可以通过以下几个方面加以考虑:2.1 正确性设计算法首要考虑的是其正确性。
一个算法的正确性是指其能够正确地实现所需要的功能。
正确性是设计算法的必要条件。
2.2 可读性设计算法的目的不仅仅是为了完成特定的功能,还需要考虑到算法的可读性。
可读性使得算法更加易于理解,便于后续维护和修改。
在实际开发中,算法的可读性经常成为考虑的一个重点。
2.3 可维护性随着业务的不断变化,经常需要对算法进行维护和改进,因此所设计的算法需要考虑到其可维护性,具体表现在代码的可扩展性、可重用性等。
算法具有高可维护性的优势,可以降低程序错误率,提升程序的健壮性。
3. 算法分析算法分析是指对算法的效率进行分析。
具体包括时间复杂度和空间复杂度。
算法的效率是指算法所需要的时间或者空间资源量。
我们通常采用复杂度来描述算法的效率。
3.1 时间复杂度时间复杂度通常指的是算法的运行时间。
计算时间复杂度时,需要确定算法的基本操作次数和各操作之间的顺序,然后计算基本操作次数所占的时间。
3.2 空间复杂度空间复杂度通常指的是算法所需内存的大小。
在实际程序设计中,除了考虑时间复杂度还需要考虑空间复杂度问题。
算法占用空间大小的分析用于程序性能评估和程序优化。
4. 结论本文简要介绍了算法设计和算法分析的基础知识。
算法设计是指对算法的设计、实现和错误的检测以及对算法效率的分析。
算法分析包括时间复杂度和空间复杂度两个方面。
算法设计与分析第二版课后习题及解答(可编辑)

算法设计与分析第二版课后习题及解答算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求 //输入:一个正整数n2//输出:。
step1:a1; step2:若a*an 转step 3,否则输出a; step3:aa+1转step 2;5. a.用欧几里德算法求gcd(31415,14142)。
b. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。
a. gcd31415, 14142 gcd14142, 3131 gcd3131, 1618 gcd1618, 1513 gcd1513, 105 gcd1513, 105 gcd105, 43 gcd43, 19 gcd19, 5 gcd5, 4 gcd4, 1 gcd1, 0 1.b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1?14142 和 2?14142之间,所以欧几里德算法比此算法快1?14142/11 ≈1300 与2?14142/11 ≈ 2600 倍之间。
6.证明等式gcdm,ngcdn,m mod n对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和rm mod nm-qn;显然,若d能整除n和r,也一定能整除mr+qn和n。
数对m,n和n,r具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcdm,ngcdn,r7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0mn的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcdm,ngcdn,m并且这种交换处理只发生一次.8.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?1次b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?5次gcd5,8习题1.21.农夫过河P?农夫W?狼 G?山羊 C?白菜2.过桥问题1,2,5,10---分别代表4个人, f?手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c0的实根,写出上述算法的伪代码可以假设sqrtx是求平方根的函数算法Quadratica,b,c//求方程ax^2+bx+c0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D0temp←2*ax1←-b+sqrtD/tempx2←-b-sqrtD/tempreturn x1,x2else if D0 return ?b/2*ael se return “no real roots”else //a0if b≠0 return ?c/belse //ab0if c0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Kii0,1,2,商赋给n第二步:如果n0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBinn//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1n]中i1while n!0 doBin[i]n%2;nintn/2;i++;while i!0 doprint Bin[i];i--;9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.算法略对这个算法做尽可能多的改进.算法 MinDistanceA[0..n-1]//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements 习题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 Count[]4.古老的七桥问题第2章习题2.17.对下列断言进行证明:如果是错误的,请举例a. 如果tn∈Ogn,则gn∈Ωtnb.α0时,Θαgn Θgn解:a这个断言是正确的。
习题答案第四章 算法设计与分析 吕国英

习题答案第四章算法设计与分析吕国英main(void){ int buf[100]; int n; int i,j,k; scanf("%d",&n);for(i=0;i<n;i++)buf[i]=2; for(i=0;i<n-1;i++){ for(j=0;j<n-i-1;j++){ buf[j]+=2; } } for(j=0;j<n;j++){ if(buf[j]>=10){ buf[j+1]+=buf[j]/10; buf[j]=buf[j]%10; } } for(i=n-1;i>=0;i--)printf("%d",buf[i]); printf("\n"); return 0; }2、#include<stdio、h>int main(void){int n=2;inti;for(i=1;i<=9;i++){n=(n+2)*2;}printf("%d\n",n);return 0;}3、#include<stdio、h>int main(void){int a=54;int n;int m;printf("计算机先拿3张牌\n");a=a-3;while(a>=0){printf("还剩%d张牌\n",a);printf("你拿几张?请输入:");scanf("%d",&n);if(n>4||n<1||n>a){printf("错误!重新拿牌\n");continue;}a=a-n;printf("还剩%d张牌\n",a);if(a==0)break;m=5-n;printf("计算机拿%d\n",m);a=a-m;}return 0;}4、#include<stdio、h>int d;int a1,a2;intfun(int n);int main(void){intn;printf("n=?,d=?,a1=?,a2=?");scanf("%d%d%d%d\n",&n,&d,&a 1,&a2);printf("%d\n",fun(n));return 0;}int fun(intn){if(n==1)return a1;if(n==2)return a2;return fun(n-2)-(fun(n-1)-d)*2;}5、#include<stdio、h>char chess[8][8];int is_safe(int row,int col);int queen(int row,int col,int n);int main(void){inti,j;for(i=0;i<8;i++)for(j=0;j<8;j++)chess[i][j]=X;queen(0 ,0,0);for(i=0;i<8;i++){for(j=0;j<8;j++)printf("%c",chess[i][j]);printf("\n");}return 0;}int is_safe(int row,int col){inti,j;for(i=0;i<8;i++){if(chess[row][i]==Q)return0;if(chess[i][col]==Q)return 0;}i=row;j=col;while(i!=-1&&j!=-1){if(chess[i--][j--]==Q)return0;}i=row;j=col;while(i!=-1&&j!=8){if(chess[i--][j++]==Q)return 0;}i=row;j=col;while(i!=8&&j!=-1){if(chess[i++][j--]==Q)return0;}i=row;j=col;while(i!=8&&j!=8){if(chess[i++][j++]==Q)re turn 0;}return1;}int queen(int row,int col,int n){inti,j;intresult=0;if(n==8)return1;elseif(is_safe(row,col)){chess[r ow][col]=Q;for(i=0;i<8;i++)for(j=0;j<8;j++){result+=queen (i,j,n+1);if(result>0)break;}if(result>0)return1;else{chess[row][col]=X;return 0;}}elsereturn 0;}6、#include<stdio、h>int main(void){inti,j,k;for(i=1;i<=33;i++)for(j=1;j<=50;j++){k=100-i-j;if(k%2==0){if(3*i+2*j+k/2==100)printf("大马%d\n中马%d\n 小马%d\n\n\n",i,j,k);}}return 0;}7、#include<stdio、h>int main(void){inti;for(i=1;i<=10000;i++){if(i%2==1&&i%3==2&&i%5==4&&i%6==5 &&i%7==0)printf("%d\n",i);}return 0;}8、#include<stdio、h>int main(void){int i;int sum;inta1,a2,a3,a4;for(i=1000;i<=9999;i++){a1=i%10;a2=i/10%10;if (a1!=a2){a3=i/100%10;if(a1!=a3&&a2!=a3){a4=i/1000;if(a1!= a4&&a2!=a4&&a3!=a4){sum=(a1+a2+a3+a4)*(a1+a2+a3+a4);if(i% sum==0)printf("%d\n",i);}}}}return 0;}9、#include<stdio、h> #define N10 void max_min(int *a,int m,int n,int*min1,int *min2,int *max1,int *max2); int main(void) { int a[N]={2,3,4,5,34,7,9,6,43,21}; int min1,min2; int max1,max2; max_min(a,0,N-1,&min1,&min2,&max1,&max2); printf("min1=%d\nmin2=%d\nmax1=%d\nmax2=%d\n",min1,min2,m ax1,max2); return 0; } void max_min(int *a,int m,intn,int *min1,int *min2,int *max1,int *max2){ int lmin1,lmin2,lmax1,lmax2; intrmin1,rmin2,rmax1,rmax2; int mid; if(m==n){ *min1=*min2=*max1=*max2=a[m]; } else if(m==n-1){ if(a[m]<a[n]){ *min1=a[m]; *min2=a[n]; *max1=a[n]; *max2=a[m]; } else { *min1=a[n]; *min2=a[m]; *max1=a[m]; *max2=a[n]; } } else { mid=(m+n)/2;max_min(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2);max_min(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2);if(lmin1<rmin1){ if(lmin2<rmin1){ *min1=lmin1; *min2=lmin2; } else { *min1=lmin1;*min2=rmin1; } } else if(rmin2<lmin1){ *min1=rmin1; *min2=rmin2; } else { *min1=rmin1;*min2=lmin1; } if(lmax1>rmax1){ if(lmax2>rmax1){ *max1=lmax1; *max2=lmax2; } else { *max1=lmax1;*max2=rmax1; } } else if(rmax2>lmax1){ *max1=rmax1; *max2=rmax2; } else { *max1=rmax1;*max2=lmax1; } } }10、#include<stdio、h> int add(int *a,int flag,int right); int main(void){ int a[10]={1,2,3,4,5,6,7,8,9,10}; intsum=add(a,0,9); printf("%d\n",sum); return 0; } intadd(int *a,int flag,int right){ int mid; if(flag==right){ return a[flag]; } else if(flag==right-1){ return a[flag]+a[right]; } else{ mid=(flag+right)/2; returnadd(a,flag,mid)+add(a,mid+1,right); } }11、#include<stdio、h>int main(void){int a[5][3]={{-50,17,-42},{-47,-19,-3},{36,-34,-43},{-30,-43,34},{-23,-8,-45}};int i,j;int max,n;intsum=0;for(i=0;i<5;i++){max=a[i][0];n=0;for(j=1;j<3;j++){i f(a[i][j]>max){max=a[i][j];n=j;}}sum+=max;printf("a[%d][%d]=%d\n",i,n,max);}printf("%d\n",sum);return 0;}12、/* * File: newmain、c* Author: nirnava** Created on全文结束》》年4月22日, 下午5:21*/#include<stdio、h>#include<stdlib、h>#define N4void matrix_mul(int*mul1,int *mul2,int *mul3,int length);voidmatrix_add_sub(int * A,int * B,int * C,int m,charch);void update_half_value(int * A,int * B,int m);void get_half_value(int * A,int * B,int m);int main(void){int i,j;int mul1[N*N]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6};intmul2[N*N]={7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2};intmul3[N*N];matrix_mul(mul1,mul2,mul3,N);for(i=0;i<N*N;i++) {printf("%5d",mul3[i]);if((i+1)%N==0)printf("\n");}return 0;}void matrix_add_sub(int * A,int * B,int * C,int m,char ch){inti;for(i=0;i<m*m;i++){if(ch==+)C[i]=A[i]+B[i];elseC[i]=A[i ]-B[i];}}void update_half_value(int * A,int * B,intm){inti,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){B[i*m+j]=A[i*m/ 2+j];}}}void get_half_value(int * A,int * B,int m){inti,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){A[i*m/2+j]=B[i* m+j];}}}void matrix_mul(int *A,int *B,int *C,intm){if(m==2){int D,E,F,G,H,I,J;D=A[0]*(B[1]-B[3]);E=A[3]*(B[2]-B[0]);F=(A[2]+A[3])*B[0];G=(A[0]+A[1])*B[3];H=(A[2]-A[0])*(B[0]+B[1]);I=(A[1]-A[3])*(B[2]+B[3]);J=(A[0]+A[3])*(B[0]+B[3]);C[0]=E+I+J-G;C[1]=D+G;C[2]=E+F;C[3]=D+H+J-F;return ;}else{intA1[m*m/4],A2[m*m/4],A3[m*m/4],A4[m*m/4];intB1[m*m/4],B2[m*m/4],B3[m*m/4],B4[m*m/4];intC1[m*m/4],C2[m*m/4],C3[m*m/4],C4[m*m/4];intD[m*m/4],E[m*m/4],F[m*m/4],G[m*m/4],H[m*m/4],I[m*m/4],J[m*m/4];inttemp1[m*m/4],temp2[m*m/4];get_half_value(A1,&A[0],m);get_ half_value(A2,&A[m/2],m);get_half_value(A3,&A[m*m/2],m);g et_half_value(A4,&A[m*m/2+m/2],m);get_half_value(B1,&B[0] ,m);get_half_value(B2,&B[m/2],m);get_half_value(B3,&B[m*m /2],m);get_half_value(B4,&B[m*m/2+m/2],m);matrix_add_sub( B2,B4,temp1,m/2,-);matrix_mul(A1,temp1,D,m/2);matrix_add_sub(B3,B1,temp1,m /2,-);matrix_mul(A4,temp1,E,m/2);matrix_add_sub(A3,A4,temp1,m /2,+);matrix_mul(temp1,B1,F,m/2);matrix_add_sub(A1,A2,tem p1,m/2,+);matrix_mul(temp1,B4,G,m/2);matrix_add_sub(A3,A1 ,temp1,m/2,-);matrix_add_sub(B1,B2,temp2,m/2,+);matrix_mul(temp1,temp 2,H,m/2);matrix_add_sub(A2,A4,temp1,m/2,-);matrix_add_sub(B3,B4,temp2,m/2,+);matrix_mul(temp1,temp 2,I,m/2);matrix_add_sub(A1,A4,temp1,m/2,+);matrix_add_sub (B1,B4,temp2,m/2,+);matrix_mul(temp1,temp2,J,m/2);matrix_ add_sub(E,I,temp1,m/2,+);matrix_add_sub(J,G,temp2,m/2,-);matrix_add_sub(temp1,temp2,C1,m/2,+);matrix_add_sub(D,G ,C2,m/2,+);matrix_add_sub(E,F,C3,m/2,+);matrix_add_sub(D, H,temp1,m/2,+);matrix_add_sub(J,F,temp2,m/2,-);matrix_add_sub(temp1,temp2,C4,m/2,+);update_half_value( C1,&C[0],m);update_half_value(C2,&C[m/2],m);update_half_v alue(C3,&C[m*m/2],m);update_half_value(C4,&C[m*m/2+m/2],m );return ;}}13、#include<stdio、h>int main(void){inta[6][7]={{16,4,3,12,6,0,3},{4,-5,6,7,0,0,2},{6,0,-1,-2,3,6,8},{5,3,4,0,0,-2,7},{-1,7,4,0,7,-5,6},{0,-1,3,4,12,4,2}};int b[6][7],c[6][7];int i,j,k;int max;int flag;inttemp;for(i=0;i<6;i++)for(j=0;j<7;j++){b[i][j]=a[i][j];c[i ][j]=-1;}for(i=1;i<5;i++){for(j=0;j<7;j++){max=0;for(k=j-2;k<=j+2;k++){if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max){max=b[i][j]+b[i-1][k];flag=k;}}}b[i][j]=max;c[i][j]=flag;}}for(j=1;j<=5;j ++){max=0;for(k=j-2;k<=j+2;k++){if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max){max=b[i][j]+b[i-1][k];flag=k;}}}b[i][j]=max;c[i][j]=flag;}max=0;for(j=1;j <=5;j++){if(b[i][j]>max){max=b[i][j];flag=j;}}printf("%d\ n",max);temp=c[i][flag];printf("%5d",a[i][temp]);for(j=i; j>0;j--){temp=c[j][temp];printf("%5d",a[j-1][temp]);}printf("\n");return 0;}14、#include<stdio、h>int main(void){intA[6]={0,3,7,9,12,13};int B[6]={0,5,10,11,11,11};intC[6]={0,4,6,11,12,12};int AB[6][6];int temp[6];intabc[6];int max;int flag;inti,j,k;for(i=0;i<=5;i++){max=0;for(j=0;j<=i;j++){AB[i][j]= A[i-j]+B[j];if(AB[i][j]>max)max=AB[i][j];}temp[i]=max;}max=0; for(i=0;i<=5;i++){abc[i]=temp[i]+C[5-i];if(abc[i]>max){max=abc[i];flag=i;}}printf("max=%d\n",m ax);printf("c=%d\n",5-flag);max=max-C[5-flag];for(i=0;i<=flag;i++){if(AB[flag][i]==max){printf("b =%d\n",i);printf("a=%d\n",flag-i);break;}}return 0;}16、#include<stdio、h>#define N100int search(int*a,int left,int right);int sum_buf(int *a,int left,int right);int main(void){int a[N];int i;ints;for(i=0;i<N;i++)a[i]=1;a[24]=2;s=search(a,0,N-1);printf("%d\n",s);return 0;}int sum_buf(int *a,int left,int right){int i;intsum=0;for(i=left;i<=right;i++)sum+=a[i];return sum;}int search(int *a,int left,int right){intmid=(left+right)/2;if(left==right-1){if(a[left]<a[right])return right;elsereturnleft;}if(mid*2!=(right+left-1)){if(sum_buf(a,left,mid-1)>sum_buf(a,mid+1,right)){return search(a,left,mid-1);}elseif(sum_buf(a,left,mid-1)<sum_buf(a,mid+1,right)){returnsearch(a,mid+1,right);}elsereturnmid;}else{if(sum_buf(a,left,mid)>sum_buf(a,mid+1,right))r eturn search(a,left,mid);elsereturnsearch(a,mid+1,right);}}17、#include<stdio、h>intjob[6][2]={{3,8},{12,10},{5,9},{2,6},{9、3},{11,1}};int x[6],bestx[6],f1=0,bestf,f2[7]={0};void try(int i);void swap(int a,int b);int main(void){inti,j;bestf=32767;for(i=0;i<6;i++)x[i]=i;try(0);for(i=0;i<6 ;i++)printf("%d",bestx[i]);printf("\nbestf=%d\n",bestf);return 0;}void try(int i){intj;if(i==6){for(j=0;j<6;j++)bestx[j]=x[j];bestf=f2[i];}els e{for(j=i;j<6;j++){f1=f1+job[x[j]][0];if(f2[i]>f1)f2[i+1] =f2[i]+job[x[j]][1];elsef2[i+1]=f1+job[x[j]][1];if(f2[i+1 ]<bestf){swap(i,j);try(i+1);swap(i,j);}f1=f1-job[x[j]][0];}}}void swap(int i,int j){inttemp;temp=x[i];x[i]=x[j];x[j]=temp;}18、#include<stdio、h>#define N5 //N个数字#define M2 //M个加号char buf[N];int a[N];char b[M+1][N];intc[M+1];int try(int t);void swap(int t1,int t2);intadd();void output();int min=99999;int main(){inti;for(i=0;i<N;i++){scanf("%c",&buf[i]);}a[0]=0;for(i=1;i< =M;i++){a[i]=1;}for(;i<N;i++){a[i]=0;}try(1);output();pri ntf("%d\n",min);return 0;}int try(int t){int j;int i;int sum;if(t>=N){sum=add();if(sum<min){min=sum;for(i=0;i<M+1; i++){c[i]=atoi(b[i]);}}/*for(i=0;i<N;i++){printf("%d",a[i ]);}printf("\n");*/}else{for(j=t;j<N;j++){//if(a[t]!=a[j] ){swap(t,j);try(t+1);swap(t,j);}//else//try(t+1);}}}void swap(int t1,int t2){intt;t=a[t1];a[t1]=a[t2];a[t2]=t;}int add(){int sum=0;inti=0;int j;int k=0;inth=0;for(i=0;i<M+1;i++)for(j=0;j<N;j++)b[i][j]=Q;i=0;j=0;h =0;k=0;for(j=0;j<N;j++){if(a[j]==1){h=0;i++;b[i][h]=buf[j ];//printf("%d ",atoi(b[i]));//printf("%d %d %c\n",i,h,b[i][h]);h++;}else{b[i][h]=buf[j];//printf("%d %d %c \n",i,h,b[i][h]);//printf("%d",atoi(b[i]));h++;}}/*for(i=0;i<M+1;i++){for(j=0;j<N;j++) printf("%c",b[i][j]);printf("\n");}*/for(i=0;i<M+1;i++){sum+=atoi(b[i]);}return sum;}void output(){inti;for(i=0;i<M+1;i++){printf("%d",atoi(b[i]));if(i!=M)printf("+");}printf("=");}19、#include<stdio、h>int main(void){int buf[100];int m,n;inti,j;buf[0]=1;buf[1]=1;scanf("%d%d",&n,&m);for(i=1;i<n;i++){buf[i+1]=buf[i];for(j=i;j>0;j--){buf[j]=buf[j]+buf[j-1];}}printf("%d\n",buf[m]);return 0;}20、#include<stdio、h> int max_sum4(int *a,int n);int max_sub_sum(int *a,int left,int right); int main(void) { int a[6]={-2,11,-4,13,-5,-2};printf("%d\n",max_sum4(a,5)); return 0; } intmax_sum4(int *a,int n){ return max_sub_sum(a,0,n); } int max_sub_sum(int*a,int left,int right){ intcenter,i,max,left_sum,right_sum,s1,s2,s3,s4,lefts,rights, leftl,rightl; int buf[4]; if(left==right)return a[left]; else { center=(left+right)/2;left_sum=max_sub_sum(a,left,center);right_sum=max_sub_sum(a,center+1,right); s1=0; lefts=0;for(i=center;i>=left;i--){ lefts+=a[i]; if(lefts>s1)s1=lefts; } s2=0; rights=0;for(i=center+1;i<=right;i++){ rights+=a[i]; if(rights>s2)s2=rights; } s3=0; leftl=0; for(i=left;i<=center;i++) { leftl+=a[i]; if(leftl>s3)s3=leftl; } s4=0; rightl=0;for(i=right;i>=center+1;i--){ rightl+=a[i]; if(rightl>s4)s4=rightl; } buf[0]=s1+s2; buf[1]=s4+s3;buf[2]=left_sum; buf[3]=right_sum; max=0;for(i=0;i<=3;i++){ if(buf[i]>max)max=buf[i]; } return max; } }。
算法设计与分析课后习题

1、实验内容递归求n的二次方各项的系数。
2、程序设计代码如下:#include"stdio.h"void coeff(int a[],int n)if(n==1)a[1]=1;a[2]=1;elsecoeff(a,n-1);a[n+1]=1;for(int i=n;i>=2;i=i-1)a[i]=a[i]+a[i-1];a[1]=1;void main()int a[100],i,n;printf("输入n的值:");scanf("%d",&n);coeff(a,n);for(i=1;i<=n+1;i++)printf(" %d ",a[i]);printf("\n");1、实验内容写出计算ackerman函数ack(m,n)的递归计算函数。
2、程序设计代码如下:#include "stdio.h"int ack(int m,int n)if(m==0)return n+1;else if(n==0)return ack(m-1,1);elsereturn ack(m-1,ack(m,m-1));void main()int m,n,z;printf("input m and n:");scanf("%d %d",&m,&n);if(m<0 && n<0)printf("error input!");elsez=ack(m,n);printf("%d\n",z);第四章例15 求数列的最大子段和给定n个元素的整数列(可能为负整数)a1,a2,…..,an。
求形如:ai,ai+1,……aj i,j=1,…..,n,i<=j的子段,使其和为最大。
算法设计与分析智慧树知到课后章节答案2023年下山东交通学院

算法设计与分析智慧树知到课后章节答案2023年下山东交通学院山东交通学院第一章测试1.解决一个问题通常有多种方法。
若说一个算法“有效”是指( )A:这个算法能在一定的时间和空间资源限制内将问题解决B:这个算法能在人的反应时间内将问题解决C:这个算法比其他已知算法都更快地将问题解决D:(这个算法能在一定的时间和空间资源限制内将问题解决)和(这个算法比其他已知算法都更快地将问题解决)答案:(这个算法能在一定的时间和空间资源限制内将问题解决)和(这个算法比其他已知算法都更快地将问题解决)2.农夫带着狼、羊、白菜从河的左岸到河的右岸,农夫每次只能带一样东西过河,而且,没有农夫看管,狼会吃羊,羊会吃白菜。
请问农夫能不能过去?()A:不一定B:不能过去 C:能过去答案:能过去3.下述()不是是算法的描述方式。
A:自然语言 B:E-R图 C:程序设计语言 D:伪代码答案:E-R图4.有一个国家只有6元和7元两种纸币,如果你是央行行长,你会设置()为自动取款机的取款最低限额。
A:40 B:29 C:30 D:42答案:305.算法是一系列解决问题的明确指令。
()A:对 B:错答案:对6.程序=数据结构+算法()A:对 B:错答案:对7.同一个问题可以用不同的算法解决,同一个算法也可以解决不同的问题。
()A:错 B:对答案:对8.算法中的每一条指令不需有确切的含义,对于相同的输入不一定得到相同的输出。
( )A:错 B:对答案:错9.可以用同样的方法证明算法的正确性与错误性 ( )A:错 B:对答案:错10.求解2个数的最大公约数至少有3种方法。
( )A:对 B:错答案:错11.没有好的算法,就编不出好的程序。
()A:对 B:错答案:对12.算法与程序没有关系。
( )A:错 B:对答案:错13.我将来不进行软件开发,所以学习算法没什么用。
( )A:错 B:对答案:错14.gcd(m,n)=gcd(n,m m od n)并不是对每一对正整数(m,n)都成立。
算法设计技巧与分析英文版课后练习题含答案

Algorithm Design Techniques and Analysis: English VersionExercise with AnswersIntroductionAlgorithms are an essential aspect of computer science. As such, students who are part of this field must master the art of algorithm design and analysis. Algorithm design refers to the process of creating algorithms that solve computational problems. Algorithm analysis, on the other hand, focuses on evaluating the resources required to execute those algorithms. This includes computational time and memory consumption.This document provides students with helpful algorithm design and analysis exercises. The exercises are in the formof questions with step-by-step solutions. The document is suitable for students who have completed the English versionof the Algorithm Design Techniques and Analysis textbook. The exercises cover various algorithm design techniques, such as divide-and-conquer, dynamic programming, and greedy approaches.InstructionEach exercise comes with a question and its solution. Read the question carefully and try to find a solution withoutlooking at the answer first. If you get stuck, look at the solution. Lastly, try the exercise agn without referring to the answer.Exercise 1: Divide and ConquerQuestion:Given an array of integers, find the maximum possible sum of a contiguous subarray.Example:Input: [-2, -3, 4, -1, -2, 1, 5, -3]Output: 7 (the contiguous subarray [4, -1, -2, 1, 5]) Solution:def max_subarray_sum(arr):if len(arr) ==1:return arr[0]mid =len(arr) //2left_arr = arr[:mid]right_arr = arr[mid:]max_left_sum = max_subarray_sum(left_arr)max_right_sum = max_subarray_sum(right_arr)max_left_border_sum =0left_border_sum =0for i in range(mid-1, -1, -1):left_border_sum += arr[i]max_left_border_sum =max(max_left_border_sum, left_b order_sum)max_right_border_sum =0right_border_sum =0for i in range(mid, len(arr)):right_border_sum += arr[i]max_right_border_sum =max(max_right_border_sum, righ t_border_sum)return max(max_left_sum, max_right_sum, max_left_border_s um+max_right_border_sum)Exercise 2: Dynamic ProgrammingQuestion:Given a list of lengths of steel rods and a corresponding list of prices, determine the maximum revenue you can get by cutting these rods into smaller pieces and selling them. Assume the cost of each cut is 0.Lengths: [1, 2, 3, 4, 5, 6, 7, 8]Prices: [1, 5, 8, 9, 10, 17, 17, 20]If the rod length is 4, the maximum revenue is 10.Solution:def max_revenue(lengths, prices, n):if n ==0:return0max_val =float('-inf')for i in range(n):max_val =max(max_val, prices[i] + max_revenue(length s, prices, n-i-1))return max_valExercise 3: Greedy AlgorithmQuestion:Given a set of jobs with start times and end times, find the maximum number of non-overlapping jobs that can be scheduled.Start times: [1, 3, 0, 5, 8, 5]End times: [2, 4, 6, 7, 9, 9]Output: 4Solution:def maximum_jobs(start_times, end_times):job_list =sorted(zip(end_times, start_times))count =0end_time =float('-inf')for e, s in job_list:if s >= end_time:count +=1end_time = ereturn countConclusionThe exercises presented in this document provide a practical way to master essential algorithm design and analysis techniques. Solving the problems without looking at the answers will expose students to the type of problems they might encounter in real life. The document’s solutionsprovide step-by-step instructions to ensure that students can approach the problems with confidence.。
算法分析与设计(习题答案)

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
算法分析与设计第二版习题答案-第三章到第五章

int bool=1;
int min;
int j;
int i;
int k;
int flag;
for(i=0;i<count;i++)
{
if(buf[i]=='(')
push(buf[i],i);
if(buf[i]==')')
{
flag=pop();
算法设计与分析(第二版)习题答案 主编:吕国英
算法设计与分析(第二版)习题答案(第三章)
第三章:
1.#include<stdlib.h>#include<stdio.h>int main(int argc,char **argv){int n;int i,j,k;int *buf;printf("请输入n的数值:");
;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return
0;}6.#include<stdio.h>#include<stdlib.h>typedef struct s_node s_list;typedef s_list *link;struct s_node{char ch;int flag;link next;};link top;void push(char ch,int flag){link newnode;newnode=(link)malloc(sizeof(s_list));newnode->ch=ch;newnode- >flag=flag;newnode-
算法分析习题参考答案第四章

第四章作业 部分参考答案1. 设有n 个顾客同时等待一项服务。
顾客i 需要的服务时间为n i t i ≤≤1,。
应该如何安排n 个顾客的服务次序才能使总的等待时间达到最小?总的等待时间是各顾客等待服务的时间的总和。
试给出你的做法的理由(证明)。
策略:对 1i t i n ≤≤进行排序,,21n i i i t t t ≤≤≤ 然后按照递增顺序依次服务12,,...,ni i i 即可。
解析:设得到服务的顾客的顺序为12,,...,n j j j ,则总等待时间为,2)1(121n n j j j j t t t n nt T +++-+=- 则在总等待时间T 中1j t 的权重最大,jn t 的权重最小。
故让所需时间少的顾客先得到服务可以减少总等待时间。
证明:设,21n i i i t t t ≤≤≤ ,下证明当按照不减顺序依次服务时,为最优策略。
记按照n i i i 21次序服务时,等待时间为T ,下证明任意互换两者的次序,T都不减。
即假设互换j i ,)(j i <两位顾客的次序,互换后等待总时间为T ~,则有.~T T ≥由于,))(())(()2)(2()1)(1(21n j i i i i i i t j t j n i t i n t n t n T +--++--++--+--=,))(())(()2)(2()1)(1(~21n i j i i i i i t j t j n i t i n t n t n T +--++--++--+--=则有.0))((~≥--=-i j i i t t i j T T同理可证其它次序,都可以由n i i i 21经过有限次两两调换顺序后得到,而每次交换,总时间不减,从而n i i i 21为最优策略。
2. 字符h a ~出现的频率分布恰好是前8个Fibonacci 数,它们的Huffman 编码是什么?将结果推广到n 个字符的频率分布恰好是前n 个Fibonacci 数的情形。
算法设计与分析课后习题解答

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+g2〈2max(g1,g2)
又g2(n)〉0,g1(n)+g2(n)>g1(n),即g1+g2>max(g1,g2).
算法设计与分析基础课后练习答案
习题1.1
4。设计一个计算 的算法,n是任意正整数。除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求
//输入:一个正整数n 2
//输出:。
step1:a=1;
step2:若a*a<n转step 3,否则输出a;
step3:a=a+1转step 2;
5. a.用欧几里德算法求gcd(31415,14142)。
b。该算法稳定吗?
c.该算法在位吗?
解:
a。该算法对列表”60,35,81,98,14,47”排序的过程如下所示:
b.该算法不稳定.比如对列表"2,2*”排序
c.该算法不在位.额外空间for S and Count[]
4.(古老的七桥问题)
第2章
习题2。1
7。对下列断言进行证明:(如果是错误的,请举例)
Else return A[n—1]
a.该算法计算的是什么?
b.建立该算法所做的基本操作次数的递推关系并求解
解:
a.计算的给定数组的最小值
b.
9。考虑用于解决第8题问题的另一个算法,该算法递归地将数组分成两半。我们将它称为Min2(A[0..n-1])
算法设计与分析书后参考答案

参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。
2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。
这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。
(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。
(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
算法设计与分析基础第二版课后答案

算法设计与分析基础第二版课后答案【篇一:算法设计与分析基础课后习题答案(中文版)】class=txt>习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立. hint:根据除法的定义不难证明:?如果 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.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次? hint:对于任何形如0=mgcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.2 1.(农夫过河)p—农夫w—狼 g—山羊 c—白菜 2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数) 算法quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法 //输入:实系数a,b,c//输出:实根或者无解信息if a≠0d←b*b-4*a*c if d0temp←2*ax1←(-b+sqrt(d))/temp x2←(-b-sqrt(d))/temp return x1,x2else if d=0 return –b/(2*a) else return “no real roots” else //a=0 if b≠0 return –c/b else //a=b=0if c=0 return “no real numbers”else return “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//输出:该正整数相应的二进制数,该数存放于数组bin[1...n]中 i=1 while n!=0 do { bin[i]=n%2; n=(int)n/2; i++; }while i!=0 do{ print bin[i]; i--; }9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进. 算法 mindistance(a[0..n-1]) //输入:数组a[0..n-1]//输出:the smallest distance d between two of its elements习题1.31. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗? 解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所示:b.该算法不稳定.比如对列表‖2,2*‖排序c.该算法不在位.额外空间for s and count[] 4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i个元素(1=i=n)b.删除有序数组的第i个元素(依然有序) hints:a. replace the ith element with the last element and decreasethe array size of 1b. replace the ith element with a special symbol that cannot be a value of the arr ay’s element(e.g., 0 for an array of positive numbers ) to mark the ith position is empty. (―lazy deletion‖)第2章习题2.1a. 这个断言是正确的。
算法设计与分析习题解答(第2版)

第1章算法引论11.1 算法与程序11.2 表达算法的抽象机制11.3 描述算法31.4 算法复杂性分析13小结16习题17第2章递归与分治策略192.1 递归的概念192.2 分治法的基本思想262.3 二分搜索技术272.4 大整数的乘法282.5 Strassen矩阵乘法302.6 棋盘覆盖322.7 合并排序342.8 快速排序372.9 线性时间选择392.10 最接近点对问题432.11 循环赛日程表53小结54习题54第3章动态规划613.1 矩阵连乘问题62目录算法设计与分析(第2版)3.2 动态规划算法的基本要素67 3.3 最长公共子序列713.4 凸多边形最优三角剖分753.5 多边形游戏793.6 图像压缩823.7 电路布线853.8 流水作业调度883.9 0-1背包问题923.10 最优二叉搜索树98小结101习题102第4章贪心算法1074.1 活动安排问题1074.2 贪心算法的基本要素1104.2.1 贪心选择性质1114.2.2 最优子结构性质1114.2.3 贪心算法与动态规划算法的差异1114.3 最优装载1144.4 哈夫曼编码1164.4.1 前缀码1174.4.2 构造哈夫曼编码1174.4.3 哈夫曼算法的正确性1194.5 单源最短路径1214.5.1 算法基本思想1214.5.2 算法的正确性和计算复杂性123 4.6 最小生成树1254.6.1 最小生成树性质1254.6.2 Prim算法1264.6.3 Kruskal算法1284.7 多机调度问题1304.8 贪心算法的理论基础1334.8.1 拟阵1334.8.2 带权拟阵的贪心算法1344.8.3 任务时间表问题137小结141习题141第5章回溯法1465.1 回溯法的算法框架1465.1.1 问题的解空间1465.1.2 回溯法的基本思想1475.1.3 递归回溯1495.1.4 迭代回溯1505.1.5 子集树与排列树1515.2 装载问题1525.3 批处理作业调度1605.4 符号三角形问题1625.5 n后问题1655.6 0\|1背包问题1685.7 最大团问题1715.8 图的m着色问题1745.9 旅行售货员问题1775.10 圆排列问题1795.11 电路板排列问题1815.12 连续邮资问题1855.13 回溯法的效率分析187小结190习题191第6章分支限界法1956.1 分支限界法的基本思想1956.2 单源最短路径问题1986.3 装载问题2026.4 布线问题2116.5 0\|1背包问题2166.6 最大团问题2226.7 旅行售货员问题2256.8 电路板排列问题2296.9 批处理作业调度232小结237习题238第7章概率算法2407.1 随机数2417.2 数值概率算法2447.2.1 用随机投点法计算π值2447.2.2 计算定积分2457.2.3 解非线性方程组2477.3 舍伍德算法2507.3.1 线性时间选择算法2507.3.2 跳跃表2527.4 拉斯维加斯算法2597.4.1 n 后问题2607.4.2 整数因子分解2647.5 蒙特卡罗算法2667.5.1 蒙特卡罗算法的基本思想2667.5.2 主元素问题2687.5.3 素数测试270小结273习题273第8章 NP完全性理论2788.1 计算模型2798.1.1 随机存取机RAM2798.1.2 随机存取存储程序机RASP2878.1.3 RAM模型的变形与简化2918.1.4 图灵机2958.1.5 图灵机模型与RAM模型的关系297 8.1.6 问题变换与计算复杂性归约299 8.2 P类与NP类问题3018.2.1 非确定性图灵机3018.2.2 P类与NP类语言3028.2.3 多项式时间验证3048.3 NP完全问题3058.3.1 多项式时间变换3058.3.2 Cook定理3078.4 一些典型的NP完全问题3108.4.1 合取范式的可满足性问题3118.4.2 3元合取范式的可满足性问题312 8.4.3 团问题3138.4.4 顶点覆盖问题3148.4.5 子集和问题3158.4.6 哈密顿回路问题3178.4.7 旅行售货员问题322小结323习题323第9章近似算法3269.1 近似算法的性能3279.2 顶点覆盖问题的近似算法3289.3 旅行售货员问题近似算法3299.3.1 具有三角不等式性质的旅行售货员问题330 9.3.2 一般的旅行售货员问题3319.4 集合覆盖问题的近似算法3339.5 子集和问题的近似算法3369.5.1 子集和问题的指数时间算法3369.5.2 子集和问题的完全多项式时间近似格式337 小结340习题340第10章算法优化策略34510.1 算法设计策略的比较与选择34510.1.1 最大子段和问题的简单算法34510.1.2 最大子段和问题的分治算法34610.1.3 最大子段和问题的动态规划算法34810.1.4 最大子段和问题与动态规划算法的推广349 10.2 动态规划加速原理35210.2.1 货物储运问题35210.2.2 算法及其优化35310.3 问题的算法特征35710.3.1 贪心策略35710.3.2 对贪心策略的改进35710.3.3 算法三部曲35910.3.4 算法实现36010.3.5 算法复杂性36610.4 优化数据结构36610.4.1 带权区间最短路问题36610.4.2 算法设计思想36710.4.3 算法实现方案36910.4.4 并查集37310.4.5 可并优先队列37610.5 优化搜索策略380小结388习题388第11章在线算法设计39111.1 在线算法设计的基本概念39111.2 页调度问题39311.3 势函数分析39511.4 k 服务问题39711.4.1 竞争比的下界39711.4.2 平衡算法39911.4.3 对称移动算法39911.5 Steiner树问题40311.6 在线任务调度40511.7 负载平衡406小结407习题407词汇索引409参考文献415习题1-1 实参交换1习题1-2 方法头签名1习题1-3 数组排序判定1习题1-4 函数的渐近表达式2习题1-5 O(1) 和 O(2) 的区别2习题1-7 按渐近阶排列表达式2习题1-8 算法效率2习题1-9 硬件效率3习题1-10 函数渐近阶3习题1-11 n !的阶4习题1-12 平均情况下的计算时间复杂性4算法实现题1-1 统计数字问题4算法实现题1-2 字典序问题5算法实现题1-3 最多约数问题6算法实现题1-4 金币阵列问题8算法实现题1-5 最大间隙问题11第2章递归与分治策略14 习题2-1 Hanoi 塔问题的非递归算法14习题2-2 7个二分搜索算法15习题2-3 改写二分搜索算法18习题2-4 大整数乘法的 O(nm log(3/2))算法19习题2-5 5次 n /3位整数的乘法19习题2-6 矩阵乘法21习题2-7 多项式乘积21习题2-8 不动点问题的 O( log n) 时间算法22习题2-9 主元素问题的线性时间算法22习题2-10 无序集主元素问题的线性时间算法22习题2-11 O (1)空间子数组换位算法23习题2-12 O (1)空间合并算法25习题2-13 n 段合并排序算法32习题2-14 自然合并排序算法32习题2-15 最大值和最小值问题的最优算法35习题2-16 最大值和次大值问题的最优算法35习题2-17 整数集合排序35习题2-18 第 k 小元素问题的计算时间下界36习题2-19 非增序快速排序算法37习题2-20 随机化算法37习题2-21 随机化快速排序算法38习题2-22 随机排列算法38习题2-23 算法qSort中的尾递归38习题2-24 用栈模拟递归38习题2-25 算法select中的元素划分39习题2-26 O(n log n) 时间快速排序算法40习题2-27 最接近中位数的 k 个数40习题2-28 X和Y 的中位数40习题2-29 网络开关设计41习题2-32 带权中位数问题42习题2-34 构造Gray码的分治算法43习题2-35 网球循环赛日程表44目录算法设计与分析习题解答(第2版)算法实现题2-1 输油管道问题(习题2-30) 49算法实现题2-2 众数问题(习题2-31) 50算法实现题2-3 邮局选址问题(习题2-32) 51算法实现题2-4 马的Hamilton周游路线问题(习题2-33) 51算法实现题2-5 半数集问题60算法实现题2-6 半数单集问题62算法实现题2-7 士兵站队问题63算法实现题2-8 有重复元素的排列问题63算法实现题2-9 排列的字典序问题65算法实现题2-10 集合划分问题(一)67算法实现题2-11 集合划分问题(二)68算法实现题2-12 双色Hanoi塔问题69算法实现题2-13 标准二维表问题71算法实现题2-14 整数因子分解问题72算法实现题2-15 有向直线2中值问题72第3章动态规划76习题3-1 最长单调递增子序列76习题3-2 最长单调递增子序列的 O(n log n) 算法77习题3-7 漂亮打印78习题3-11 整数线性规划问题79习题3-12 二维背包问题80习题3-14 Ackermann函数81习题3-17 最短行驶路线83习题3-19 最优旅行路线83算法实现题3-1 独立任务最优调度问题(习题3-3) 83算法实现题3-2 最少硬币问题(习题3-4) 85算法实现题3-3 序关系计数问题(习题3-5) 86算法实现题3-4 多重幂计数问题(习题3-6) 87算法实现题3-5 编辑距离问题(习题3-8) 87算法实现题3-6 石子合并问题(习题3-9) 89算法实现题3-7 数字三角形问题(习题3-10) 91算法实现题3-8 乘法表问题(习题3-13) 92算法实现题3-9 租用游艇问题(习题3-15) 93算法实现题3-10 汽车加油行驶问题(习题3-16) 95算法实现题3-11 圈乘运算问题(习题3-18) 96算法实现题3-12 最少费用购物(习题3-20) 102算法实现题3-13 最大长方体问题(习题3-21) 104算法实现题3-14 正则表达式匹配问题(习题3-22) 105算法实现题3-15 双调旅行售货员问题(习题3-23) 110算法实现题3-16 最大 k 乘积问题(习题5-24) 111算法实现题3-17 最小 m 段和问题113算法实现题3-18 红黑树的红色内结点问题115第4章贪心算法123 习题4-2 活动安排问题的贪心选择123习题4-3 背包问题的贪心选择性质123习题4-4 特殊的0-1背包问题124习题4-10 程序最优存储问题124习题4-13 最优装载问题的贪心算法125习题4-18 Fibonacci序列的Huffman编码125习题4-19 最优前缀码的编码序列125习题4-21 任务集独立性问题126习题4-22 矩阵拟阵126习题4-23 最小权最大独立子集拟阵126习题4-27 整数边权Prim算法126习题4-28 最大权最小生成树127习题4-29 最短路径的负边权127习题4-30 整数边权Dijkstra算法127算法实现题4-1 会场安排问题(习题4-1) 128算法实现题4-2 最优合并问题(习题4-5) 129算法实现题4-3 磁带最优存储问题(习题4-6) 130算法实现题4-4 磁盘文件最优存储问题(习题4-7) 131算法实现题4-5 程序存储问题(习题4-8) 132算法实现题4-6 最优服务次序问题(习题4-11) 133算法实现题4-7 多处最优服务次序问题(习题4-12) 134算法实现题4-8 d 森林问题(习题4-14) 135算法实现题4-9 汽车加油问题(习题4-16) 137算法实现题4-10 区间覆盖问题(习题4-17) 138算法实现题4-11 硬币找钱问题(习题4-24) 138算法实现题4-12 删数问题(习题4-25) 139算法实现题4-13 数列极差问题(习题4-26) 140算法实现题4-14 嵌套箱问题(习题4-31) 140算法实现题4-15 套汇问题(习题4-32) 142算法实现题4-16 信号增强装置问题(习题5-17) 143算法实现题4-17 磁带最大利用率问题(习题4-9) 144算法实现题4-18 非单位时间任务安排问题(习题4-15) 145算法实现题4-19 多元Huffman编码问题(习题4-20) 147算法实现题4-20 多元Huffman编码变形149算法实现题4-21 区间相交问题151算法实现题4-22 任务时间表问题151第5章回溯法153习题5\|1 装载问题改进回溯法(一)153习题5\|2 装载问题改进回溯法(二)154习题5\|4 0-1背包问题的最优解155习题5\|5 最大团问题的迭代回溯法156习题5\|7 旅行售货员问题的费用上界157习题5\|8 旅行售货员问题的上界函数158算法实现题5-1 子集和问题(习题5-3) 159算法实现题5-2 最小长度电路板排列问题(习题5-9) 160算法实现题5-3 最小重量机器设计问题(习题5-10) 163算法实现题5-4 运动员最佳匹配问题(习题5-11) 164算法实现题5-5 无分隔符字典问题(习题5-12) 165算法实现题5-6 无和集问题(习题5-13) 167算法实现题5-7 n 色方柱问题(习题5-14) 168算法实现题5-8 整数变换问题(习题5-15) 173算法实现题5-9 拉丁矩阵问题(习题5-16) 175算法实现题5-10 排列宝石问题(习题5-16) 176算法实现题5-11 重复拉丁矩阵问题(习题5-16) 179算法实现题5-12 罗密欧与朱丽叶的迷宫问题181算法实现题5-13 工作分配问题(习题5-18) 183算法实现题5-14 独立钻石跳棋问题(习题5-19) 184算法实现题5-15 智力拼图问题(习题5-20) 191算法实现题5-16 布线问题(习题5-21) 198算法实现题5-17 最佳调度问题(习题5-22) 200算法实现题5-18 无优先级运算问题(习题5-23) 201算法实现题5-19 世界名画陈列馆问题(习题5-25) 203算法实现题5-20 世界名画陈列馆问题(不重复监视)(习题5-26) 207 算法实现题5-21 部落卫队问题(习题5-6) 209算法实现题5-22 虫蚀算式问题211算法实现题5-23 完备环序列问题214算法实现题5-24 离散01串问题217算法实现题5-25 喷漆机器人问题218算法实现题5-26 n 2-1谜问题221第6章分支限界法229习题6-1 0-1背包问题的栈式分支限界法229习题6-2 用最大堆存储活结点的优先队列式分支限界法231习题6-3 团顶点数的上界234习题6-4 团顶点数改进的上界235习题6-5 修改解旅行售货员问题的分支限界法235习题6-6 解旅行售货员问题的分支限界法中保存已产生的排列树237 习题6-7 电路板排列问题的队列式分支限界法239算法实现题6-1 最小长度电路板排列问题一(习题6-8) 241算法实现题6-2 最小长度电路板排列问题二(习题6-9) 244算法实现题6-3 最小权顶点覆盖问题(习题6-10) 247算法实现题6-4 无向图的最大割问题(习题6-11) 250算法实现题6-5 最小重量机器设计问题(习题6-12) 253算法实现题6-6 运动员最佳匹配问题(习题6-13) 256算法实现题6-7 n 后问题(习题6-15) 259算法实现题6-8 圆排列问题(习题6-16) 260算法实现题6-9 布线问题(习题6-17) 263算法实现题6-10 最佳调度问题(习题6-18) 265算法实现题6-11 无优先级运算问题(习题6-19) 268算法实现题6-12 世界名画陈列馆问题(习题6-21) 271算法实现题6-13 骑士征途问题274算法实现题6-14 推箱子问题275算法实现题6-15 图形变换问题281算法实现题6-16 行列变换问题284算法实现题6-17 重排 n 2宫问题285算法实现题6-18 最长距离问题290第7章概率算法296习题7-1 模拟正态分布随机变量296习题7-2 随机抽样算法297习题7-3 随机产生 m 个整数297习题7-4 集合大小的概率算法298习题7-5 生日问题299习题7-6 易验证问题的拉斯维加斯算法300习题7-7 用数组模拟有序链表300习题7-8 O(n 3/2)舍伍德型排序算法300习题7-9 n 后问题解的存在性301习题7-11 整数因子分解算法302习题7-12 非蒙特卡罗算法的例子302习题7-13 重复3次的蒙特卡罗算法303习题7-14 集合随机元素算法304习题7-15 由蒙特卡罗算法构造拉斯维加斯算法305习题7-16 产生素数算法306习题7-18 矩阵方程问题306算法实现题7-1 模平方根问题(习题7-10) 307算法实现题7-2 集合相等问题(习题7-17) 309算法实现题7-3 逆矩阵问题(习题7-19) 309算法实现题7-4 多项式乘积问题(习题7-20) 310算法实现题7-5 皇后控制问题311算法实现题7-6 3-SAT问题314算法实现题7-7 战车问题315算法实现题7-8 圆排列问题317算法实现题7-9 骑士控制问题319算法实现题7-10 骑士对攻问题320第8章NP完全性理论322 习题8-1 RAM和RASP程序322习题8-2 RAM和RASP程序的复杂性322习题8-3 计算 n n 的RAM程序322习题8-4 没有MULT和DIV指令的RAM程序324习题8-5 MULT和DIV指令的计算能力324习题8-6 RAM和RASP的空间复杂性325习题8-7 行列式的直线式程序325习题8-8 求和的3带图灵机325习题8-9 模拟RAM指令325习题8-10 计算2 2 n 的RAM程序325习题8-11 计算 g(m,n)的程序 326习题8-12 图灵机模拟RAM的时间上界326习题8-13 图的同构问题326习题8-14 哈密顿回路327习题8-15 P类语言的封闭性327习题8-16 NP类语言的封闭性328习题8-17 语言的2 O (n k) 时间判定算法328习题8-18 P CO -NP329习题8-19 NP≠CO -NP329习题8-20 重言布尔表达式329习题8-21 关系∝ p的传递性329习题8-22 L ∝ p 330习题8-23 语言的完全性330习题8-24 的CO-NP完全性330习题8-25 判定重言式的CO-NP完全性331习题8-26 析取范式的可满足性331习题8-27 2-SAT问题的线性时间算法331习题8-28 整数规划问题332习题8-29 划分问题333习题8-30 最长简单回路问题334第9章近似算法336习题9-1 平面图着色问题的绝对近似算法336习题9-2 最优程序存储问题336习题9-4 树的最优顶点覆盖337习题9-5 顶点覆盖算法的性能比339习题9-6 团的常数性能比近似算法339习题9-9 售货员问题的常数性能比近似算法340习题9-10 瓶颈旅行售货员问题340习题9-11 最优旅行售货员回路不自相交342习题9-14 集合覆盖问题的实例342习题9-16 多机调度问题的近似算法343习题9-17 LPT算法的最坏情况实例345习题9-18 多机调度问题的多项式时间近似算法345算法实现题9-1 旅行售货员问题的近似算法(习题9-9) 346 算法实现题9-2 可满足问题的近似算法(习题9-20) 348算法实现题9-3 最大可满足问题的近似算法(习题9-21) 349 算法实现题9-4 子集和问题的近似算法(习题9-15) 351算法实现题9-5 子集和问题的完全多项式时间近似算法352算法实现题9-6 实现算法greedySetCover(习题9-13) 352算法实现题9-7 装箱问题的近似算法First Fit(习题9-19) 356算法实现题9-8 装箱问题的近似算法Best Fit(习题9-19) 358算法实现题9-9 装箱问题的近似算法First Fit Decreasing(习题9-19) 360算法实现题9-10 装箱问题的近似算法Best Fit Decreasing(习题9-19) 361算法实现题9-11 装箱问题的近似算法Next Fit361第10章算法优化策略365 习题10-1 算法obst的正确性365习题10-2 矩阵连乘问题的 O(n 2) 时间算法365习题10-6 货物储运问题的费用371习题10-7 Garsia算法371算法实现题10-1 货物储运问题(习题10-3) 374算法实现题10-2 石子合并问题(习题10-4) 374算法实现题10-3 最大运输费用货物储运问题(习题10-5) 375算法实现题10-4 五边形问题377算法实现题10-5 区间图最短路问题(习题10-8) 381算法实现题10-6 圆弧区间最短路问题(习题10-9) 381算法实现题10-7 双机调度问题(习题10-10) 382算法实现题10-8 离线最小值问题(习题10-11) 390算法实现题10-9 最近公共祖先问题(习题10-12) 393算法实现题10-10 达尔文芯片问题395算法实现题10-11 多柱Hanoi塔问题397算法实现题10-12 线性时间Huffman算法400算法实现题10-13 单机调度问题402算法实现题10-14 最大费用单机调度问题405算法实现题10-15 飞机加油问题408第11章在线算法设计410习题11-1 在线算法LFU的竞争性410习题11-4 多读写头磁盘问题的在线算法410习题11-6 带权页调度问题410算法实现题11-1 最优页调度问题(习题11-2) 411算法实现题11-2 在线LRU页调度(习题11-3) 414算法实现题11-3 k 服务问题(习题11-5) 416参考文献422。
算法设计与分析课后习题

算法设计与分析课后习题(总8页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--第一章1. 算法分析题算法分析题1-1 求下列函数的渐进表达式(1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2)(2). n^2 / 10 + 2^n当n>5是,n^2 < 2 ^n所以,当n >= 1时,n^2/10 < 2 ^n故: n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n)(3). 21 + 1/n < 21 + 1 = 22 = O(1)(4). log(n^3)=3log(n)=O(log(n))(5). 10log(3^n) = (10log3)n = O(n)算法分析题1-6(1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5所以:f(n)=Θ(log(n)+5) =Θ(g(n))(2)因为:log(n) < √n ; f(n) = 2log(n); g(n)= √n所以:f(n) = O(g(n))(3)因为:log(n) < n; f(n) = n; g(n) = log(n^2) = 2log(n)所以;f(n) = Ω(g(n))(4)因为:f(n) = nlogn +n; g(n) = logn所以:f(n) =Ω(g(n))(5)因为: f(n) = 10; g(n) = log(10)所以:f(n) =Θ(g(n))(6)因为: f(n)=log^2(n); g(n) = log(n)所以: f(n) ==Ω(g(n))(7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2所以: f(n) = Ω(g(n))(8)因为:f(n) = 2^n; g(n) = 3 ^n; 2 ^n < 3 ^n所以: f(n) = O(g(n))习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)).分析与解答:因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n)).第二章算法分析题2-3 设a[0:n-1]是已经排好序的数组。
算法设计与分析第二版实践报告总结

算法设计与分析第二版实践报告总结下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!算法设计与分析第二版实践报告总结引言在计算机科学领域,算法设计与分析是一项至关重要的工作。
算法设计与分析(第2版)习题答案

习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n2.2 n=r2.3 r=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C ++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high) {图1.7 七桥问题int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴 qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计与分析-课后习题集答案

第一章3. 最大公约数为1。
快1414倍。
程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。
(log )n O 。
(2)画线语句的执行次数为111(1)(21)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执行次数为。
O 。
(4)当n 为奇数时画线语句的执行次数为(1)(1)4n n +-, 当n 为偶数时画线语句的执行次数为 (2)4n n +。
2()n O 。
10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()-+=O n n n 。
(2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。
对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()-+=Ωn n n 。
(3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()-+=Θn n n 。
11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。
可选212c =,03n =。
对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。
(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。
可选 1c =,04n =。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1#include<stdio.h>#include<math.h>void main(){int i,n,sum=0,power,proce,remainder,interger,decimal;printf("请输入2+22+…+2222(n个2)(不考虑精度)的n\nn=");scanf("%d",&n);for(i=1;i<=n&&i<=9;i++){proce=(int)(pow(10,i)-1)/9*2;sum=sum+proce;}if(n>9){for(i=1,power=n-9;i<=power;i++){proce=(int)(pow(10,9)-1)/9*2;sum=sum/10+proce;remainder=sum%10;if(remainder>=5)sum++;}interger=sum/100000000;decimal=sum%100000000;printf("2+22+…+2222(n个2)(不考虑精度)=%d.%d*e+%d\n",interger,decimal,n-1);}elseprintf("2+22+…+2222(n个2)(不考虑精度)=%d\n",sum);}4.2#include<stdio.h>void main(){int i,total=2,day=10;for(i=day-1;i>=1;i--)total=(total+2)*2;printf("第一天共有%d个桃。
\n",total);}4.3#include<stdio.h>void main(){int flag=0,last=54,card;printf("共有牌:%d \n",last);printf("计算机出:3 ");last=last-3;while(last>1){printf("还有牌:%d ",last);printf("您出:");scanf("%d",&card);printf("计算机出:%d ",5-card);last=last-5;}printf("\n还有牌:%d 。
您只能输入1。
\n",last);printf("您出:");scanf("%d",&card);printf("Sorry!您输了……\n");}4.5#include<stdio.h>void main(){intarray[8][8],i,j,i1=0,i2=1,i3=2,i4=3,i5=4,i6=5,i7=6,i8=7,j1=0,j2=0,j3=0,j4=0,j5= 0,j6=0,j7=0,j8=0;//先判断不在同一行和同一列,然后再做不在对角线printf("此处预先规定,第一行第一列处是皇后。
\n");for(j2=1;j2<8;j2++)for(j3=1;j3<8;j3++)for(j4=1;j4<8;j4++)for(j5=1;j5<8;j5++)for(j6=1;j6<8;j6++)for(j7=1;j7<8;j7++)for(j8=1;j8<8;j8++)if(j3!=j2)if(j4!=j2&&j4!=j3)if(j5!=j2&&j5!=j3&&j5!=j4)if(j6!=j2&&j6!=j3&&j6!=j4&&j6!=j5) if(j7!=j2&&j7!=j3&&j7!=j4&&j7!=j5&&j7!=j6)if(j8!=j2&&j8!=j3&&j8!=j4&&j8!=j5&&j8!=j6&&j8!=j7)if((i2-i1+j2-j1)!=0&&(i2-i1-j2+j1)!=0)//两点的位置关系!if((i3-i1+j3-j1)!=0&&(i3-i1-j3+j1)!=0)if((i3-i2+j3-j2)!=0&&(i3-i2-j3+j2)!=0)if((i4-i1+j4-j1)!=0&&(i4-i1-j4+j1)!=0) if((i4-i2+j4-j2)!=0&&(i4-i2-j4+j2)!=0)if((i4-i3+j4-j3)!=0&&(i4-i3-j4+j3)!=0)if((i5-i1+j5-j1)!=0&&(i5-i1-j5+j1)!=0)if((i5-i2+j5-j2)!=0&&(i5-i2-j5+j2)!=0)if((i5-i3+j5-j3)!=0&&(i5-i3-j5+j3)!=0)if((i5-i4+j5-j4)!=0&&(i5-i4-j5+j4)!=0)if((i6-i1+j6-j1)!=0&&(i6-i1-j6+j1)!=0)if((i6-i2+j6-j2)!=0&&(i6-i2-j6+j2)!=0)if((i6-i3+j6-j3)!=0&&(i6-i3-j6+j3)!=0)if((i6-i4+j6-j4)!=0&&(i6-i4-j6+j4)!=0)if((i6-i5+j6-j5)!=0&&(i6-i5-j6+j5)!=0)if((i7-i1+j7-j1)!=0&&(i7-i1-j7+j1)!=0)if((i7-i2+j7-j2)!=0&&(i7-i2-j7+j2)!=0) if((i7-i3+j7-j3)!=0&&(i7-i3-j7+j3)!=0)if((i7-i4+j7-j4)!=0&&(i7-i4-j7+j4)!=0)if((i7-i5+j7-j5)!=0&&(i7-i5-j7+j5)!=0)if((i7-i6+j7-j6)!=0&&(i7-i6-j7+j6)!=0)if((i8-i1+j8-j1)!=0&&(i8-i1-j8+j1)!=0)if((i8-i2+j8-j2)!=0&&(i8-i2-j8+j2)!=0)if((i8-i3+j8-j3)!=0&&(i8-i3-j8+j3)!=0)if((i8-i4+j8-j4)!=0&&(i8-i4-j8+j4)!=0)if((i8-i5+j8-j5)!=0&&(i8-i5-j8+j5)!=0)if((i8-i6+j8-j6)!=0&&(i8-i6-j8+j6)!=0)if((i8-i7+j8-j7)!=0&&(i8-i7-j8+j7)!=0){printf("**\n");for(i=0;i<8;i++)for(j=0;j<8;j++)array[i][j]=0;array[i1][j1]=1;array[i2][j2]=1;array[i3][j3]=1;array[i4][j4]=1;array[i5][j5]=1;array[i6][j6]=1;array[i7][j7]=1;array[i8][j8]=1;printf("1是皇后所在位置,0为其它位置。
\n"); for(i=0;i<8;i++){for(j=0;j<8;j++)printf("%d ",array[i][j]);printf("\n");}}}4.6#include<stdio.h>void main(){int goods=100,big=0,middle=0,small=0;for(big=0;big<=33;big++)for(middle=0;middle<=50;middle++)for(small=0;small<=100;small=small+2)if((big+middle+small)==100)if((big*3+middle*2+small/2)==goods)printf("大马:%2d 中马:%2d 小马:%2d\n",big,middle,small);}4.7#include<stdio.h>void main(){int n,flag=1;for(n=7;flag;n=n+7)if(n%2==1)if(n%3==2)if(n%5==4)if(n%6==5)flag=0;printf("该数为%d\n",n-7);}4.8#include<stdio.h>void main(){int th,flag=0;for(th=1000;th<9999;th++)if(th/1000!=th/100%10)if(th/1000!=th/10%10)if(th/1000!=th%10)if(th/100%10!=th/10%10)if(th/100%10!=th%10)if(th/10%10!=th%10)if(th%((th/1000)*(th/1000))==0){flag=0;if((th/100%10)==0)flag=1;elseif(th%((th/100%10)*(th/100%10))==0)flag=1;if(flag==1){flag=0;if((th/10%10)==0)flag=1;elseif(th%((th/10%10)*(th/10%10))==0)flag=1;if(flag==1){flag=0;if(th%10==0)flag=1;elseif(th%((th%10)*(th%10))==0)flag=1;if(flag==1)printf("%d\n",th);}}}}4.9#include <stdio.h>main(){int a[10]={1,10,5,4,9,3,8,6,7,2};int i,max1=0,max2=0,min1=0,min2=0;for(i=0;i<10;i++){if(a[max1]<a[i])max1=i;if(a[min1]>a[i])min1=i;}if(max1==0)max2=1;if(min1==0)min2=1;for(i=0;i<10;i++){if(i==max1||i==min1)continue;if(a[max2]<a[i])max2=i;if(a[min2]>a[i])min2=i;}printf("max1=%d\nmax2=%d\nmin1=%d\nmin2=%d\n",a[max1],a[max2],a[min1],a[min2]); }4.16#include<stdio.h>int fun(int N,int basic,int array[]){int n1=0,n2=0,n3=0,i;n3=(N%2!=0)?N+basic:0;for(i=0;i<N/2;i++){n1+=array[basic+i+1];n2+=array[basic+N/2+i+1];}if(N==2)return n1>n2?basic+1:basic+2;elseif(n1==n2)return n3;elseif(n1>n2)return fun(N/2,basic,array);elsereturn fun(N/2,basic+N/2,array);}void main(){int arr[19]={0,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1};printf("不合格品为第%d块。