数组
数组是相同数据类型的元素按照一定顺序排列的集合。
一维数组的存储
一维数组的实质就是线性表,存储方法同顺序表。假设一维数组A = (A1, A2, A3, …, Ai,…, An),每个元素占L个存储单元,则元素A[i]的存储地址为
LOC(A[i]) = LOC(A[1]) + (i - 1)* L
二维数组的存储
二维数组可以有两种存储方式,行序主序和列序主序。
假设二维数组为A(m*n),每个元素占L个存储单元,则元素A[i][j]的存储地址如下。
-
按行存储
LOC(A[i][j]) = LOC(A[1][1]) + (n*(i - 1)+(j - 1))*L; -
按列存储
LOC(A[i][j]) = LOC(A[1][1]) + (m*(j - 1)+(i - 1))*L;
三维数组的存储
假设三维数组A(rmn),每个元素占L个存储单元,则元素A[i][j][k]的存储地址为
LOC(A[i][j][k]) = LOC(A[1][1][1]) + ((i - 1)*m *n + (j - 1)*n + (k - 1)) * L
特殊矩阵
三角矩阵
三角矩阵分为上三角矩阵和下三角矩阵。
上三角矩阵:指矩阵的主对角线(不包括对角线)下方的元素均为0或常数c。上三角矩阵共有n(n+1)/2个元素。
上三角矩阵在一维数组中按行序为主序的存储地址为:
LOC(A[i][j] = LOC(A[1][1]) + 前i-1行非零元素 + 第i行中A[i][j]前非零元素 = LOC(A[1][1]) + (2n-i+2)*(i-1)/2 + (j - i)。
下三角矩阵在一维数组中按行序为主序的存储地址为:
LOC(A[i][j]) = LOC(A[1][1]) + 前i-1行非0元素 + 第i行中A[i][j]前非零元素 = LOC(A[1][1]) + i *(i - 1)/2 + (j - 1) 。
对角矩阵
对角矩阵是指矩阵中所有有效元素均集中在以主对角线为中心的带状区域中。
三对角矩阵
三对角矩阵是指三条对角线以外的元素均为零或者常数,且第一行和最后一行只有两个有效元素,其他行均有三个非零元素。
三对角矩阵,元素A[i][j]在一维数组中按行序为主序的存储地址为:
LOC(A[i][j]) = LOC(A[1][1]) + 3*(i - 1) - 1 + (j - i + 1)
稀疏矩阵
矩阵中只有极少的非零元素,而且分布也不规律,如果非零元素个数只占矩阵元素总数的25%~30%或低于这个百分数时,这样的矩阵称为稀疏矩阵。
系数矩阵的压缩存储一般有两类:三元组顺序表(顺序结构)和十字链表(链式结构)。
三元组顺序表
以顺序存储结构来表示三元组表,成为系数矩阵的三元组顺序表。对于稀疏矩阵的非零元素来说,行号、列号以及元素值三项值可以唯一地确认该元素。三元组顺序表中的三元恰好反映了这三项值。(row, col, value)
在顺序表中,除了储存表示元素的三元组外,还应该存储稀疏矩阵的行数、列数、以及非零元素的个数。
十字链表
当矩阵的非零元素个数和位置在操作过程中的变化较大时,就不太适宜采用顺序存储结构来存储稀疏矩阵。此时,采用链式存储结构来表示则更为恰当。
在链表中,每个非零元素由一个结点来表示。结点结构如下:
在这个结点中,一共有5个域,其中row表示非零元素的行,col:非零元素的列,value:非零元素的值。down用来链接同一列中的下一个元素,up用来链接同一行中的下一个元素。
广义表
线性表要求它的每个元素必须是结构上不可再分的单个元素,而广义表中的数据元素可以是单个元素,也可以又是一个广义表。
广义表是n(n>=0)个元素的有限序列,记作LS=(d1, d2, …, dn)。
其中:di可以为原子项,也可以为广义表,n为广义表的长度。
原子: 是作为结构上不可分割的成分,它可以是一个数或一个结构。
子表: 若广义表LS中的某一个元素di本身也是一个广义表,则称di为广义表LS的子表。
长度: 广义表LS中元素的个数为LS的长度(Length)。
空表: 表内没有元素,长度为0的广义表称为空表。
表头与表尾: LS不为空时,称d1为表头,称其余元素组成的子表为表尾。显然,广义表的表尾一定是广义表,但表头不一定。
深度: 广义表LS的深度Depth(LS)相当于广义表中表达式括号的最大嵌套层数。
递归表: 广义表LS中某元素包含其自身,则称LS为递归表。