跳至主要內容

4.数组和特殊矩阵


数组的存储结构

以一维数组 A[0n1]A[0\dots n-1]为例,其存储结构关系式为

LOC(ai)=LOC(a0)+i×L(0i<n) LOC(a_{i})=LOC(a_{0})+i\times L(0\le i\text{<} n)

其中LL是每个数组元素所占的存储单元。

对于多维数组,有两种映射方法:按行优先按列优先

按行优先

设二维数组的行下标与列下标的范围分别为[0,h1][0,h_{1}][0,h2][0,h_{2}],则存储结构关系式为

LOC(ai,j)=LOC(a0,0+i×(h2+1)+j)×L LOC(a_{i,j})=LOC({a_{0,0}}+i\times(h_{2}+1)+j)\times L

image.png
image.png

按列优先

LOC(ai,j)=LOC(a0,0+j×(h1+1)+i)×L LOC(a_{i,j})=LOC({a_{0,0}}+j\times(h_{1}+1)+i)\times L

image.png
image.png

特殊矩阵的压缩存储

注意

  • 解相关题目时,要注意题目条件中给定的数组下标的信息,一般是从0开始的,部分题目中是从1开始的
  • 一般而言数组的下标默认从0开始,但是矩阵的第一个元素一般写为a1,1a_{1,1},即从1开始

对称矩阵

nn阶对阵矩阵AA存放在一维数组B[n(n+1)2]B\left[ \displaystyle\frac{n(n+1)}{2} \right]
若只存储下三角部分(含对角线)元素,则ai,ja_{i,j}在数组BB中的下标k=1+2++(i1)+j1=i(i1)2+j1k=1+2+\dots+(i-1)+j-1=\displaystyle\frac{i(i-1)}{2}+j-1(数组下标从0开始),对应关系如下

k={i(i1)2+j1ij(下三角和主对角线)j(j1)2+i1i<j(上三角ai,j=aj,i) k=\begin{cases} \displaystyle\frac{i(i-1)}{2}+j-1 &i\ge j(\text{下三角和主对角线})\\ \displaystyle\frac{j(j-1)}{2}+i-1 &i<j(\text{上三角}a_{i,j}=a_{j,i}) \end{cases}

三角矩阵

其存储思想与对称矩阵类似,不同之处在于存储完下三角区和主对角线上的元素之后,紧接着存储对角线上方的常量一次

注意

以下推导均假设数组的下标从0开始

下三角

nn阶对阵矩阵AA存放在一维数组B[n(n+1)2+1]B\left[ \displaystyle\frac{n(n+1)}{2} +1\right]中,对应关系如下

k={i(i1)2+j1ij(下三角和主对角线)n(n+1)2i<j(上三角) k=\begin{cases} \displaystyle\frac{i(i-1)}{2}+j-1 &i\ge j(\text{下三角和主对角线})\\ \displaystyle \frac{n(n+1)}{2} &i<j(\text{上三角}) \end{cases}

image.png
image.png

上三角

k={(i1)(2ni+2)2+jiij(下三角和主对角线)n(n+1)2i<j(上三角) k=\begin{cases} \displaystyle\frac{(i-1)(2n-i+2)}{2}+j-i &i\ge j(\text{下三角和主对角线})\\ \displaystyle \frac{n(n+1)}{2} &i<j(\text{上三角}) \end{cases}

image.png
image.png

三对角矩阵

  • 对角矩阵也称带状矩阵
  • 对于nn阶矩阵AA中的任意一个元素ai,ja_{i,j},当ij>1|i-j|>1时,有ai,j=0(1i,jn)a_{i,j}=0(1\le i, j\le n),则称为三对角矩阵
  • 在三对角矩阵中,所有非零元素都集中在以主对角线为中心的3条对角线的区域,其他区域的元素都为零

[a1,1a1,2a2,1a2,2a2,30a3,2a3,3a3,40an1,n2an1,n1an1,nan,n1an,n] \begin{bmatrix} a_{1,1}&a_{1,2} & & & & \\ a_{2,1}&a_{2,2} & a_{2,3} & & 0 & \\ &a_{3,2} & a_{3,3} &a_{3,4} & & \\ & & \ddots & \ddots & \ddots & \\ & 0 & a_{n-1,n-2} & a_{n-1,n-1} &a_{n-1,n} & \\ & & & a_{n,n-1} & a_{n,n} & \end{bmatrix}

将3条对角线上的元素按行优先方式存放在一维数组BB中,且a1,1a_{1,1}存放于B[0]B[0]中,则ai,j(1i,jn,ij1)a_{i,j}(1\le i,j\le n,|i-j|\le 1)对应下标k=2i+j3k=2i+j-3

提示

  • 解题时一般是根据题目所给条件现场推导
  • 记住各种矩阵的存储方式直接推导
  • 上三角第一行n个元素,第二行n-1个...,第一列1个,第二列2个...;下三角第一行1一个,第二行2个...,第一列n个,第二列n-1个...,三对角矩阵除了第一行和最后一行是2个其他的行都是3个
  • 例如nn阶下三角矩阵AA按列优先顺序,元素ai,ja_{i,j}之前有j1j-1列,共有n+(n1)++(nj+2)=(j1)(2nj+2)/2n+(n-1)+\dots+(n-j+2)=(j-1)(2n-j+2)/2 个元素,元素ai,ja_{i,j}是第jj列上第ij+1i-j+1个元素,数组BB下标从1开始,k=(j1)(2nj+2)/2+ij+1k=(j-1)(2n-j+2)/2+i-j+1

稀疏矩阵

  • 矩阵中非零元素的个数tt,相对矩阵元素的个数ss来说非常少,即sts\gg t的矩阵称为稀疏矩阵
  • 非零元素及其相应的行和列构成一个三元组(行标,列标,值),然后按照某种规律存储这些三元组
  • 稀疏矩阵压缩存储后便失去了随机存取特性
  • 三元组可采用数组存储,也可以采用十字链表法存储