数据结构中多维数组实现与优化的核心知识,尤其在科学计算、稀疏数据处理和大型矩阵操作中具有重要意义

一、数组存储地址计算

  1. 行主序优先存储
    公式:Loc(a_ij) = Loc(a_11) + [(i-1)×n + (j-1)]×L
    说明:在按行优先存储的二维数组中,元素 a_ij 的地址由以下几部分构成:

    • 起始地址 Loc(a_11)
    • i-1 行所占的元素个数(每行有 n 列)
    • 当前行前 j-1 个元素
    • 每个元素占用 L 个存储单元
  2. 列主序优先存储
    公式:Loc(a_ij) = Loc(a_11) + [(j-1)×m + (i-1)]×L
    说明:在按列优先存储时,先依次存放每一列。因此:

    • j-1 列共包含 (j-1)×m 个元素(每列有 m 行)
    • j 列中前 i-1 行的元素
    • 同样乘以每个元素大小 L 得到偏移量

二、特殊矩阵的压缩存储

  1. 对称矩阵
    定义:满足 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
  2. 对角矩阵
    定义:非零元素仅分布在主对角线附近的一个带状区域内(如三对角矩阵)。
    压缩方式:仅存储带状区域内的元素。例如三对角矩阵每行最多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用列主序)以及算法性能优化。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值