严蔚敏视频 笔记13
第五章 数组和广义表
5.1 数组的类型定义
多维数组
ADT Array {
数据对象:
D={aj1j2…jn|n>0称为数组的维数,bi是数组第i维的长度,ji是数组元素的第i维下标,aj1j2…jn∈ElemSet}
数据关系:
R={R1,R2,…,Rn}
Ri={<aj1…ji…jn,aj1…ji+1…jn>|
0<=jk<=bk-1,1<=k<=n,
且k<>i,0<=ji<=bi-2,
aj1…ji…jn,aj1…ji+1…jn∈D,
i=2,3…n}
基本操作:
InitArray(&A,n,bound1,…,boundn) 构造
DestroyArray(&A) 销毁
Value(A,&e,index1,…indexn) 取值
Assign(&A,e,index1,…indexn) 赋值
}
5.2 数组的顺序表示和实现
类型特点:
1)只有引用型操作,没有加工型操作
2)数组是多维的结构而存储空间是一个一维的结构
有两种顺序映象的方式:
行序为主序(低下标优先)
列序为主序(高下标优先)
LOC[j1,j2,…jn]=LOC[0,0,…0]+Σciji
其中cn=L,ci-1=bi*ci,1<i<=n
基地址
n维数组的映象函数
数组元素的存储位置是其下标的线性函数
5.3 稀疏矩阵的压缩存储
假设m行n列的矩阵含t个非零元素,则称
δ=t/(m*n) 为稀疏因子
δ<=0.05的矩阵为稀疏矩阵
用二维数组表示出现的问题:
1)零值元素占空间很大
2)运算中进行了很多零值的运算
解决问题的原则:
1)尽可能少存或不存零值元素
2)尽可能减少没有实际意义的运算
3)运算方便:
能尽可能快的找到与下标(i,j)对应的元素
能尽可能快的找到同一行或同一列的非零值元素
1)特殊矩阵的压缩存储
例如:三角矩阵、对角矩阵
2)随机稀疏矩阵的压缩存储
非零元分布不规则
一、三元组顺序表
#define MAXSIZE 12500
typedef struct {
int i,j; // 该非零元的行下标和列下标
ElemType e;
} Triple;
typedef union {
Triple data[MAXSIZE+1];
int mu,nu,tu; // 行数、列数、非零元的个数
} TSMatrix;
从第一个下标开始
求转置矩阵的操作:
用常规的二维数组表示的算法:
for(col=1;col<=nu;++col)
for(row=1;row<=mu;++row)
T[col][row]=M[row][col];
时间复杂度:O(mu*nu)
如何实现一次到位?