计算机算法分析与设计第1章练习

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(3)i=1; j=0; while(i+j<=n) { if (i>j) j++; else i++; } 分析: 通过分析以上程序段,可将i+j看成一个控制循环次数 的变量,且每执行一次循环,i+j的值加1。该程序段的主 要时间消耗是while循环,而while循环共做了n次,所以该 程序段的执行时间为: T(n)=O(n)
//用数组c[5]保存统计结果 5.int Count(int a[], int n, int c[5]) { int d[5]={20,50,80,130,201}; //用来保存各统计区间的上限 int i,j; for(i=0;i<5;i++) c[i]=0; //给数组c[5]中的每个元素赋初值0 for(i=0;i<n;i++) { if(a[i]<0 || a[i]>200) return 0; //返回数值0表示数组中数据有错,统计失 败 for(j=0;j<5;j++) //查找a[i]所在的区间 if(a[i]<d[j]) break; c[j]++; //使统计相应区间的元素增1 } return 1; //返回数值1表示统计成功 } 时间复杂度为O(n)。
5.void UseFile(ifstream& inp, int c[10]) //假定inp所对应的文件中保存有n个整数 { for(int i=0; i<10; i++) c[i]=0; int x; while(inp>>x){ i=x%10; c[i]++; } }
6.void mtable(int n) { for(int i=1; i<=n; i++){ for(int j=i; j<=n; j++) cout<<i<<"*"<<j<<"="<<setw(2)<<i*j<<" "; cout<<endl; } }
3.double Product(double a[], int n) { double p=1; for(int i=0; i<n; i++) p*=a[i]; return p; } 时间复杂度为O(n)。
4.double Accumulate(double x,int n) { double p=1,s=1; for(int i=1; i<=n; i++){ p*=x; s+=p/(i+1); } return s; } 时间复杂度为O(n)。
(5)x=91; y=100; while(y>0) if(x>100) {x=x-10;y--;} else x++; 分析: x=91; //1 y=100; //1 while(y>0) //1101 if(x>100) //1100 { x=x-10; //100 y--; //100 } else x++; //1000 以上程序段右侧列出了执行次数。该程序段的执行时 间为: T(n)=O(1)
(2)i=0; k=0; do{ k=k+10*i; i++; } while(i<n); 分析: i=0; //1 k=0; //1 do{ //n k=k+10*i; //n i++; //n } while(i<n);//n 由以上列出的各语句的频度,可得该程序段的时间消耗: T(n)=1+1+n+n+n+n=4n+2 可表示为T(n)=O(n)
第一章
练 习
第一部分: 求下列程序段的时间复杂度
(1) i=1; k=0; while(i<n) { k=k+10*i;i++; } 分析: i=1; //1 k=0; //1 while(i<n) //n { k=k+10*i; //n-1 i++; //n-1 } 由以上列出的各语句的频度,可得该程序段的时间消耗: T(n)=1+1+n+(n-1)+(n-1)=3n 可表示为T(n)=O(n)
∑0 i=
n
xi i + 1 的值。
5.假定一维整型数组a[n]中的每个元素值均在[0,200]区间内, 分别统计出落在[0,20],[20,50],[50,80], [80,130],[130,200]等各区间内的元素个数。 6.从二维整型数组a[m][n]中查找出最大元素所在的行、列下标。
参考答案
7.void cmatrix(int a[M][N], int d) //M和N 为全局整型常量 { for(int i=0; i<M; i++) for(int j=0; j<N; j++) a[i][j]*=d; }
8.void matrimult(int a[M][N], int b[N][L], int c[M][L]) //M、N和L均为全局整型常量 { int i,j,k; for(i=0;i<M;i++) for(j=0;j<L;j++) c[i][j]=0; for(i=0;i<M;i++) for(j=0;j<L;j++) for(k=0;k<N;k++) c[i][j]+=a[i][k]*b[k][j]; }
1.char Compare(SimpleType x1, SimpleType x2) { if(x1>x2) return '>'; else if(x1==x2) return '='; else return '<'; } 时间复杂度为O(1)。
2.void Reverse(char* p) { int n=strlen(p); for(int i=0;i<n/2;i++){ char ch; ch=p[i]; p[i]=p[n-i-1]; p[n-i-1]=ch; } } 时间复杂度为O(n)。
(4)x=n; // n>1 while (x>=(y+1)*(y+1)) y++; 分析: 由x=n且x的值在程序中不变,又while的循环 条件(x>=(y+1)*(y+1))可知:当(y+1)*(y+1)刚超过 n的值时退出循环。 由(y+1)*(y+1)<n得:y<n0.5 所以,该程序段的执行时间为: 向下取整(n0.5)
6.void find(int a[M][N], int m, int n, int& Lin, int& Col) //M和N为全局常量, 应满足M>=n和N>=n的条件, Lin和Col为 //引用形参, 它是对应实参的别名, 其值由实参带回 { Lin=0;Col=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(a[i][j]>a[Lin][Col]) {Lin=i;Col=j;} } 时间复杂度为O(n2)。
3.int sum2(int n) { int s=0; for(int i=1; i<=n; i++){ int p=1; for(int j=1; j<=i; j++) p*=j; s+=p; } return s; }
4.int fun(int n) { int i=1,s=1; while(s<n) s+=++i; return i; }
1.int Prime(int n) { int i=2; int x=(int)sqrt(n); while(i<=x){ if(n%i==0) break; i++; } if(i>x) return 1; else return 0; }
2.int sum1(int n) { int p=1, s=0; for(int i=1; i<=n; i++){ p*=i; s+=p; } return s; }
(6)设有两个算法在同一机器上运行,其执行时 间分别为100n2和2n,要使前者快于后者,n至少要 多大? 分析: 要使前者快于后者,即前者的时间消耗低于 后者,即: 100n2<2n 求解上式,可得 答: n=15
(7)按增长率由小至大的顺序排列下列各函数:
第二部分
指出下列各算法的功能并求出其时间复杂度
第三部分
用C++函数描述算法并求出其时间复杂度
1.比较同一简单类型的两个数据x1和x2的大小,对于x1>x2, x1==x2和x1<x2这3种不同情况应分别返回“>”,“=”和“<”字符。 假定简单类型用SimpleType表示。 2.将一个字符串中的所有字符按相反的次序重新放置。 3.求一维double型数组a[n]中的所有元素之乘积。 4.计算
Fra Baidu bibliotek
相关文档
最新文档