1、1第 45 章 串和数组 自测卷答案 姓名 班级 题号 一 二 三 四 五 总分题分 20 15 20 15 30 100得分一、填空题(每空 1 分,共 20 分)1. 不包含任何字符(长度为 0)的串 称为空串; 由一个或多个空格(仅由空格符)组成的串 称为空白串。(对应严题集 4.1,简答题:简述空串和空格串的区别)2. 设 S=“A;/document/Mary.doc”,则 strlen(s)= 20 , “/”的字符定位的位置为 3 。4. 子串的定位运算称为串的模式匹配; 被匹配的主串 称为目标串, 子串 称为模式。5. 设目标 T=”abccdcdccbaa”,模式 P=“cd
2、cc”,则第 6 次匹配成功。6. 若 n 为主串长,m 为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为 (n-m+1)*m 。7. 假设有二维数组 A68,每个元素用相邻的 6 个字节存储,存储器按字节编址。已知 A 的起始存储位置(基地址)为 1000,则数组 A 的体积(存储量)为 288 B ;末尾元素 A57 的第一个字节地址为 1282 ;若按行存储时,元素 A14 的第一个字节地址为 (8+4)6+1000=1072 ;若按列存储时,元素 A47 的第一个字节地址为 (674)61000)1276 。(注:数组是从 0 行 0 列还是从 1 行 1 列计算
3、起呢?由末单元为 A57 可知,是从 0 行 0 列开始!)8. 00 年计算机系考研题设数组 a160, 170的基地址为 2048,每个元素占 2 个存储单元,若以列序为主序顺序存储,则元素 a32,58的存储地址为 8950 。答:不考虑 0 行 0 列,利用列优先公式: LOC(aij)=LOC(ac1,c2)+(j-c2)*(d1-c1+1)+i-c1)*L得:LOC(a 32,58)=2048+(58-1)*(60-1+1)+32-1*289509. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。10.求
4、下列广义表操作的结果:(1) GetHead【(a,b),(c,d)】= (a, b) ; /头元素不必加括号(2) GetHead【GetTail【(a,b),(c,d)】 】= (c,d) ;(3) GetHead【GetTail【GetHead【(a,b),(c,d) 】 】 】= b ;(4) GetTail【GetHead 【GetTail【(a,b),(c,d)】 】 】= (d) ;二、单选题(每小题 1 分,共 15 分)( B )1. 李串是一种特殊的线性表,其特殊性体现在:可以顺序存储 数据元素是一个字符 可以链式存储 数据元素可以是多个字符2( B )2. 李设有两个串
5、p 和 q,求 q 在 p 中首次出现的位置的运算称作:连接 模式匹配 求子串 求串长( D )3. 李设串 s1=ABCDEFG,s2=PQRST ,函数 con(x,y)返回 x 和 y 串的连接串,subs(s, i, j)返回串 s 的从序号 i 开始的 j 个字符组成的子串,len(s)返回串 s 的长度,则 con(subs(s1, 2, len(s2), subs(s1, len(s2), 2)的结果串是:BCDEF BCDEFG BCPQRST BCDEFEF解:con(x,y)返回 x 和 y 串的连接串,即 con(x,y)ABCDEFGPQRST ;subs(s, i,
6、j)返回串 s 的从序号 i 开始的 j 个字符组成的子串,则subs(s1, 2, len(s2)subs(s1, 2, 5)= BCDEF; subs(s1, len(s2), 2)subs(s1, 5, 2)= EF;所以 con(subs(s1, 2, len(s2), subs(s1, len(s2), 2)con( BCDEF, EF)之连接,即 BCDEFEF( A )4. 01 年计算机系考研题 假设有 60 行 70 列的二维数组 a160, 170以列序为主序顺序存储,其基地址为 10000,每个元素占 2 个存储单元,那么第 32 行第 58 列的元素 a32,58的存储
7、地址为 。 (无第 0 行第 0 列元素)16902 16904 14454 答案 A, B, C 均不对答:此题与填空题第 8 小题相似。 (57 列60 行31 行)2 字节10000=16902( B )5. 设矩阵 A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组 B 1, n(n-1)/2 中,对下三角部分中任一元素 ai,j(ij), 在一维数组 B 中下标 k 的值是:i(i-1)/2+j-1 i(i-1)/2+j i(i+1)/2+j-1 i(i+1)/2+j再问,若 A 第一个元素为 A00,而 B1,n(n-1)/2,则 Aij 在一维数组
8、 B 中下标 k 的值是?若 A 第一个元素为 A00,而 B0,n(n-1)/2-1,则 Aij 在一维数组 B 中下标 k 的值是?6. 【91 初程 P78】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。有一个二维数组 A,行下标的范围是 0 到 8,列下标的范围是 1 到 5,每个数组元素用相邻的 4 个字节存储。存储器按字节编址。假设存储数组元素 A0,1的第一个字节的地址是 0。存储数组 A 的最后一个元素的第一个字节的地址是 A 。若按行存储,则 A3,5和 A5,3的第一个字节的地址分别是 B 和 C 。若按列存储,则 A7,1和
9、A2,4的第一个字节的地址分别是 D 和 E 。供选择的答案:AE:28 44 76 92 108 116 132 176 184 188答案:ABCDE= 8, 3, 5, 1, 67.【94 程 P12】 有一个二维数组 A,行下标的范围是 1 到 6,列下标的范围是 0 到 7,每个数组元素用相邻的 6 个字节存储,存储器按字节编址。那么,这个数组的体积是 A 个字节。假设存储数组元素A1,0的第一个字节的地址是 0,则存储数组 A 的最后一个元素的第一个字节的地址是 B 。若按行存储,则 A2,4的第一个字节的地址是 C 。若按列存储,则 A5,7的第一个字节的地址是 D 。供选择的答
10、案解:注意 B 的下标要求从 1 开始。先用第一个元素去套用,可能有 B 和 C;再用第二个元素去套用 B 和 C,B=2 而 C3(不符);所以选 BnnaaA,2,1,2,1,3AD:12 66 72 96 114 120 156 234 276 282 (11)283 (12)288答案:ABCD=12, 10, 3, 9三、简答题(每小题 5 分,共 15 分)1. 【其他教材】已知二维数组 Am,m 采用按行优先顺序存放,每个元素占 K 个存储单元,并且第一个元素的存储地址为 Loc(a11),请写出求 Loc(aij)的计算公式。如果采用列优先顺序存放呢?解:公式教材已给出,此处虽
11、是方阵,但行列公式仍不相同;按行存储的元素地址公式是: Loc(aij)= Loc(a11) + (i-1)*m+(j-1) * K按列存储的元素地址公式是: Loc(aij)= Loc(a11) + (j-1)*m+(i-1) * K2.【全国专升本资格考试】递归算法比非递归算法花费更多的时间,对吗?为什么?答:不一定。时间复杂度与样本个数 n 有关,是指最深层的执行语句耗费时间,而递归算法与非递归算法在最深层的语句执行上是没有区别的,循环的次数也没有太大差异。仅仅是确定循环是否继续的方式不同,递归用栈隐含循环次数,非递归用循环变量来显示循环次数而已。四、计算题(每题 5 分,共 20 分)
12、1. 设 s=I AM A STUDENT, t=GOOD, q=WORKER, 求 Replace(s,STUDENT,q) 和Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)。解: Replace(s,STUDENT,q) I AM A WORKER 因为 SubString(s,6,2)A ;SubString(s,7,8) STUDENTConcat(t,SubString(s,7,8)GOOD STUDENT所以 Concat(SubString(s,6,2), Concat(t,SubString(s,7,8) A GOOD ST
13、UDENT2. (P60 4-18 )用三元组表表示下列稀疏矩阵:2056038)1( 035092)(解:参见填空题 4. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。 (设行,列下标从 1 计算)所以(1)可列表为: (2)可列表为:8 8 53 2 33 6 85 4 67 8 58 1 26 6 41 6 -22 5 94 3 56 5 34若行、列下标从 0 开始计算?3. (P60 4-19 )下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。 (行、列下标从 1 计算)163541264)(
14、73465829154)(解:(1)为 64 矩阵,非零元素有 6 个。 (2)为 45 矩阵,非零元素有 5 个五、算法设计题(每题 10 分,共 30 分)1. 【严题集 4.12】 编写一个实现串的置换操作 Replace(/将串 S 中所有子串 T 替换为 V,并返回置换次数 for(n=0,i=1;iA6,A6-A12,A12-A3,A3-A9,A9-A0. /已“顺便”移动了 A6、A12 第二条链:A1-A7,A7-A13,A13-A4,A4-A10,A10-A1. 第三条链:A2-A8,A8-A14,A14-A5,A5-A11,A11-A2. 恰好使所有元素都右移一次. 虽然未经数学证明,但作者相信上述规律应该是正确的. 程序如下(C 程序参考,请转换为 C+):void RSh(int An,int k)/把数组 A 的元素循环右移 k 位,只用一个辅助存储空间 for(i=1;i=k;i+) if(n%i=0/求 n 和 k 的最大公约数 p for(i=0;ip;i+) j=i;l=(i+k)%n;temp=Ai; while(l!=i) Aj=temp; temp=Al; Al=Aj; j=l;l=(j+k)%n; / 循环右移一步 Ai=temp; /for/RSh