目录
一、数组的定义
1.1概念
1.2抽象数据类型定义
二、数组的顺序存储
2.1一维数组元素的存储位置
2.2二维数组元素的存储位置
2.3三维数组元素的存储位置
三、特殊矩阵的压缩存储
3.1相关概念
3.2对称矩阵
3.3三角矩阵
3.4对角矩阵(带状矩阵)
3.5稀疏矩阵
一、数组的定义
1.1概念
数组是按一定格式排列起来的具有相同类型的数据元素的集合
·声明格式: 数据类型 变量名称[长度];
例:int num[5]={0,1,2,3,4};
1.2抽象数据类型定义
ADT Array{
数据对象:j(i)=0,... b(i)-1, i=1,2,.....,n
D={a(j1j2....j(n)) | a(j1j2.....j(n)) ∈ElemSet}
数据关系:R1={<a(j1...j(i)...j(n),a(j1...j(i+1)...j(n))> | 0<=j(k)<=b(k)-1,1<=k<=n,且k≠i,0<=j(i)<=b(k)-2, a(j1...j(i)...j(n)), a(j1...j(i+1)...j(n) ∈D,i=2,...,n}
基本操作:
①InitArray(&A,n,bound1,...boundn) //构造数组A
②DestroyArray(&A) //销毁数组A
③Value(A,&e,index1,...,indexn) //取数组元素值
④Assign(A,&e,index1,...indexn) //给数组元素赋值
}ADT Array
二、数组的顺序存储
2.1一维数组元素的存储位置
LOC(i)=LOC(0)=a,i=0;
LOC(i)=LOC(i-1)+L=a+i*L,i>0
例:每个元素占4字节,假设a[0]存储在2000单元,则a[3]地址为:2000+3*4=2012单元
2.2二维数组元素的存储位置
我们先来讨论一下二维数组的存储方式:
①以行序为主序
②以列序为主序
二维数组元素的存储位置:(行优先的顺序存储)
a[i][j]的存储位置:LOC(i,j)=LOC(0,0)+(n*i+j)*L
(n*i+j)表示在a[i][j]前面所有元素个数
例:
2.3三维数组元素的存储位置
我们一样先讨论三位数组的存储方式:
三位数组元素的存储位置
三、特殊矩阵的压缩存储
3.1相关概念
①什么是压缩存储:
为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。
②什么样的矩阵能够压缩:
对称矩阵、对角矩阵、三角矩阵、稀疏矩阵
③什么叫稀疏矩阵:
矩阵中非零元素的个数较少(一般少于 5%)
3.2对称矩阵
①特点:a(ij)=a(ji)
②存储方法:只存储下(或者上)三角(包括主对角线)的数据元素,共占用n(n+1)/2个元素空间。
③存储结构:可以以行序为主序将元素存放在一个一维数组sa[n(n+1)/2]中
例:以行序为主序存储下三角
k表示元素a(ij)前面有几个元素个数
k=1+2+3+4+...+(i-1)+(j-1) (i-1表示a(ij)前面有i-1行,j-1表示在a(ij)本行前面有几个元素)
以a(n1)为例:k=1+2+3+...+(n-1)+(1-1)=n(n-1)/2
3.3三角矩阵
①特点:对角线以下(或者以上)的数据元素(不包括对角线)全部为常数c
②存储方法:重复元素c共享一个元素存储空间,共占用n(n+1)/2+1个元素(1表示常数c的存储空间)
③存储结构:将元素存放在一个一维数组sa[n(n+1)/2+1]中
·对于上三角矩阵:
·对于下三角矩阵:
k一样表示a(ij)元素前面的元素个数
3.4对角矩阵(带状矩阵)
①特点:在n×n方阵中所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0
常见的有三对角矩阵、五对角矩阵、七对角矩阵等
②存储方法:以对角线的顺序存储
3.5稀疏矩阵
①特点:非零元较零元少,且分布没有规律。
②存储方法:三元组法、十字链表
③存储结构:顺序存储、链式存储
·三元组顺序表法
(i,j,a(ij)) (行数,列数,元素值)+(总行数,总列数,非零元素总个数)
三元组法的优点:便于进行依行顺序处理的矩阵运算;缺点:不能随机存取。
改进:稀疏矩阵的链式存储结构——十字链表
优点:能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素
·十字链表
矩阵的每一个非零元素用一个结点表示,该结点除了(row,col,value)以外,还要有right、down两个域。(right连接同一行中的下一个非零元素,down连接同一列中的下一个非零元素)
结构示意图:
例:
引入头指针:指向行或列中的第一个非零元素