数据结构习题整理集.docVIP

  • 88
  • 0
  • 约15.55万字
  • 约 183页
  • 2019-06-14 发布于江西
  • 举报
1.2 典型习题解析 [例1.1] 设n为正整数,分析一下程序段中各语句的频度。 for (i=0;in;i++) /*语句 eq \o\ac(○,1)*/ for (j=0;jn;j++) /*语句 eq \o\ac(○,2)*/ { C[i][j]=0; /*语句 eq \o\ac(○,3)*/ For (k=0;kn;k++) /*语句 eq \o\ac(○,4)*/ C[i][j]= C[i][j]+a[i][k]=b[k][j] ; /*语句 eq \o\ac(○,5)*/ } 解:语句 eq \o\ac(○,1)的频度为n+1(i从0到n+1,共计n次,当i=n时还要执行一次in的比较,记一次,故总共n+1次);语句 eq \o\ac(○,2)的频度i=0n-1n+1=n(n+1); 语句 eq \o\ac(○,3)的频度为i=0n-1j=0n-11=n2; 语句 eq \o\ac(○,4)的频度i=0n-1j=0n-1(n+1)=n3+n2; 语句 eq \o\ac(○,5)的频度为i=0n-1j=0n-1k=0n-11=n3 [例1.2] 分析一下算法的时间复杂度。 Void fun(int n) { Int i=0,j; do { for (j=0;jn;j++) i+=j; }while (in+1); } 解:该算法中的基本运算是i+=j语句,设for循环语句共执行k次。 K=1 时,i=j=0n-1j K=2 时,i=n(n-1)2+j=0n-1j=n(n-1)2+ K=3 时,i=2(n(n-1)2)+ j=0n-1j=2(n(n-1)2 因此,i=k(nn-12)n+1,即k( 而基本运算是i+=j语句,执行的次数=n*k≤2nn-1=o(1)。本算法的时间复杂度为o(1) [例1.3]设n为3的倍数,分析一下算法的时间复杂度。 void fun (int n) Int I , j , x , y; For (i=1;i=n;i++) If (3*i=n) for (j=3*I;j=n;j++) { x++;y=3*x+2; } } 解:该算法中的基本运算是x++和y=3*x+2语句。对于最外层的for循环?,其执行频度为n+1,但对于里层的for循环,只在3i≤n即i≤n3时才执行,故基本运算的执行频度为i=0n3j=3in1=i=1n3(n-3i+1)= [例1.4] 分析以下算法的时间复杂度。 Int fun(int m,int n) { If (m==0) return n; else if(n==0) else if(mn) return (fun(m,n-1)+1); else return (fun(m-1,n)+1); } 解:这是一个递归算法,其思路是对于输入的m和n中的较小者(不妨设为n),一直地推减1,直到为0,此时返回m,并回过来进行加1运算,这种地推和加1运算均为n次。因此,本算法的时间复杂度为o(min(m,n)), min(m,n)为两个数中最小者。 [例1.5] 分析以下算法的时间复杂度。 void fun(ElemType A[],int i,int j, ElemType,max, ElemTypemax) { Int mid; ElemType,gmax,gmin,hmax,hmin; If (i==j) { max=min=A[i]; Return; } if (i==j-1) { if (A[i] A[i]) { max=A[j];min=A[i];} else { max=A[i];min=A[j];} Return; } mid=(i+j)/2; fun(A,i,mid,gmax,gmin); fun(A,mid+1,j,hmax,hmin); max=(

文档评论(0)

1亿VIP精品文档

相关文档