收藏 分享(赏)

数据结构预算法 习题解答第3章.pdf

上传人:精品资料 文档编号:10554247 上传时间:2019-11-28 格式:PDF 页数:8 大小:3.78MB
下载 相关 举报
数据结构预算法 习题解答第3章.pdf_第1页
第1页 / 共8页
数据结构预算法 习题解答第3章.pdf_第2页
第2页 / 共8页
数据结构预算法 习题解答第3章.pdf_第3页
第3页 / 共8页
数据结构预算法 习题解答第3章.pdf_第4页
第4页 / 共8页
数据结构预算法 习题解答第3章.pdf_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、第3章 线性结构的扩展 1.选择题 (1)C (2)B (3)A (4)DAC (5)CDB (6)C 2.判断题 (1) (2) (3) (4) (5) (6) (7) 3.简答题 1KMP算法较朴素的模式匹配算法有哪些改进? KMP 算法主要优点是主串指针不回溯。当主串很大不能一次读入内存且经常发生部分匹配时,KMP算法的优点更为突出。 2设字符串S=aabaabaabaac,P=aabaac。 (1)给出S和P的next值和nextval值; (2)若S作主串,P作模式串,试给出利用KMP算法的匹配过程。 【解答】 (1)S的next与nextval值分别为012123456789和00

2、2002002009,p的next与nextval值分别为012123和002003。 (2)利用BF算法的匹配过程: 利用KMP算法的匹配过程: 第一趟匹配:aabaabaabaac 第一趟匹配:aabaabaabaac aabaac(i=6,j=6) aabaac(i=6,j=6) 第二趟匹配:aabaabaabaac 第二趟匹配:aabaabaabaac aa(i=3,j=2) (aa)baac 第三趟匹配:aabaabaabaac 第三趟匹配:aabaabaabaac a(i=3,j=1) (成功) (aa)baac 第四趟匹配:aabaabaabaac aabaac(i=9,j=6)

3、 第五趟匹配:aabaabaabaac aa(i=6,j=2) 第六趟匹配:aabaabaabaac a(i=6,j=1) 第七趟匹配:aabaabaabaac (成功) aabaac(i=13,j=7) 3假设按行优先存储整数数组A9358时,第一个元素的字节地址是100,每个整数占个字节。问下列元素的存储地址是什么? (1) a0000 (2)a1111 (3)a3125 (4)a8247 【解答】(1) LOC( a0000)= 100 (2) LOC( a1111)=100+(3*5*8*1+5*8*1+8*1+1)*4=776 (3) LOC( a3125)=100+(3*5*8*3

4、+5*8*1+8*2+5) *4=1784 (4) LOC( a8247)= 100+(3*5*8*8+5*8*2+8*4+7) *4=4816 4假设一个准对角矩阵: 按以下方式存储于一维数组B4m中(m为一个整数): 0 1 2 3 4 5 6 k 4m-1 4m a 11 a 12 a21 a22 a33 a34 a43 aij a2m-1,2m a2m,2m-1 a2m,2m 写出下标转换函数k=f(i,j)。 【解答】 由题目可知,每一行有两个非0元素。 当i为奇数时,第i行的元素为:ai,i、ai,(i+1),此时k=2*(i-1)+j-i=i+j-2 当i为偶数时,第i行的元素为

5、:ai,(i-1)、ai,i,此时k=2*(i-1)+j-I+1=i+j-1 综上所述,k=i+j-i%2-1。 5设有nn的带宽为3的带状矩阵A,将其3条对角线上的元素存于数组B3n中,使得元素Buv=aij,试推导出从(i,j)到 (u,v)的下标变换公式。 【解答】 u=j-i+1 v=j-1 6现有如下的稀疏矩阵A(如图所示),要求画出以下各种表示方法。 (1)三元组表表示法 (2)十字链表法。 【解答】 (1)三元组表表示法: i j v 1 2 3 4 1 4 22 1 6 -15 2 2 13 2 3 3 a11 a12 a21 a22 a33 a34 a43 a44 . aij

6、 a2m-1,2m-1 a2m-1,2m a2m,2m-1 a2m,2m 0 0 0 22 0 -15 0 13 3 0 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 91 0 0 0 0 0 0 0 28 0 0 0 5 6 7 3 4 -6 5 1 91 6 3 28 (2)十字链表法: 7画出下列广义表的头尾表示存储结构示意图。 (1)A=(a,b,c),d,(a,b,c) (2)B=(a,(b,(c,d),e),f) (1) (2) 1 1 1 1 1 1 1 d 0 a 1 b 1 c 1 1 1 1 1 1 0 f 0 a 0 b 0 c 1 1 0 c 0 d 0 1

7、 2 3 4 5 0 1 2 3 4 5 5 1 91 2 3 3 3 4 -6 1 4 22 6 3 28 1 6 -15 2 2 13 2.算法设计题 1利用C的库函数strlen,strcpy和strcat写一个算法void StrInsert(char *S,char *T,int i) ,将串T插入到S的第i个位置上。若i大于S的长度,则插入不执行。 void strinsert(char *S,char *t, int i) if(istrlen(S) printf(“error”); strcopy(S+i,r); Si=0; strcat(S,T); strcat(S,r);

8、2利用C的库函数strlen,strcpy(或strncpy)写一个算法void StrDelete(char *S,int i,int m) ,删除串S中从位置i开始的连续的m个字符。若istrlen(S),则没有字符被删除;若i+mstrlen(S),则将S中从位置i开始直至末尾的字符均被删去。 void StrDelete(char *S, int m) if(i=strlen(S) return; if(i+m=strlen(S) Si=0; else for(k=i+m;Sk!=0;k+) Sk-m=Sk; Sk=0; 3采用顺序结构存储串,编写一个函数,求串s和串t的一个最长的公共

9、子串。 void maxsubstr(SeqString*s, SeqString *t, SeqString *r) /*求S和T的最长公共子串*/ int i,j,k,num,maxnum=0,index=0; i=0; while(icurlen) j=0; while(jcurlen) if(s-datai=t-dataj) num=1; for(k=1;s-datai+k=t-dataj+k;k+) num=num+1; if(nummaxnum) index=i; maxnum=num; j+=num; i=0; else j+; i+; for(i=index,j=0;idata

10、j=s-datai; 4采用顺序存储结构存储串,编写一个函数,计算一个子串在一个字符串中出现的次数,如果该子串不出现,则次数为0。 int count(SeqStirng *s,SeqString *t) int i=0,c=0,j; while (imu=A-mu; C-nu=A-nu; C-tu=0; pa=1 ; pb=1 ; pc=1; while (patu C-datapc.j=A-datapc.j; C-datapc.v=A-datapa.v + B-datapb.v; C-tu+ ;pc+ ; pa+ ; pb+ ; else if (A-datapa.i datapb.i)|

11、(A-datapa.i=B-datapb.i C-datapc.j=A-datapa.j; C-datapc.v=A-datapa.v; C-tu+ ; pc+ ;pa+; else C-datapc.i=B-datapb.i; C-datapc.j=B-datapb.j; C-datapc.v=B-datapb.v; C-tu+; pc+; pb+; while( patu ) /* A中有剩余元素时*/ C-datapc.i=A-datapa.i ; C-datapc.j=A-datapa.j ; C-datapc.v=A-datapa.v ; pc+; pa+; while ( pbtu

12、 ) /*B中有剩余元素时*/ C-datapc.i=B-datapb.i; C-datapc.j=B-datapb.j; C-datapc.v=B-datapb.v; pc+; pb+; return(c); 6假设稀疏矩阵A和B(分别为m*n和n*1矩阵)采用三元组表存储,编写一个算法计算C=A*B,要求C也是采用稀疏矩阵的三元组表存储。 SPMatrix * Matrix_Mul (SPMatrix *A, SPMatrix *B) /*稀疏矩阵A(m1 n1)和B(m2 n2) 用三元组表存储,求AB */ SPMatrix *C; /*乘积矩阵的指针*/ int p,q,i,j,k,

13、r; datatype tempn+1; int numBmu+1, rpotBmu+1; if(Anu!=Bmu) return NULL; /*A的列与B的行不相等*/ C=malloc(sizeof(SPMatrix); /*申请C矩阵的存储空间*/ Cmu=Amu; Cnu=Bnu; if(Atu*Btu=0) Ctu=0; return C; for(i=1;imu;i+) numi=0; /*求矩阵B中每一行非零元素的个数*/ for (k=1;ktu;k+) i=Bdatak.i; numi+; rpot1=1; /*求矩阵B中每一行第一个非零元素在B.data中的位置*/ fo

14、r (i=2;imu;i+) rpoti=rpoti-1+numi-1; r=0; /*当前C中非零元素的个数*/ p=1; /*指示A.data中当前非零元素的位置*/ for(i=1;imu;i+) for(j=1;jnu;j+) tempj=0; /*cij的累加器初始化*/ while(Adatap.i=i ) /*求第i行的*/ k=Adatap.j; /*A中当前非零元的列号*/ if(kmu) t=rpotk+1; else t=Btu+1; /*确定B中第k行的非零元素在B.data中的下限位置*/ for (q=rpotk; qdataq.j; tempj+=Adatap.v

15、 * Bdataq.v; p+; for(j=1;jnu;j+) if(tempj) r+; C-datar=i,j,tempj; Ctu=r; return C; 7假设稀疏矩阵只存放其非 0 元素的行号、列号和数值,以一维数组顺次存放,以行号为-1 作为结束标志。例如如下图所示的稀疏矩阵M: 则存在一维数组D中: D0=1, D1=1,D2=1,D3=1,D4=5 D5=10,D6=3,D7=9,D8=5,D9= -1 现有两个如上方法存储的稀疏矩阵A和B,它们均为m行n列,分别存放在数组A和B中,编写求矩阵加法C=A+B的算法,C亦放在数组C中。 【提示】注意当A、B中元素的行和列都相同

16、时才能相加。 void add (int A,int B,int C) pa=0; pb=0; pc=0; while(Apa+2 Cpc+1=Apc+1; Cpc+2=Apa+2+Bpb+2 ; pa+=3; pb+=3; pc+=3; else if(ApaBpb|(Apa=Bpb Cpc+1=Apc+1; Cpc+2=Apc+2; pa+=3; pc+=3; 1 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 M = elseCpc=Bpb; Cpc+1=Bp

17、b+1; Cpc+2=Bpb+2; pb+=3; pc+=3; while (Apa+2!=0) /*A中有剩余元素*/ Cpc=Apa; Cpc+1=Apa+1; Cpc+2=Apc+2; pa+=3; pc+=3; while (Bpa+2!=0) /*B中有剩余元素*/ Cpc=Bpb; Cpc+1=Bpb+1; Cpc+2=Bpb+2; pb+=3; pc+=3; 8已知A和B为两个n*n阶的对称矩阵,输入时,对称矩阵只输入下三角形元素,按压缩存储方法存入一维数组A和B中,编写一个计算对称矩阵A和B的乘积的算法。 【提示】注意对对称矩阵采用压缩存储时,元素的表示方法;乘积矩阵仍然采用压

18、缩存储的方法。 void Mul (int A, int B, int C, int n) /*计算A和B的乘积C,其中A、B、C均为压缩存储的n阶对称矩阵*/ for(i=0;in;i+) for(j=0;jn;j+) mi=max(i,j); mj=min(i,j); x=mi*(mi-1)/2 + mj-1; /*计算矩阵元素Cij压缩后的存放地址*/ Cx=0; for (k=0; kn; k+) u1=max(i,k) ; vi=min(i,k); u2=max(k,j) ; v2=min(k,j); w1=u1*(u1-1)/2 +v1-1; /*计算Aik的存放地址*/ w2=u2*(u2-1)/2 +v2-1; /*计算Bkj的存放地址*/ Cx+=Aw1*Bw2;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报