1、内容提要,2.1 数组的定义2.2 数组的顺序表示与实现2.3 距阵的压缩存储,2.1 数组,数组:相同类型数据的有序集合。是数据结构中最基本的结构类型 数组的操作:通过给定下标取出相应元素的值通过给定下标修改相应元素的值,二维数组aNM中每个单元占有L个字节,那么aij的存储位置: Loc(aij)=Loc(a00)+(i*M+j)*L 三维数组aPNM中每单元占L个字节,那么aijk的存储位置: Loc(aijk)=Loc(a000)+(i*N*M+j*M+k)*L,n维数组的 ak1k2kn 的存储位置 如何求?,2.2 数组的顺序表示与实现,数组的顺序表示 /-数组的顺序存储表示- #
2、include / 标准头文件,提供宏va_start,va_arg / 和va_end,用于存取变长参数表 #define MAX_ARRAY_DIM 8 / 假设数组维数的最大值为8 typedef struct ElemType *base; / 数组元素基址,由InitArray分配int dim; / 数组维数int *bounds; / 数组维界基址,由InitArray分配int *constants; / 数组映象函数常量基址,/ 由InitArray分配 Array; 数组的顺序实现(见书 P93),2.3 距阵的压缩存储,利用数组压缩存储矩阵,可以压缩存储的矩阵有两种: 1
3、、特殊矩阵 (1)三角矩阵 (2)对称矩阵 (3)带状矩阵 2、稀疏矩阵NM个单元中,只有T个非零元素,当T/(N M)=0.05时,就是稀疏矩阵。,距阵的压缩存储(contd),(1)三角矩阵的压缩存储 只需要将矩阵中的三角区域的数据按照顺序存放到一维数组中即可,关键的问题是确定矩阵的两个下标ij与一维数组的下标k的对应关系: 以上三角矩阵为例,Aij(j=i)前面的元素个数是: N+N-1+N-2+N-i+1=i*(2N-i+1)/2 在本行前面有j-i个元素,因此,在一维数组中,Aij的位置:k= i*(2N-i+1)/2+j-i,距阵的压缩存储(contd),(2)对称矩阵的压缩存储
4、可以采用三角矩阵的方式(3)带状矩阵的压缩存储 只需将非零元素存放在一维数组中,矩阵下标ij与一维数组下标k的对应关系: k=i*3-1+j-(i-1)=2*i+j,距阵的压缩存储(contd),(4)稀疏矩阵的压缩存储 顺序存储:三元组的顺序表 三元组(行,列,值) 数据类型定义:,#define N 500 typedef struct int i,j; /行列下标Elemtype e; /非零值Triple; typedef struct Triple dataN;int mu, nu, tu; /矩阵的行数、列数和非零值的个数Matrix;,三元组数组存放的稀疏矩阵转置算法,转置操作:
5、即将Aij改成Aji,将NM矩阵改成M N矩阵。,0 12 9 0 0 0 00 0 0 0 0 0 0 -3 0 0 0 0 14 0 0 0 24 0 0 0 00 18 0 0 0 0 0 15 0 0 -7 0 0 0,0 0 -3 0 0 15 12 0 0 0 18 09 0 0 24 0 00 0 0 0 0 -70 0 0 0 0 00 14 0 0 0 00 0 0 0 0 0,距阵的压缩存储(contd),三元组数组存放的稀疏矩阵转置算法,算法思想: (1)扫描整个三元组数组,将每个三元组的i和j互换。,0 12 9 0 0 0 00 0 0 0 0 0 0 -3 0 0
6、0 0 14 0 0 0 24 0 0 0 00 18 0 0 0 0 0 15 0 0 -7 0 0 0,0,1,12 0,2, 9 2,0,-3 2,5,14 3,2,24 4,1,18 5,0,15 5,3,-7,1,0,12 2,0, 9 0,2,-3 5,2,14 2,3,24 1,4,18 0,5,15 3,5,-7,距阵的压缩存储(contd),算法思想: (2) 原来的三元组数组是按照行序存放的,ij互换后也要调整称为行序存放的方式。这需要事先指导转置后每行非零元素的个数,也就是原矩阵每列非零元素的个数。通过单独扫描一次整个三元组数组,就可以计算得到这些数据。有了这些数据,就可
7、以确定转置后的矩阵的每行的非零元素在数组中的位置。,三元组数组存放的稀疏矩阵转置算法,0,1,12 0,2, 9 2,0,-3 2,5,14 3,2,24 4,1,18 5,0,15 5,3,-7,距阵的压缩存储(contd),三元组数组存放的稀疏矩阵转置算法,距阵的压缩存储(contd),(4)稀疏矩阵的压缩存储 十字链表:三元组的双链表,结点不但包含三元组,而且还包含两个指针,一个称为行链指针,指向下一个同行的非零元素;另一个称为列链指针,指向下一个同列的非零元素。同一个结点,同时链到行链和列链上。,3 0 0 5 0 -1 0 0 2 0 0 0,距阵的压缩存储(contd),(4) 稀疏矩阵的压缩存储 十字链表的数据类型定义:,typedef struct olnode int i,j; / 该非零元的行和列下标int e;struct olnode *right,*down; / 该非零元所在行表 和列表的后继链域Olnode, *Olnodeptr; typedef struct Olnodeptr *rhead,*chead; / 行和列链表头指针向量基 址由CreateSMatrix分配int mu,nu,tu; /稀疏距镇的行数、列数和非零元个数Crosslist;,十字链表的创建算法,十字链表的创建算法,十字链表的创建算法,数据结构 数组,