一、数组存储地址计算
-
行主序优先存储
公式:Loc(a_ij) = Loc(a_11) + [(i-1)×n + (j-1)]×L
说明:在按行优先存储的二维数组中,元素a_ij的地址由以下几部分构成:- 起始地址
Loc(a_11) - 前
i-1行所占的元素个数(每行有n列) - 当前行前
j-1个元素 - 每个元素占用
L个存储单元
- 起始地址
-
列主序优先存储
公式:Loc(a_ij) = Loc(a_11) + [(j-1)×m + (i-1)]×L
说明:在按列优先存储时,先依次存放每一列。因此:- 前
j-1列共包含(j-1)×m个元素(每列有m行) - 第
j列中前i-1行的元素 - 同样乘以每个元素大小
L得到偏移量
- 前
二、特殊矩阵的压缩存储
-
对称矩阵
定义:满足a_ij = a_ji的 n 阶方阵。
压缩方式:只存储下三角(包括对角线)部分,共需存储n(n+1)/2个元素。
映射公式(映射到一维数组B[k]):- 若
i ≥ j(下三角或对角线):k = i(i-1)/2 + j - 若
i < j(上三角):利用对称性转换为a_ji,即k = j(j-1)/2 + i
- 若
-
对角矩阵
定义:非零元素仅分布在主对角线附近的一个带状区域内(如三对角矩阵)。
压缩方式:仅存储带状区域内的元素。例如三对角矩阵每行最多3个非零元,总存储量约为3n - 2。
映射方法(以三对角为例):将第i行的三个元素分别对应到一维数组中的特定位置,常用公式为:k = 2(i-1) + (j-i+1) - 1 = 2i + j - 4(具体依编号方式而定)
补充说明:
这些内容属于数据结构中多维数组实现与优化的核心知识,尤其在科学计算、稀疏数据处理和大型矩阵操作中具有重要意义。掌握地址映射关系有助于理解底层内存布局,提升程序效率。
行主序(Row-major Order)和列主序(Column-major Order)是两种不同的二维数组在内存中存储的顺序方式,它们导致了地址计算公式的差异。下面我们从存储逻辑出发,逐步推导并解释这两种公式为何不同。
1. 基本设定
设有一个 m × n 的二维数组(即 m 行 n 列),每个元素占用 L 个存储单元,起始地址为 Loc(a_11),我们要计算元素 a_ij(第 i 行第 j 列)的存储地址。
2. 行主序优先存储(Row-major Order)
存储顺序:
- 先存第1行的所有元素:a₁₁, a₁₂, …, a₁ₙ
- 再存第2行的所有元素:a₂₁, a₂₂, …, a₂ₙ
- …
- 最后存第i行
推导过程:
要找到 a_ij 的位置,需统计在它之前已经存储了多少个元素:
- 前
i-1行,每行有n个元素 → 共(i-1) × n个元素 - 当前行(第 i 行)前有
j-1个元素 - 总共前面有:
(i-1)×n + (j-1)个元素 - 每个元素占
L字节 → 偏移量为[(i-1)×n + (j-1)] × L
✅ 所以地址公式为:
Loc(a_ij) = Loc(a_11) + [(i-1)×n + (j-1)] × L
3. 列主序优先存储(Column-major Order)
存储顺序:
- 先存第1列的所有元素:a₁₁, a₂₁, …, aₘ₁
- 再存第2列的所有元素:a₁₂, a₂₂, …, aₘ₂
- …
- 最后存第j列
推导过程:
同样地,找 a_ij 之前的元素总数:
- 前
j-1列,每列有m个元素 → 共(j-1) × m个元素 - 当前列(第 j 列)前有
i-1个元素(上面 i-1 行) - 总共前面有:
(j-1)×m + (i-1)个元素 - 偏移量为:
[(j-1)×m + (i-1)] × L
✅ 所以地址公式为:
Loc(a_ij) = Loc(a_11) + [(j-1)×m + (i-1)] × L
4. 核心差异对比
| 项目 | 行主序(Row-major) | 列主序(Column-major) |
|---|---|---|
| 存储单位 | 整行连续存放 | 整列连续存放 |
| 主变化维度 | 行在外层循环,列在内层 | 列在外层循环,行在内层 |
| 地址偏移基础 | 按“跳过多少行”计算 | 按“跳过多少列”计算 |
| 公式结构 | (i-1)*n + (j-1) | (j-1)*m + (i-1) |
🔍 关键点:谁是外层循环,谁就决定“大块”的排列方式。
- 行主序:行是“大块”,所以先乘行数相关项
- 列主序:列是“大块”,所以先乘列数相关项
5. 举例验证
假设一个 3×4 数组(3行4列),L=1,Loc(a₁₁)=0
求 a₂₃ 的地址:
-
行主序:
Loc = 0 + [(2-1)*4 + (3-1)] = 4 + 2 = 6 -
列主序:
Loc = 0 + [(3-1)*3 + (2-1)] = 6 + 1 = 7
说明同一元素在不同存储方式下地址不同,体现了存储顺序的影响。
✅ 结论:
行主序与列主序地址公式之所以不同,根本原因在于数据在内存中的物理排列顺序不同:
- 行主序按“行”为单位连续存放 → 地址增长依赖于列宽
n - 列主序按“列”为单位连续存放 → 地址增长依赖于行高
m
这种差异直接影响程序访问效率(局部性原理)、语言设计(如C用行主序,Fortran用列主序)以及算法性能优化。


662

被折叠的 条评论
为什么被折叠?



