目录
数组的概念
按一定格式排列起来的,具有相同类型的数据元素的集合。
一维数组
若线性表中的数据元素为非结构的简单元素,则称为一维数组。
一维数组的逻辑结构
线性结构。定长的线性表。
声明格式
数据类型 变量名称[长度];
例:int num[5] = {0, 1, 2, 3, 4};
二维数组
若一维数组中的数据元素又是一维数组结构,则称为二维数组。
二维数组的逻辑结构
非线性结构:每一个数据元素即在一个行表中,又在一个列表中。
线性结构-定长的线性表:该线性表的每个数据元素也是一个定长的线性表。
声明格式
数据类型 变量名称[行数][列数];
例:int num[5][8];
在C语言中,一个二维数组类型也可以定义为一维数组类型(其分量类型为一维数组类型),即:
typedef elemtype array2[m][n];
等价于
typedef elemtype array1[n];
typedef array1 array2[m];
三维数组
若二维数组中的元素又是一个一维数组,则称作三维数组。
n维数组:若n-1维数组中的元素又是一个一维数组结构,则称作n维数组。
结论
线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。
数组特点
结构固定——定义后,维数和维界不再改变。
数组的抽象数据类型定义
除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。
数组的顺序存储
二维数组的行序优先表示
以行序为主序:
设数组开始存储位置LOC(0, 0),存储每个元素需要L个存储单元,数组元素a[i][j]的存储位置是:LOC(i, j) = LOC(0, 0) + (n*i + j) * L。
其中 (n*i + j)表示在a[i][j]前面所有元素个数。
三维数组的元素存储位置
a[m1][m2][m3] 各维元素个数为m1,m2,m3
下标为i1, i2, i3 的数组元素的存储位置:
LOC(i1, i2, i3) = a + i1*m2*m3 + i2*m3 + i3
其中:i1*m2*m3表示前i1页总元素个数;i2*m3表示第i1页的前i2行总元素个数;i3表示第i2行前i3列元素个数。
n维数组的元素存储位置
n维数组 A[0.. b1-1, 0 .. b2-1, …,0 .. bn-1]的数据元素存储位置的计算公式:
可缩写为:
其中,Cn = L, Ci-1 = bi * Ci, 1 <i≤n
例如
设有一个二维数组A[m][n]按行优先顺序存储,假设A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?(脚注(10)表示用10进制表示)
特殊矩阵的压缩存储
概念
矩阵:一个由m * n 个元素排成的m行n列的表。
矩阵的常规存储:将矩阵描述为一个二维数组。
矩阵的常规存储的特点:可以对其元素进行随机存取;矩阵运算非常简单;存储的密度为1。
不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多。
矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。
什么是压缩存储
若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。
什么样的矩阵能够压缩
一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。
什么叫稀疏矩阵
矩阵中非零元素的个数较少(一般小于5%)。
对称矩阵
特点
在n*n的矩阵a中,满足如下性质:
aij = aji (1 ≤ i,j ≤ n)
存储方法
只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。
对称矩阵的存储结构
对称矩阵上下三角中的元素数均为:n(n+1)/2,可以以行序为主序将元素存放在一个一维数组sa[n(n+1)/2]中。
例如:以行序为主序存储下三角:
三角矩阵
特点
对角线一下(或者以上)的数据元素(不包括对角线)全部为常数c。
存储方法
重复元素c共享一个元素存储空间,共占用n(n+1)/2+1个元素空间:sa[1.. n(n+1)/2 + 1]。
对角矩阵(带状矩阵)
特点
在n*n的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。常见的有三对角矩阵、五对角矩阵、七对角矩阵等。
下图是一个7*7的三对角矩阵:
存储方法
使用二维数组存储,以对角线顺序存储
稀疏矩阵
设在m*n的矩阵中有t个非零元素,
令 δ = t/(m*n)
当δ ≤0.05时称为稀疏矩阵。
三元组顺序表
三元组(i, j, aij)唯一确定矩阵的一个非零元。
存各非零元的值、行列位置和矩阵的行列数。
三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。
注意:为更可靠描述,通常在0位置再加一个“总体”信息:即总行数、总列数、非零元素总个数。
例
对于下面用三元组表示的稀疏矩阵,请分别写出它们所对应的稀疏矩阵。
从三元组表还原稀疏矩阵时,首先根据表的第1行得出稀疏矩阵的行数和列数,否则,我们无法确定所求的稀疏矩阵的维数,然后根据三元组表所提供的行号和列号在稀疏矩阵的对应位置上写上相应的元素的值,在其他地方补零即可,根据上述原则,此题答案如图(1),(2)所示。
三元组顺序表优缺点
三元组顺序表又称有序的双下标法。
三元组顺序表的优点:非零元在表中按行序存储,因此便于进行依次顺序处理的矩阵运算。
三元组顺序表的缺点:不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。
十字链表
优点:它能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。
· 在十字链表中,矩阵的每一个非零元素用一个结点表示,该结点除了(row, col, value)以外,还要有两个域:
right:用于链接同一行中的下一个非零元素;
down:用以链接同一列中的下一个非零元素。
十字链表中结点的结构示意图