数据结构(Java版) - 数组

230 阅读2分钟

Github仓库: JavaDataStructure: Java 版数据结构 (github.com)

2. 数组

2.1 数组的顺序存储

由于存储单元是一维结构,而数组可能是多维结构的,则用一组连续存储单元存放数组的数据元素就有次序约定问题。

二维数组的可有两种存储方式:一种以行序为主序的存储方式;一种以列序为主序的存储方式。

行序为主序。假设每个元素占 LL 个存储单元,则二维数组 A[0..m1,0..n1]A[0..m-1,0..n-1] (即下标从0开始,共有 m 行 n 列)中任一元素 ai,ja_{i,j} 的存储位置可由下式确定:

LOC(i,j)=LOC(0,0)+(n×i+j) LOC(i,j) = LOC(0,0)+(n \times i + j)

列序为主序。假设每个元素占 LL 个存储单元,则二维数组 A[0..m1,0..n1]A[0..m-1,0..n-1] (即下标从0开始,共有 m 行 n 列)中任一元素 ai,ja_{i,j} 的存储位置可由下式确定:

LOC(i,j)=LOC(0,0)+(m×j+i) LOC(i,j) = LOC(0,0)+(m \times j + i)

2.2 特殊矩阵的压缩存储

2.2.1 对称矩阵

对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。必须是n 阶方阵

对于对称矩阵,可以为每一对对称元分配一个存储空间,则可将 n2n^2 个元压缩存储到 n(n+1)2\frac{n(n+1)}{2} 个元的空间中。

假设以一维数组 sa[n(n+1)2]sa[\frac{n(n+1)}{2}] 作为 nn 阶对称矩阵 AA 的存储结构,则 sa[k]sa[k] 和矩阵元 ai,ja_{i,j} 之间存在着一一对应的关系:

k={i(i1)2+j1 当 ij j(j1)2+i1 当 i<jk = \left\{ \begin{aligned} \frac{i(i-1)}{2}+j-1 \ 当\ i\geq j \\\ \frac{j(j-1)}{2}+i-1 \ 当\ i < j \end{aligned} \right.

例子:

[a11a12a1na21a22a2na31a32a3nan1an2ann]\left[\begin{array}{c} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ a_{31} & a_{32} & \dots & a_{3n} \\ \dots \\ a_{n1} & a_{n2} & \dots & a_{nn} \\ \end{array}\right]

数据结构=数组.png

[124235456][a11a12a13a21a22a23a31a32a33]\left[ \begin{array}{c} 1 & 2 & 4 \\ 2 & 3 & 5 \\ 4 & 5 & 6 \end{array} \right] \rightarrow \left[ \begin{array}{c} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array} \right]

2.2.2 三角矩阵

上三角矩阵

上三角矩阵是指矩阵下三角(不包括对角线)中的元均为常数 cc 或零的 nn 阶矩阵。sa[k]sa[k] (从0开始)和矩阵元 ai,ja_{i,j} (从0开始)之间的对应关系为

k={(n1i)(1+n1i)2+ji 当 ij n(n+1)2 当 i>jk = \left\{ \begin{aligned} \frac{(n-1-i)(1+n-1-i)}{2}+j-i \ 当\ i\leq j \\\ \frac{n(n+1)}{2} \ 当\ i \gt j \end{aligned} \right.

下三角矩阵

下三角矩阵是指矩阵上三角(不包括对角线)中的元均为常数 cc 或零的 nn 阶矩阵。sa[k]sa[k] 和矩阵元 ai,ja_{i,j} 之间的对应关系为

k={i(i1)2+j1 当 ij n(n+1)2 当 i<jk = \left\{ \begin{aligned} \frac{i(i-1)}{2}+j-1 \ 当\ i\ge j \\\ \frac{n(n+1)}{2} \ 当\ i \lt j \end{aligned} \right.

证明

[100012001230123n]123n\left[\begin{array}{c} 1 & 0 & 0 & \dots & 0 \\ 1 & 2 & 0 & \dots & 0 \\ 1 & 2 & 3 & \dots & 0 \\ \dots \\ 1 & 2 & 3 & \dots & n \\ \end{array}\right] \rightarrow \begin{array}{c} 1 \\ 2 \\ 3 \\ \dots \\ n \end{array}

根据每行的非零元素个数,可得 a1=1a2=2a3=3an=na_1=1,a_2=2,a_3=3,\dots,a_{n}=n

iji \ge j 时,aija_{ij} (下标元素从1开始)的位置为:

ii 之前一共有 i1i-1 行,可知 a1=1a_1=1ai1=i1a_{i-1}=i-1,根据等差求和公式可求得前面行数共有多少个元素,公式如下所示:

Sn=n(a1+an)2=(i1)(1+i1)2=i(i1)2S_n = \frac{n(a_1+a_n)}{2}=\frac{(i-1)(1+i-1)}{2}=\frac{i(i-1)}{2}

可得公式为:aij=i(i1)2+j1a_{ij} = \frac{i(i-1)}{2} + j-1