1.已知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),求A[i][j]的地址。
LOC [(A[0][0]) + (n*i+j)k]
2.二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元并且A[0][0]的存储地址是200,求A[6][12]的地址。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 A[0]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 A[1]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 A[2]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 A[3]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 A[4]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 A[5]
0 1 2 3 4 5 6 7 8 9 10 11 12 ←←旁边这个就是A[6][12]
第一个零的地址是200,在它的基础上A[0][0]第一括号里每加1,地址就加20,第2个括号里加几,地址就加几,然后就得到A[6][12]的地址为332。
200 + (6*20+12)*1 = 332
3.二维数组A[10..20][5..10]采用行序为主方式存储,每个元素占4个存储单元,并且A[10][5]的存储地址是1000,求A[18][9]的地址。
- 不管按行还是按列,都是顺序存储。
按行存储,每行10-5+1共6个元素。A[10, 9]距离A[10, 5]之间相差4个元素;A[18, 9]与A[10, 9]相差8行,共8×6=48个元素;所以A[18, 9]与A[10, 5]相差4+48=52个元素,共52×4=208个存储单元;A[18, 9]的地址应该是1208。
2、算法:基地址 +(行标之差×每行元素个数+列标之差)× 元素所占存储单元
1000 +(8*6+4)* 4 = 1208
4.常对数组进行的两种基本操作有哪些?
查找和修改
5.稀疏矩阵一般的压缩存储方法有哪两种?
//在一个矩阵中,若非零元素的个数远远小于零元素的个数,且非零元素的分布没有规律,则称之为稀疏矩阵。
最常用的稀疏矩阵存储格式主要有:三元组(也叫COO(Coordinate Format))和十字链表。
对于稀疏矩阵,存储非零元素时必须同时存储其位置,所以用三元组来唯一确定矩阵A中的元素。矩阵三元组表的顺序存储结构称为三元组顺序存储,链式存储结构是十字链表。
三元组(i,j,a(i,j))很简单,就是使用3个数组,分别存储全部非零元的行下标(row index)、列下标(column index)和值(value)
typedef struct
{
int row; //行坐标
int col; //列坐标
int value; //该点的值
} item;
这种方式简单,但是记录信息多(每个三元组自己可以定位),因此空间不是最优。
十字链表(Orthogonal List)是有向图的一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储可以达到高效的存取效果。同时,代码的可读性也会得到提升。
6.一个n*n的对称矩阵,如果以行或列为主序放入内存,则其容量是多少?
n*(n+1)/2