15 KiB
第5章 数组与广义表
一、基础知识题
5.1 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址,已知A的起始存储位置(基地址)为1000,计算:
(1) 数组A的体积(即存储量);
(2) 数组A的最后一个元素a57的第一个字节的地址;
(3) 按行存储时,元素a14的第一个字节的地址;
(4) 按列存储时,元素a47的第一个字节的地址。
(1)V = 6×8×6 = 288 Byte
(2)Loc(5,7) = 1000+(6×8-1)×6 = 1282
(3)Loc(1,4)(行) = 1000+(1×8+4)×6 = 1072
(4)Loc(4,7)(列) = 1000+(6×7+4)×6 = 1276
5.2 假设按低下标优先存储整数数组A9×3×5×8时,第一个元素的字节地址是100,每个整数占四个字节。问下列元素的存储地址是什么?
(1) a0000
(2) a1111
(3) a3125
(4) a8247
(1)Loc(0,0,0,0) = 100
(2)Loc(1,1,1,1) = 100+(1×3×5×8+1×5×8+1×8+1)×4 = 776
(3)Loc(3,1,2,5) = 100+(3×3×5×8+1×5×8+2×8+5)×4 = 1784
(4)Loc(8,2,4,7) = 100+(8×3×5×8+2×5×8+4×8+7)×4 = 4416
5.3 按高下标优先存储方式(以最右的下标为主序),顺序列出数组A2×2×3×3中所有元素aijkl,为了简化表达,可以只列出(i,j,k,l)的序列。
(0,0,0,0) (1,0,0,0) (0,1,0,0) (1,1,0,0)
(0,0,1,0) (1,0,1,0) (0,1,1,0) (1,1,1,0)
(0,0,2,0) (1,0,2,0) (0,1,2,0) (1,1,2,0)(0,0,0,1) (1,0,0,1) (0,1,0,1) (1,1,0,1)
(0,0,1,1) (1,0,1,1) (0,1,1,1) (1,1,1,1)
(0,0,2,1) (1,0,2,1) (0,1,2,1) (1,1,2,1)(0,0,0,2) (1,0,0,2) (0,1,0,2) (1,1,0,2)
(0,0,1,2) (1,0,1,2) (0,1,1,2) (1,1,1,2)
(0,0,2,2) (1,0,2,2) (0,1,2,2) (1,1,2,2)思路:
5.4 将教科书5.3.1节中的式(5-3)改写为一个等式的形式。
5.5 设有上三角矩阵(aij)n×n,将其上三角元素逐行存于数组B[m]中(m充分大),使得B[k]=aij,且k=f1(i)+f2(j)+c。试推导出函数f1,f2和常数c(要求f1和f2中不含常数项)。
5.6 设有三对角矩阵(aij)n×n,将其三条对角线上的元素存于数组B[3][n]中,使得元素B[u][v]=aij,试推导出从(i,j)到(u,v)的下标变换公式。
5.7 设有三对角矩阵(aij)n×n,将其三条对角线上的元素逐行地存于数组B[3n-2]中,使得B[k]=aij,求:
(1) 用i,j表示k的下标变换公式;
(2) 用k表示i,j的下标变换公式。
(1)
(2) i = (k+1)/3 + 1, (0≤k≤3n-1); j = k+3-2i = k+1-2[(k+1)/3].
5.8 假设一个准对角矩阵
按以下方式存于一维数组B[4m]中:
写出由一对下标(i,j)求k的转换公式。
k = 2i - j%2 - 1.
思路:
5.9 已知A为稀疏矩阵,试从空间和时间角度比较采用两种不同的存储结构(二维数组和三元组表)完成求运算
的优缺点。
(1)空间与时间复杂度分析:
用二维数组存储时,空间与时间复杂度均为O(n×n);设非零元个数为t,则用三元组存储时,空间与时间复杂度为O(t)。
(2)优缺点分析:
当非零元个数t<<n×n时,用二维数组存储矩阵对空间和时间的开支都是很大的,而用三元组存储矩阵则可节省不少空间和操作时间。但是当t与n2等数量级时,O(t)与O(n×n)几乎相等,此时三元组的优势就不明显了,反倒是用二维数组存储矩阵更简明直观。
5.10 求下列广义表操作的结果:
(1) GetHead【(p, h, w)】;
(2) GetTail【(b, k, p, h)】;
(3) GetHead【((a, b), (c, d))】;
(4) GetTail【((a, b), (c, d))】;
(5) GetHead【GetTail【((a, b), (c, d))】】;
(6) GetTail【GetHead【((a, b), (c, d))】】;
(7) GetHead【GetTail【GetHead【((a, b), (c, d))】】】;
(8) GetTail【GetHead【GetTail【((a, b), (c, d))】】】.
注意:【】是函数的符号。
(1) = p
(2) = (k, p, h)
(3) = (a, b)
(4) = ((c, d))
(5) = GetHead【((c, d))】=(c, d)
(6) = GetTail【(a, b)】=(b)
(7) = GetHead【GetTail【(a, b)】】=GetHead【(b)】=b
(8) = GetTail【GetHead【((c, d))】】=GetTail【(c, d)】=(d)
5.11 利用广义表的GetHead和GetTail操作写出如上题的函数表达式,把原子banana分别从下列广义表中分离出来。
(1) L1 = (apple, pear, banana, orange);
(2) L2 = ((apple, pear), (banana, orange));
(3) L3 = (((apple), (pear), (banana), (orange)));
(4) L4 = (apple, (pear), ((banana)), (((orange))));
(5) L5 = ((((apple))), ((pear)), (banana), orange);
(6) L6 = ((((apple), pear), banana), orange);
(7) L7 = (apple, (pear, (banana), orange));
(1) GetHead【GetTail【GetTail【L1】】】
(2) GetHead【GetHead【GetTail【L2】】】
(3) GetHead【GetHead【GetTail【GetTail【GetHead【L3】】】】】
(4) GetHead【GetHead【GetHead【GetTail【GetTail【L4】】】】】
(5) GetHead【GetHead【GetTail【GetTail【L5】】】】
(6) GetHead【GetTail【GetHead【L6】】】
(7) GetHead【GetHead【GetTail【GetHead【GetTail【L7】】】】】
5.12 按教科书5.5节中图5.8所示结点结构,画出下列广义表的存储结构图,并求它的深度。
(1) ((()),a,((b,c),(),d),(((e))))
(2) ((((a),b)),(((),(d)),(e,f)))
(1) deep = 4.
(2) deep = 4.
5.13 已知以下各图为广义表的存储结构图,其结点结构和5.12题相同。写出各图表示的广义表。
广义表:((x,(y)),(((())),(),(z)))
广义表:(((a,b,()),()),(a,(b)),())
5.14 已知等差数列的第一项为a1,公差为d,试写出该数列前n项的和S(n)(n≥1)的递归定义。
5.15 写出求给定集合的幂集的递归定义。
(1) 幂集递归定义的文字表述:(假设集合A中并无重复元素)
① 若A为Ø,则其幂集B为{Ø}。
② 若A不为Ø。取出A中第一个元素记作a,求取A{a}的幂集C。对于C中的每个元素x{此处元素必为集合},求集合{a}与集合x的并集,并将求得的各个并集暂时存放到集合D(D初始化为空集)中。最后,求取C与D的并集即可得到A的幂集B。标记求取集合A的幂集的函数为P【A】,获取集合A的元素的函数为I【A】,加号“+”代表取并集,箭头“←”代表将右边的元素添加到左边的集合中,则求幂集的过程可简化为三步:
❶ C = P【A{a}】;
❷ ∑(D←(I【C】+{a}));
❸ B = C + D。例:集合 A={a,b,c} 的幂集为:B={Ø,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}
求取过程:(递归)
⒈ P【Ø】 = {Ø};
⒉ P【{c}】:❶ C = P【{c}{c}】 = P【Ø】 = {Ø};
❷ ∑(D←(I【C】+{c})) (C中有1个元素,故需累计添加1次元素到D)
Ⅰ. D←(Ø+{c})= D←{c},此时:D={{c}}
❸ B = C + D = {Ø,{c}},即P【{c}】 = {Ø,{c}}。
⒊ P【{b,c}】:
❶ C = P【{b,c}{b}】 = P【{c}】 = {Ø,{c}};
❷ ∑(D←(I【C】+{b})) (C中有2个元素,故需累计添加2次元素到D)
Ⅰ. D←(Ø+{b})= D←{b},此时:D={{b}}
Ⅱ. D←({c}+{b})= D←{b,c},此时:D={{b},{b,c}}❸ B = C + D = {Ø,{b},{c},{b,c}},即P【{b,c}】 = {Ø,{b},{c},{b,c}}。
⒋ P【{a,b,c}】:
❶ C = P【{a,b,c}{a}】 = P【{b,c}】 = {Ø,{b},{c},{b,c}};
❷ ∑(D←(I【C】+{a})) (C中有4个元素,故需累计添加4次元素到D)
Ⅰ.D←(Ø+{a}) = D←{a},此时:D={{a}}
Ⅱ.D←({b}+{a}) = D←{a,b},此时:D={{a},{a,b}}
Ⅲ.D←({c}+{a}) = D←{a,c},此时:D={{a},{a,b},{a,c}}
Ⅳ.D←({b,c}+{a}) = D←{a,b,c},此时:D={{a},{a,b},{a,c},{a,b,c}}❸ B = C + D = {Ø,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}
即P【{a,b,c}】 = {Ø,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}。





















