数组与矩阵
1.数组:
数组是由n个相同类型的数据元素构成的有限序列,每个数据元素成为一个数组元素,每个元素受n个线性关系。
一维数组:(a0,a1,a2,...,an)
二维数组: [(a0,0 , a0,1 , a0,2),(a1,0 , a1,1 ,a1,2)...]
数组维度和维界不可变,除了初始化和销毁外,只有存储元素和修改元素的操作
存储结构为顺序存储,一维数组:
在储存空间上连续
二维数组优先存储次序
1.按行优先:先将每一行的所有列的数据元素存储完成,再储存下一行的数据元素
计算 ai,j 数据元素的位置:Loc(ai,j) = Loc(a0,0)+i*(n+1)*L+j*L (L为元素大小) 将ai,j之前之前所有行和列大小累加
2.按列优先:先将每一列的所有行的数据元素存储完成,再储存下一列的数据元素
计算 ai,j 数据元素的位置:Loc(ai,j) = Loc(a0,0)+j*(n+1)*L+i*L (L为元素大小) 将ai,j之前之前所有行和列大小累加
三维数组Am×s×t以按行优先进行存储,存储空间首地址Loc(a(0,0,0))=LOC(0,0,0),每个数组元素占L个存储单元,
ai,j,k数据元素的位置: Loc(ai,j,k) = LOC(0,0,0)+i*s*t*L+j*t*L+k*L
n维数组Ab1×b2×…×bn,其地址公式为:LOC(j1,j2,…,jn) = LOC(0,0,…,0)+j1*b2*…*bn*L+j2*b3*…*bn*L+…+jn-1*bn*L+jn*L
对n维数组,除需长为b1*b2*…*bn的连续空间存储数据元素外,还需记录数组的维数n和各维的维界bi,为提高存取效率,可将求址常量ci也保存下来,cn=1。
存储结构实现:
#define MAX_ARRAY_DIM 8 //定义最大维数
typedef struct{
ElemType *base; //保存数组元素存储空间首地址
int dim; //保存数组维数
int *bounds; //指向保存各维维界的存储空间
int *constants; //指向保存求址常量的存储空间
}Array;
矩阵的压缩存储
A = [ a11 a12 a13
a21 a22 a23
a31 a32 a33] 矩阵通常以二维数组的形式进行表示
矩阵的压缩存储:对具有多个值相同的数据元素只分配一个存储空间,对零元素不分配存储空间。
特殊矩阵:值具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或者零元素的分布有一定的规律性的矩阵。
特殊矩阵的压缩存储:
找出特殊矩阵中值相同的矩阵元素分布规律,把那些呈现规律性分别值、相同的多个矩阵元素压缩存储到一个存储空间。
对称矩阵:若对一个n阶方阵A[1...n][1...n]中任意元素ai,j都有ai,j=aj,i,则称其为对称矩阵。
矩阵中i<j部分为上三角区,i>j部分为下三角区 其中ai,j=aj,i i=j为主对角线
存放数量为B[n(n+1)/2]
按行优先 计算ai,j存数中的位置
数组下标 k = 1+2+...+(i-1)+j-1+1-1 ,其中1+2+...+(i-1)为之前行与列的求和,1-1为该行之前的元素
1. 求数组下标,k为位置需要+1
2.默认下标从0开始,需从零开始计算
数组下标k = i*(i-1)/2 + j-1 ; i>=j (下三角区) k = j*(j-1)/2 + i-1 ;i<j(上三角区)
三角矩阵若对一个n阶方阵A[1...n][1...n]中上(下)三角区元素均为同一常量,则称为下(上)三角矩阵。
下三角矩阵: 上三角矩阵:
存放数组数量:B[n(n+1)/2 + 1], 最后一位存放同一常量
下三角矩阵存放次序区别:
数组下标k = (i-1)*(2n+2-i)/2 + (j-1) ; i>=j ,其中 n+2-i 为i行元素个数,+n为第一行元素个数 ,j-1为当前行的元素
k = n(n+1)/2 ; i<j
对角矩阵:若对一个方阵(n*m)A中任意元素ai,j ,当|i-j|>1,有ai,j = 0 (1<=i , j<=n),则称为三角矩阵
将矩阵中的非零元按某种次序(行序、对角线顺序等)存储于一组地址连续的存储单元。
数组ai,j下标 k = 3(i-1)-1+j-i+1,其中(i-1)为行数,3(i-1)-1为数组下标,j-i+1为该元素之前元素个数
ai,j的下标:k = 2i+j-3
若已知k,求i,j? i = [(k+1)/3+1] ,其中(k+1)/3为之前行数 j = k-2i+3
稀疏阵
设在m×n矩阵中,有t个数据元素不为零。当s远远大于t时,称该矩阵为稀疏矩阵。
对稀疏矩阵进行压缩存储时,可只保存其中非零元,同时还需指明非零元所处的行列位置及总的行数、列数。
使用三元组进行存储
行标 列标 值
i j value
0 1 12
0 2 9
2 0 -3
2 5 14
3 2 24
4 1 18
5 2 -7
稀疏矩阵的特点: 节约空间,但是稀疏矩阵压缩丢失了随机存储特性。
稀疏矩阵定义:
#define MAXSIZE 1000//非零元最大个数
typedef struct{
int i; //行下标
int j; //列下标
ElemType e; //非零元值
}Triple; //三元组类型
三元组定义:
typedef struct {
Triple data[MAXSIZE];//三元组表
int m; //行数
int n; //列数
int t; //非零元个数
}TSMatrix;
将m行n列的矩阵M转置为矩阵T的经典算法为:
for(i=1;i<=m;++i)
for(j=1;j<=n;++j)
Tji=Mij;
算法的时间复杂度为O(m*n)。
操作步骤:
⑴交换矩阵行列数; ⑵交换每个三元组中的行列下标; ⑶重排三元组,使之按行序排列。
按T中三元组的次序依次在M中找到相应的三元组进行转置,即按M的列序进行转置。