数组

知识框架


数据结构复习 --- 数组_存储结构


数组的概念

从逻辑结构上来说,一维数组A是 n 个相同数据类型元素 a1,a2… an 构成的有限数列。

数组的存储结构

在设计数组的存储结构时,通常将所有元素存储到存储器的一块连续的内存单元中,机数组比较适合采用顺序存储结构来存储。

1. 一维数组的存储结构

假设第一个元素 a1的存储地址用LOC(a1)表示,每个元素占用 k个存储单元,则任意数组元素ai

存储地址LOC(ai) 可以用下面的公式计算 :
数据结构复习 --- 数组_存储结构_02

2. 二维数组的存储结构

对于一个 m 行 n 列的二维数组 Amxn:


数据结构复习 --- 数组_数组_03

  1. 二维数组按行优先存放

二维数组按行优先,即先存储第1行,紧接着存储第2行 … 以此类推,最后存储第m 行。

数据结构复习 --- 数组_二维数组_04

Anxn假设第一个元素 a1,1的存储地址用 LOC(a1,1)表示,每个元素占用k 个存储单元,则该二维数组中的任一元素ai,j的存储地址可以用下面公式计算 :

  • 数组是从a1,1开始的

数据结构复习 --- 数组_二维数组_05

  • 数组是从a0,0开始的

数据结构复习 --- 数组_数组_06

  1. 二维数组按列优先存放

原理同按行存放,这里不再累赘。

  • 数组是从a1,1开始的

数据结构复习 --- 数组_二维数组_07

  • 数组是从a0,0开始的

数据结构复习 --- 数组_存储结构_08

PS(这些公式最好还是不用死记,还是要学会推,看清数组是从a0,0开始还是a1,1)

3. 三维数组

暂时填坑 …


特殊矩阵的压缩

1. 对称矩阵

若对于n 阶矩阵A中的元满足
数据结构复习 --- 数组_数组_09
则称为 n阶对称矩阵。


数据结构复习 --- 数组_存储结构_10

对于对称矩阵我们可以将 n

2 个元压缩存储到 n(n+1)/2 个元的空间中, 只需要存储主对角线和 上下三角中的一个即可。

1. 以行序为主序存储下三角(包括对角线)

假设以 一维数组 sa[n * (n+1)/2] 作为 n 阶对称矩阵A的存储结构,则sa[k] 和矩阵元aij之间存在着一一对应的关系:

当数组下标为0时,
数据结构复习 --- 数组_存储结构_11
当数组下标为1时,
数据结构复习 --- 数组_二维数组_12

推导过程(数组下标为0): aij

第 一行 : 1 个元素

第二行 : 2 个元素

第三行 : 3 个元素

第i - 1 行 : i - 1 个元素

第i 行 : 有 j - 1个元素 .

所以元素aij在数组B中下标为 k = 1+2 + … (i-1) + j-1 ;

2. 上、下三角矩阵的压缩存储

三角矩阵分为​​上三角矩阵​​​和​​下三角矩阵​​。

上三角矩阵是指矩阵的下三角部分种的元素均为常数c的n矩阵。

上三角矩阵压缩方法采用以行序为主序存储其主对角线加上三角部分的元素,另外用一个元素存储常数c并将压缩结果存储在一维数组B中。

  1. 上三角 :

数据结构复习 --- 数组_存储结构_13
下三角矩阵是指矩阵的上三角部分种的元素均为常数c的n矩阵。

  1. 下三角 :

数据结构复习 --- 数组_数组_14

  1. 对角矩阵
    若一个 n 阶方阵A 满足所有非零元素都集中在以主对角线为中心的带状区域,则称其为 n阶 ​​对角矩阵​​。
    以三对角矩阵为例
    将三对角矩阵A也可以采用压缩存储,将3条对角线上的元素​​按行优先​​存放在数组B中。
    由此可以计算矩阵A中3条对角线上的元素ai,j在一维数组B中存放的下标 k = 2i +j -3 。
    比如 a2,3放在 2*2+3-3 = 4 位置。
    反之我们知道数组B中位置 k 的元素,也能推算出 在A数组的位置,

数据结构复习 --- 数组_数组_15

​例题​​ 若将 n 阶上三角矩阵 A 按列优先压缩存放在一维数组B[1…n(n+1)/2+1] 中,则存放到 B[k] 中的非零元素ai,j的下标i,j,k 的关系 : j(j-1) /2 + i-1 +1 = j (j-1) /2 +i 。