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