# 数组 ## 数组的定义 数组是由同类型的数据元素构成的有序集合,每个元素是数组元素,每个元素受$n$个线性关系的约束。其中每个元素在$n$个线性关系中的序号就是元素的下标,可以通过下标来访问元素。 数组是对线性表的推广。 数组一旦被定义其维数和维界就不能改变,所以数组只能对结构的初始化和销毁,以及元素的存取和修改。 ## 数组的存储结构 ### 一维数组 各数组元素大小相同,且物理上连续存放。 数组元素$a[i]$的存放地址=起始地址$LOC+i\times sizeof(ElemType)$。数组下标从$0$开始。 ### 二维数组 二维数组存储方式还是同一维数组一样连续的。 + 行优先:一行一行存储。 + 列优先:一列一列存储。 已知二维数组$b[M][N]$。 若按行存储,$b[i][j]$的存储地址=起始地址$LOC+(i\times N+j)\times sizeof(ElemType)$。 ### 十字链表法 每个结点中包含行数、列数、元素值,以及两个指针,向下域指针$down$指向同第$j$列的下一个个元素,向右域指针$right$指向同第i行的下一个元素。 ## 特殊数组的压缩 压缩存储指为多个值相同的元素只分配一个存储空间从而节省存储空间。 特殊矩阵是指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律的矩阵。 若是索引都从$1$开始,则公式不发生改变。 ### 对称矩阵 若对一个$n$阶方阵$A[0,n-1][0,n-1]$中的任意一个元素$a_{ij}$都有$a_{ij}=a_{ji}$,即主对角线对称元素相等的矩阵,就是对称矩阵。 其中元素可以分为上三角区域、主对角线和下三角区域,上下三角区域元素相等。所以可以将$A$存放在一维数组$B[n(n+1)\div2]$中,从而$a_{ij}=b_k$,只存放下三角部分与主对角线部分元素。从而$a_{ij}$对应的$k=1+2+\cdots+(i-1)+j-1=\dfrac{i(i-1)}{2}+j-1$。 + 当$i\geqslant j$时,即下三角区域与主对角线元素:$k=\dfrac{i(i-1)}{2}+j-1$。 + 当$ij$时,即下三角区域:$k=\dfrac{n(n-1)}{2}$。 #### 三对角矩阵 对角矩阵也称为带状矩阵。对于$n$阶方阵$A$的任意元素$a_{ij}$,当$\vert i-j\vert>1$时,有$a_{ij}=0$,则是三对角矩阵。 三对角矩阵除了以主对角线为中心的十三条对角线的区域上的元素并不是完全为零外,其他元素都是零。 所以可以将三条对角线上的元素行优先地存储在一维数组中,$k=2i+j-3$,同样$i=\lfloor\dfrac{k+1}{3}+1\rfloor$,$j=k-2i+3$。 #### 稀疏矩阵 若矩阵中非零元素很少,这个矩阵就是稀疏矩阵,若使用普通一维数组存储则十分浪费空间,所以一般只存储非零元素。 所以可以构成三元组(行标,列标,值)来存储。可以使用数组来存储也可以使用之前的十字链表法来存储。 稀疏矩阵压缩后就失去了随机存取的特性。